我很好奇为什么我的 29 大小数组中的最后一个元素是 27,而不是 28?为什么打印第28位的对象时出现空白? s
应该是第 28 位的最后一个对象吧?
#include <stdio.h>
int main(void) {
char strArray[] = { "Jonsnow from Game of Thrones" };
int lastElem = sizeof(strArray);
printf("%s\n", strArray);
printf("Size of array is: %d\n", sizeof(strArray));
printf("first array value: %c \n", strArray[0]);
printf("last array value: %c \n", strArray[lastElem - 1]);
printf("last array value: %c \n", strArray[lastElem - 2]);
return 0;
}
输出:
Jonsnow from Game of Thrones
Size of array is: 29
first array value: J
last array value:
last array value: s
最佳答案
C 字符串中的最后一个字节是空终止符,一个值为0
的字节,也写为'\0'
。 strArray
是一个从 C 字符串常量初始化的 char
数组,它的大小恰好是初始化程序的大小,包括空字节,因此 strArray[lastElem-1]
是空字节 '\0'
。
用 printf
%c
格式输出一个空字节应该可以正常工作,一个空字节被写入 stdout
,但有可能您的终端会忽略此类字节并生成您发布的输出。您可以尝试将程序的输出重定向到一个文件,并使用十六进制编辑器检查该文件,看看它是否确实在换行符之前包含一个空字节。
我在装有 OS/X 的 MacBook 上得到了相同的行为:
chqrlie@mba1 ~/dev/stackoverflow > ./nullbyte
Jonsnow from Game of Thrones
Size of array is: 29
first array value: J
last array value:
last array value: s
但这里是程序输出的二进制转储:
chqrlie@mba1 ~/dev/stackoverflow > ./nullbyte | od -bc
0000000 112 157 156 163 156 157 167 040 146 162 157 155 040 107 141 155
J o n s n o w f r o m G a m
0000020 145 040 157 146 040 124 150 162 157 156 145 163 012 123 151 172
e o f T h r o n e s \n S i z
0000040 145 040 157 146 040 141 162 162 141 171 040 151 163 072 040 062
e o f a r r a y i s : 2
0000060 071 012 146 151 162 163 164 040 141 162 162 141 171 040 166 141
9 \n f i r s t a r r a y v a
0000100 154 165 145 072 040 112 040 012 154 141 163 164 040 141 162 162
l u e : J \n l a s t a r r
0000120 141 171 040 166 141 154 165 145 072 040 000 040 012 154 141 163
a y v a l u e : \0 \n l a s
0000140 164 040 141 162 162 141 171 040 166 141 154 165 145 072 040 163
t a r r a y v a l u e : s
0000160 040 012
\n
0000162
如您所见,第四行的空格之间确实存在一个空字节。
另请注意,程序中存在错误:%d
可能不适合类型为 size_t
的参数。 C99 格式是 %zu
但为了移植到 C99 运行时支持较差的系统,我建议这样做:
printf("Size of array is: %lu\n", (unsigned long)sizeof(strArray));
关于c - 为什么字符串数组的最后一个索引在 C 中不打印任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54411199/