char * str =“...”和char str [N] =“......”之间的区别?

时间:2012-08-25 12:00:30

标签: c string c-strings

  

可能重复:
  What is the difference between char s[] and char *s in C?
  Question about pointers and strings in C

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

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

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

5 个答案:

答案 0 :(得分:2)

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

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

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

来看你的例子:

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

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

答案 1 :(得分: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 section。此数据可以修改

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

答案 2 :(得分:0)

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

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

的操作
char[3] = "abc";

答案 3 :(得分: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'};

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

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

此致

答案 4 :(得分: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