C中的sizeof(char [])

4 c arrays sizeof

考虑以下代码:

 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

注意之间的差异sizeofstrlen.第一个是运算符,它给出整个数据项的大小.第二个是一个返回字符串长度的函数,它将小于它的长度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.

  • 甚至比我自己的答案还要好:-),+1 (2认同)

Tob*_*obi 10

正如Michael在评论中指出的那样,字符串以零结尾.所以在内存中第一个字符串看起来像这样

"123\0"
Run Code Online (Sandbox Code Playgroud)

where \0是单个char并且ASCII值为0.然后上面的字符串大小为4.

如果你没有这个终止字符,怎么会知道字符串(或char[]那个问题)结束的地方?嗯,确实另一种方法是在某处存储长度.有些语言可以做到.C没有.


Bal*_*ckk 5

在 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)这会如你所愿。

  • 尽管 char name[3] = "123" 意味着没有尾随 nul 字符,这意味着例如 strlen (name) 可能会崩溃或更糟。 (2认同)