在下面的程序中,为什么sizeof返回两次初始化的数组大小而不仅仅是一个字节?

时间:2015-01-18 20:07:42

标签: 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); 
    printf("Great choice I love %s\n", food);
    return 0;
}

3 个答案:

答案 0 :(得分:4)

C11:6.5.3.4:

  

sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的带括号的名称。 大小取决于操作数的类型

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

sizeof(food + 1)

分配的空间是food的两倍。

sizeof(food)+1

分配比food多1个字节的空间。

BTW我在Ububtu 14.04中使用gcc编译器

谢谢你们的帮助。