这两个在C语言中有何不同?
char str[] = "xyz"; // statement 1
//and
char str[4] = "xyz"; // statement 2
根据我的理解,第一个为字符串文字分配一个指针,而第二个为4个字符(包括NULL
字符)的字符数组。
但是如果是这种情况,这两个如何存储在内存中?
char str[] = "xyz";
将str
声明为char
的4元素数组,并将字符串文字的内容复制到其中:
+---+---+---+---+
str: |'x'|'y'|'z'| 0 |
+---+---+---+---+
在这种情况下,数组的大小取自初始化程序的大小(3个字符加字符串终止符)。
char str[4] = "xyz";
完全相同,只是明确指定了大小。
在两种情况下,str
的内容都是可写的,您可以像这样修改字符串的字符:
str[0] = 'X';
str[1] = 'Y';
...
字符串的最大长度是固定的,但是-您只能在str
中存储最长3个字符(包括0终止符)的字符串。
如果您已声明
char *str = "xyz";
然后str
将是字符串literal的第一个元素的pointer,如下所示:
+---+ +---+---+---+---+
str:| | ---> |'x'|'y'|'z'| 0 |
+---+ +---+---+---+---+
所有str
存储是字符串的第一个字符的地址。在这种情况下,尝试修改字符串中的任何字符都会导致undefined behavior。字符串文字是supposed是不可变的,但不一定存储在只读存储器中。代码类似
str[0] = 'X';
may正常工作,或者may导致运行时错误,或者may根本不执行任何操作。
为了安全起见,应将指向字符串文字的指针声明为const char *
:
const char *str = "xyz";
这样,如果您写类似的东西
str[i] = 'X';
编译器会为此大吼大叫,因此您不必等到运行时才发现错误。