char * str =“…”和char str =“……”之间的区别?

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

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

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

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

 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 section声明,如果在global scope声明。可以修改此数据。

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

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

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

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

来你的例子:

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

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

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

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

 char[3] = "abc"; 

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'}; 

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

如果要使用常量字符串(如消息),请使用第一行。 如果你想在文字处理器中使用和操作字符串,那么使用秒。

问候

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