C 中的 Sizeof(char[])

Sizeof(char[]) in C

考虑这段代码:

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

而这个结果

The size of name (char[]):4
The size of name1 (char[]):5

为什么char[]的大小总是加一?

因为在C语言的字符串末尾附加了一个空字符

就像你这里的情况一样

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

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

每个字符串都以 char nullbyte '\0' 结尾,这会在您的长度上加 1。

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

"123[=10=]"

其中 [=11=] 是单个字符且 ASCII 值为 0。那么上述字符串的大小为 4。

如果没有这个终止符,人们怎么知道字符串(或 char[] 就此而言)在哪里结束?好吧,确实还有一种方法是将长度存储在某处。有些语言会这样做。 C 没有。

name = {'1','2','3','[=10=]'};
name1 = {'1','2','3','4','[=10=]'};

所以

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

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

在 C 语言中,字符串文字添加了一个空终止符。

你的字符串,

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

看起来更像:

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

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

例如,如果您希望读取最大大小为 100 的字符串,则您的缓冲区变量的大小应为 101。

注意 sizeofstrlen 之间的区别。第一个是给出整个数据项大小的运算符。第二个是 returns 字符串长度的函数,它将小于它的 sizeof (除非你已经设法让字符串溢出),这取决于它分配了多少 space实际使用。

在你的例子中

char name[]="123";

sizeof(name)是4,因为终止符'[=16=]',而strlen(name)是3.

但在这个例子中:

char str[20] = "abc";

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

在 C 中,字符串存储为 char 的数组。使用可识别的终止字符('[=15=]' 或只是 0),您可以将指针传递给字符串,而无需任何其他元数据。处理字符串时,您从指针指向的内存中读取字符,直到遇到终止值。

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

char name[]="123";

相当于:

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

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

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

char name[3]="123";

(感谢 alk) 这将如您所料。

C 语言中的 String(可能还有每种编程语言 - 在幕后)是一个字符数组,以 [=11=] 结尾,ASCII 值为 0。

当分配:char arr[] = "1234"; 时,您分配一个字符串文字,默认情况下,它以 null 结尾([=11=] 也称为 null),如您所见 here

为了避免空值(假设您只需要 char 的数组而不是字符串),您可以按以下方式声明它 char arr[] = {'1', '2', '3', '4'}; 并且程序将按照您的意愿运行( sizeof(arr) 将是 4).