我正在阅读 C 中的字符串,我很困惑。我可以通过两种方式“声明”字符串:
char *str = "This is string";
char str2[20] = "This is string";
这两个声明有什么区别?什么时候会char str2[20]
优先char *str
?
我正在阅读 C 中的字符串,我很困惑。我可以通过两种方式“声明”字符串:
char *str = "This is string";
char str2[20] = "This is string";
这两个声明有什么区别?什么时候会char str2[20]
优先char *str
?
在 C 中,字符串表示为char
s 的序列,带有一个 NULL 字符(又名 0, '\0'
)。它们存储在内存中,您可以使用一种引用它的方式。您已经确定了引用它的两种方式,achar *
是指向序列的指针chars
和数组,它是作为实际变量的字符的立即字符串。请注意,字符串“abc”的长度为4个字节,因为有一个额外的 NULL 字符来表示字符串的结尾。
除此之外,您实际上是在示例中分配字符串,这还涉及在编译时给出的字符串。
所以两个问题。首先是关于如何表示字符串(char *
vs char[]
),其次是关于编译时字符串。
举个例子:
第一个在程序的文本中创建一个常量字符串和一个指向它的指针。根据编译器,它可能存储在任何地方。它相当于mallocing
一个字符串并存储一个指向它的指针,除非您不能更改内存的内容。它是 a char *
,因此您可以将指针更改为指向其他位置,例如另一个malloced
字符串或指向您在示例 2 中定义的数组的开头。
第二个创建一个 char 数组(这是一种表示字符串的方式)。数组在函数执行期间存储并分配在堆栈上,您可以更改内容。因为它不是指针,所以不能将其更改为指向不同的字符串。
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
这个数据是可以修改的。
因此,如果您有必要修改数据,请使用第二种方法。
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
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'};
它不在内存中存储字符串,而是存储独立的字节。
如果你想使用像消息这样的常量字符串,那么使用第一行。如果您想像在文字处理器中那样使用和操作字符串,请使用第二个。
问候