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。
注意 sizeof
和 strlen
之间的区别。第一个是给出整个数据项大小的运算符。第二个是 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).
考虑这段代码:
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。
注意 sizeof
和 strlen
之间的区别。第一个是给出整个数据项大小的运算符。第二个是 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).