#define STR "test1"
为什么这需要6个字节?
sizeof(STR)= 6
答案 0 :(得分:16)
最后有一个尾随'\0'
。
答案 1 :(得分:5)
它与#define
无关。字符数组的大小相同:
const char str[] = { "test1" };
sizeof (str) == 6
此字符串长度为6个字节的原因是C中的字符串具有终止NUL字符以标记结尾。
答案 2 :(得分:5)
#define
只是在编译之前进行文本替换。
#define STR "test1"
sizeof(STR);
实际上被编译器视为
sizeof("test1");
现在为什么是6而不是5?因为字符串末尾有一个空终止符。
答案 3 :(得分:2)
C中的字符串是char
s的数组,带有空终止符,即它们以\0
结尾。常见的替代方法是Pascal样式的字符串,其中字符串存储没有null终止符的char
s数组,而是存储字符串的长度。
答案 4 :(得分:1)
其他人说的话...... 但是
在C
中,预处理令牌不占用空间。这取决于你如何使用它们
#define STR "test1"
char x[] = STR; /* 6 bytes */
char *y = STR; /* sizeof (char*) bytes (plus possibly 6 bytes) */
int ch = STR[3]; /* 1 byte (or sizeof (int), depending on how you look at it) */
if (ch == STR[1]) /* 1 byte (or sizeof (int) or no bytes or ...) */
printf("==>" STR "<==") /* 5 bytes ??? */
答案 5 :(得分:1)
为什么这需要6个字节?
实际上,它需要(6个字节×你使用它的次数),因为它是一个预处理器宏。
请尝试const char *STR = "test1"
。
答案 6 :(得分:0)
最新的C编译器有一个功能,可以猜测编写程序的人是否处于学习阶段并给出答案,使他们搜索范围更广,更深入,从而丰富他们的知识。
编程一段时间后,根据您的学习情况,您可能会看到值下降到5.; - )
JK ..正如其他人所说的那样,它最终没有任何意义,具有讽刺意味的是需要一个字节。