可能重复:
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
?
答案 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