1

可能重复:
C 中的 char s[] 和 char *s 有什么区别?
关于C中指针和字符串的问题

我正在阅读 C 中的字符串,我很困惑。我可以通过两种方式“声明”字符串:

char *str = "This is string";
char str2[20] = "This is string"; 

这两个声明有什么区别?什么时候会char str2[20]优先char *str

4

5 回答 5

2

在 C 中,字符串表示为chars 的序列,带有一个 NULL 字符(又名 0, '\0')。它们存储在内存中,您可以使用一种引用它的方式。您已经确定了引用它的两种方式,achar *是指向序列的指针chars和数组,它是作为实际变量的字符的立即字符串。请注意,字符串“abc”的长度为4个字节,因为有一个额外的 NULL 字符来表示字符串的结尾。

除此之外,您实际上是在示例中分配字符串,这还涉及在编译时给出的字符串。

所以两个问题。首先是关于如何表示字符串(char *vs char[]),其次是关于编译时字符串。

举个例子:

一个在程序的文本中创建一个常量字符串和一个指向它的指针。根据编译器,它可能存储在任何地方。它相当于mallocing一个字符串并存储一个指向它的指针,除非您不能更改内存的内容。它是 a char *,因此您可以将指针更改为指向其他位置,例如另一个malloced字符串或指向您在示例 2 中定义的数组的开头。

第二个创建一个 char 数组(这是一种表示字符串的方式)。数组在函数执行期间存储并分配在堆栈上,您可以更改内容。因为它不是指针,所以不能将其更改为指向不同的字符串。

于 2012-08-25T12:02:44.273 回答
1
char *str = "This is string";

将字符串放入constant data section (also known as .rdata)程序中。此数据不能修改。

char str2[20] = "This is string";

在这种类型的声明中,数据最好stored in the stack area是程序的,如果在里面声明,如果在里面function scope声明data sectionglobal scope这个数据是可以修改的。

因此,如果您有必要修改数据,请使用第二种方法。

于 2012-08-25T12:17:20.823 回答
0

char *str = "This is string";- 这会将文本段中的字符串保留为只读数据,并将地址存储在本地指针变量str中。

str[0] = 'a'; //This will leads to crash, because strings are in read only segment.
printf("%d",sizeof(str)); //This will print 4(in 32bit m/c) or 8(in 64 bit m/c)

char str2[20] = "This is string";- 这会将字符串作为字符数组保存在本地堆栈中。

str2[0] = 'a'; //This will change the first character to a
printf("%d",sizeof(str2)); //This will print 20
于 2012-08-25T13:27:29.850 回答
0

C 没有字符串。所有的都是char数组。C 中的数组只是指向第一个元素的指针。

最简单的方法实际上是您的第一个变体。不为文字指定数组的显式长度将使您免于意外地执行类似的操作

char[3] = "abc";
于 2012-08-25T12:03:31.590 回答
0

C 字符串在内存中是常量,因此:

char *str = "This is string";

将“This is string”存储在内存中并且它是不可变的,您只能为 str 分配另一个地址。

然而

char str2[20] = "This si string"; 

是的简写

char String2[20]={'T','h','i','s',' ','s','i',' ','s','t','r','i','n','g','\0'};

它不在内存中存储字符串,而是存储独立的字节。

如果你想使用像消息这样的常量字符串,那么使用第一行。如果您想像在文字处理器中那样使用和操作字符串,请使用第二个。

问候

于 2012-08-25T12:17:14.927 回答