考虑以下代码:
.gitignore
这个结果
char name[]="123";
char name1[]="1234";
为什么The size of name (char[]):4
The size of name1 (char[]):5
的大小总是加一?
答案 0 :(得分:12)
请注意sizeof
和strlen
之间的区别。第一个是运算符,它给出整个数据项的大小。第二个函数返回字符串的长度,该函数将小于其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。