#include <stdio.h>
#include <string.h>
int main()
{
printf("%d\n",sizeof("S\065AB"));
printf("%d\n",sizeof("S65AB"));
printf("%d\n",sizeof("S\065\0AB"));
printf("%d\n",sizeof("S\06\05\0AB"));
printf("%d\n",sizeof("S6\05AB"));
printf("%d\n",sizeof("\0S65AB"));
return 0;
}
输出:
5
6
6
7
6
7
任何人都可以用字符串解释这种行为吗?
在Debian 7.4上使用GCC
答案 0 :(得分:5)
字符串文字的大小是其中的字符数,包括添加的尾随空字节。如果字符串中存在嵌入的空值,则它们并不重要;他们被计算在内。它与strlen()
无关,只是如果文字不包含嵌入的空值strlen(s) == sizeof(s) - 1
。
printf("%zu\n", sizeof("S\065AB")); // 5: '\065' is a single character
printf("%zu\n", sizeof("S65AB")); // 6
printf("%zu\n", sizeof("S\065\0AB")); // 6: '\065' is a single character
printf("%zu\n", sizeof("S\06\05\0AB")); // 7: '\06' and '\05' are single chars
printf("%zu\n", sizeof("S6\05AB")); // 6: '\05' is a single character
printf("%zu\n", sizeof("\0S65AB")); // 7
请注意'\377'
是一个有效的八进制常量,相当于'\xFF'
或255.您也可以在字符串中使用它们。值'\0'
只是更一般的八进制常量的特例。
请注意,sizeof()
的计算结果为size_t
类型的值,C99和C11中size_t
的正确格式类型限定符为z
,因为它是无符号的,u
比d
更合适,因此我使用的是"%zu\n"
格式。
答案 1 :(得分:2)
文字字符串是一个数组,其大小与保存所有字符所需的大小完全相同,并且是一个额外的终止零字节。
因此,"hello"
的类型为char[6]
,sizeof
的格式为6。