考虑以下代码:
char name[]="123";
char name1[]="1234";
Run Code Online (Sandbox Code Playgroud)
而这个结果
The size of name (char[]):4
The size of name1 (char[]):5
Run Code Online (Sandbox Code Playgroud)
为什么大小char[]总是加一?
Wea*_*ane 14
注意之间的差异sizeof和strlen.第一个是运算符,它给出整个数据项的大小.第二个是一个返回字符串长度的函数,它将小于它的长度sizeof(除非你设法得到字符串溢出),这取决于它实际使用了多少分配的空间.
在你的例子中
char name[]="123";
Run Code Online (Sandbox Code Playgroud)
sizeof(name)是4,因为终止'\0',并且strlen(name)是3.
但在这个例子中:
char str[20] = "abc";
Run Code Online (Sandbox Code Playgroud)
sizeof(str)是20,strlen(str)是3.
Tob*_*obi 10
正如Michael在评论中指出的那样,字符串以零结尾.所以在内存中第一个字符串看起来像这样
"123\0"
Run Code Online (Sandbox Code Playgroud)
where \0是单个char并且ASCII值为0.然后上面的字符串大小为4.
如果你没有这个终止字符,怎么会知道字符串(或char[]那个问题)结束的地方?嗯,确实另一种方法是在某处存储长度.有些语言可以做到.C没有.
在 C 中,字符串存储为chars 的数组。使用可识别的终止字符('\0'或仅0),您可以传递指向字符串的指针,而无需任何进一步的元数据。处理字符串时,您从指针指向的内存中读取字符,直到遇到终止值。
由于您的数组初始化使用字符串文字:
char name[]="123";
Run Code Online (Sandbox Code Playgroud)
相当于:
char name[]={'1','2','3',0};
Run Code Online (Sandbox Code Playgroud)
如果您希望数组的大小为 3(没有终止字符,因为您不存储字符串,您将需要使用:
char name[]={'1','2','3'};
Run Code Online (Sandbox Code Playgroud)
或者
char name[3]="123";
Run Code Online (Sandbox Code Playgroud)
(感谢 alk)这会如你所愿。