C 在下面的程序中,为什么sizeof返回两倍于已初始化数组大小的值,而不是多返回一个字节?

C 在下面的程序中,为什么sizeof返回两倍于已初始化数组大小的值,而不是多返回一个字节?,c,pointers,sizeof,C,Pointers,Sizeof,我的程序没有错误,我只需要解释一下sizeof部分是如何工作的 #include <stdio.h> int main(int argc, char const *argv[]) { char food[5]; printf("Enter your favorite food:\n"); //here sizeof doubles array size why?? fgets(food, sizeof(food+1), stdin); p

我的程序没有错误,我只需要解释一下
sizeof
部分是如何工作的

#include <stdio.h>

int main(int argc, char const *argv[])
{
    char food[5];
    printf("Enter your favorite food:\n");

    //here sizeof doubles array size why??
    fgets(food, sizeof(food+1), stdin); 
    printf("Great choice I love %s\n", food);
    return 0;
}
#包括
int main(int argc,char const*argv[]
{
炭化食品[5];
printf(“输入您喜爱的食物:\n”);
//这里sizeof是数组大小的两倍,为什么??
fgets(食品、尺寸(食品+1)、标准食品);
printf(“很棒的选择,我喜欢%s\n”,食物);
返回0;
}

它不会使数组大小加倍,而是给出指针的大小。当对数组执行指针算术时,
sizeof
将参数视为指针,并给出参数类型的大小,而不是数组的大小


由于参数是指针,因此该值相当于
sizeof(void*)

它不会使数组大小加倍,而是给出指针的大小。当对数组执行指针算术时,
sizeof
将参数视为指针,并给出参数类型的大小,而不是数组的大小

由于参数是指针,因此该值相当于
sizeof(void*)

C11:6.5.3.4:
sizeof
运算符生成其操作数的大小(以字节为单位),可以是表达式或类型的括号名称大小由操作数的类型决定

表达式
food+1
的类型是指向
char
的指针。因此
sizeof(food+1)
将返回指针的大小。

C11:6.5.3.4:
sizeof
运算符生成其操作数的大小(以字节为单位),可以是表达式或类型的括号名称大小由操作数的类型决定


表达式
food+1
的类型是指向
char
的指针。因此,
sizeof(food+1)
将返回指针的大小。

似乎我正在阅读并发现
sizeof(variable)
返回变量的大小,因此当我声明
sizeof(food)
时,
food
变量采用字符数组的大小,然后添加一个平均值,编译器实际上通过增加一个相同大小的数组来加倍变量的大小,即在内存中分配空间

sizeof(food + 1)
分配两倍于食品大小的空间

sizeof(food)+1
分配比
食物
多1字节的空间

sizeof(food)+1
顺便说一句,我在Ububtu 14.04中使用gcc编译器


谢谢大家的帮助。

我似乎在阅读时发现
sizeof(variable)
返回变量的大小,所以当我声明
sizeof(food)
时,
food
变量取字符数组的大小,然后添加一个平均值,编译器实际上通过增加一个相同大小的数组来加倍变量的大小,即在内存中分配空间

sizeof(food + 1)
分配两倍于食品大小的空间

sizeof(food)+1
分配比
食物
多1字节的空间

sizeof(food)+1
顺便说一句,我在Ububtu 14.04中使用gcc编译器


谢谢你们的帮助。

你们说的“双倍数组大小”是什么意思?您是如何测量的,确切的尺寸是多少?如果您将
sizeof(食物+1)
替换为
sizeof(食物)+1
?我从来不知道
sizeof(food+1)
甚至是合法的-你在用什么编译器?food+1的类型是
char*
。我猜您是在64位系统上,所以指向
char
的指针的大小是8字节。这是个好问题。您所说的“数组大小加倍”是什么意思?您是如何测量的,确切的尺寸是多少?如果您将
sizeof(食物+1)
替换为
sizeof(食物)+1
?我从来不知道
sizeof(food+1)
甚至是合法的-你在用什么编译器?food+1的类型是
char*
。我猜您使用的是64位系统,因此指向
char
的指针的大小是8字节。这是一个好问题。。挑剔:
sizeof
是一个运算符,而不是一个函数。因此,没有参数传递给
sizeof
。。挑剔:
sizeof
是一个运算符,而不是一个函数。因此,没有参数传递给
sizeof
。food也是一个“指针”,因为它保存数组第一个元素的地址,所以为什么sizeof(food)给出5而不是8?这两种食物和食物+1有什么区别@haccks@Meninx; 作为
sizeof
数组的操作数,数组不会转换为指针。food也是一个“指针”,因为它保存数组第一个元素的地址,所以为什么sizeof(food)给出5而不是8?这两种食物和食物+1有什么区别@haccks@Meninx; 作为
sizeof
的操作数,数组不转换为指针。