C中的sizeof(char [])

时间:2015-05-07 13:02:24

标签: c arrays sizeof

考虑以下代码:

.gitignore

这个结果

 char name[]="123";
 char name1[]="1234";

为什么The size of name (char[]):4 The size of name1 (char[]):5 的大小总是加一?

8 个答案:

答案 0 :(得分:12)

请注意sizeofstrlen之间的区别。第一个是运算符,它给出整个数据项的大小。第二个函数返回字符串的长度,该函数将小于其sizeof(除非您设法获得字符串溢出),具体取决于实际使用的分配空间量。

在你的例子中

char name[]="123";

sizeof(name)为4,因为终止'\0'strlen(name)为3。

但是在这个例子中:

char str[20] = "abc";

sizeof(str)为20,strlen(str)为3。

答案 1 :(得分:8)

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

"123\0"

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

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

答案 2 :(得分:2)

在C中,字符串存储为char s的数组。使用已识别的终止字符('\0'或仅0),您可以传递指向字符串的指针,而无需任何其他元数据。处理字符串时,从指针指向的内存中读取字符,直到达到终止值。

由于您的数组初始化使用的是字符串文字:

char name[]="123";

相当于:

char name[]={'1','2','3',0};

如果您希望您的数组大小为3(没有终止字符,因为您没有存储字符串,您将需要使用:

char name[]={'1','2','3'};

char name[3]="123";

(感谢alk) 这会像你期待的那样。

答案 3 :(得分:1)

因为在C中字符串末尾附加了一个空字符。

就像你的情况一样

name[0] = '1'
name[1] = '2'
name[2] = '3'
name[3] = '\0'

name1[0] = '1'
name1[1] = '2'
name1[2] = '3'
name1[3] = '4'
name1[4] = '\0'

答案 4 :(得分:1)

name = {'1','2','3','\0'};
name1 = {'1','2','3','4','\0'};

所以

sizeof(name) = 4;
sizeof(name1) = 5;

sizeof返回对象的大小,在这种情况下,对象是一个数组,并且定义了数组在第一种情况下为4字节长,在第二种情况下为5字节。

答案 5 :(得分:1)

在C中,字符串文字添加了空终止字符。

你的字符串,

 char name[]="123";
 char name1[]="1234";

看起来更像:

 char name[]="123\0";
 char name1[]="1234\0";

因此,大小总是加一。请记住,从文件或任何来源读取字符串时,存储字符串的变量应始终为空终止字符留出额外空间。

例如,如果您需要读取字符串,其最大大小为100,则缓冲区变量的大小应为101.

答案 6 :(得分:1)

C中的\0(可能是在每个编程语言中,在幕后)是一个字符数组,由char arr[] = "1234";以ASCII值0终止。

分配:\0时,您指定一个字符串文字,默认情况下,以空格终止(char也称为空),如您所见here

为了避免null(假设你只想要一个char arr[] = {'1', '2', '3', '4'};的数组而不是一个字符串),你可以用以下方式sizeof(arr)声明它,程序将按你的意愿行事({{ 1}}将是4)。

答案 7 :(得分:0)

每个字符串都以char nullbyte'\ 0'终止,它将长度加1。