c语言中的sizeof算子

c语言中的sizeof算子,c,C,关于此代码,我有一个问题: int main() { printf("%d",sizeof("")); } 它打印1,为什么?它是包含\0(Null)字符的字符串,该字符大小为1字节。“”==空字符串或以Null结尾的字符指针 由于空终止符,它打印1 i、 e “真的等于“\0””=\0(空字符)。也就是1字节。因此,它的大小为1。在C中,sizeof运算符返回以字节为单位的数据类型大小。在您的例子中,一个空的“”花费您1字节,因此它返回值1。我将作者的问题解释为为什么打印1而不是4或

关于此代码,我有一个问题:

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

它打印
1
,为什么?

它是包含
\0
(Null)字符的字符串,该字符大小为
1字节。

“”==空字符串或以Null结尾的字符指针

由于空终止符,它打印1

i、 e


“真的等于“\0”

=
\0
(空字符)。也就是1字节。因此,它的大小为1。

在C中,
sizeof
运算符返回以字节为单位的数据类型大小。在您的例子中,一个空的“”花费您1字节,因此它返回值1。

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

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

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

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

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

“\0”
但是有两个空终止符,大小为2。否,“\0”!="\0". 一个是字符,另一个是字符*