繁体   English   中英

c 中的 sizeof 运算符

[英]sizeof operator in c

我对此代码有疑问:

int main()
{
    printf("%d",sizeof(""));
}

它打印1 ,为什么?

它是包含\0 (Null) 字符的字符串,其大小为1 Byte

"" = \0 (空字符)。 这是1个字节。 因此它的大小为 1。

我将作者的问题解释为为什么打印 1 而不是 4 或 8(指针大小),而不是为什么字符串的大小 == 连续非零字节数加 1。

main(){printf("%d", sizeof((const char *)""));}

上述程序的output是8(我机器上的指针大小)。 在这种情况下,编译器将 "" 视为在以下情况下的处理: { const char *pointer = ""; },不像这样 { char c[] = ""; }。 (如果您熟悉 x86 asm,它本质上是 lea 与 mov)后者在堆栈上为“缓冲区”保留 1 个字节,初始化为 '\0'。

字符串文字""char[1]类型(一个元素的char数组,NUL 字节),而不是char* / const char* 因此sizeof产生数组的大小,即 1 个字节。

"" == 空字符串或 null 终止的指向字符的指针。

由于 null 终止符,它打印 1。

IE

"" 真的等于 '\0'

在 C 中, sizeof运算符以字节数返回数据类型的大小。 在您的情况下,一个空的 "" 花费您 1 个字节,因此它返回值 1。

您的程序实际上具有未定义的行为,因为%d不是size_t表达式的有效格式说明符。 您应该使用%zu或者将sizeof的结果转换为int 否则,现有的答案是可以的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM