动态设置指向int的指针给出不正确的大小

时间:2016-05-13 09:11:20

标签: c struct malloc

我定义了struct

struct Query {  
   int *pages;
   int currentpage;
};


struct Query *new = malloc(sizeof(struct Query));

new->pages = malloc(sizeof(int) * 4);

然后我检查了new->pages的大小以确保大小为4:

    int size = sizeof(new->pages)/sizeof(new->pages[0]);

但是,size不断返回2而不是4

有谁知道我可能做错了什么?

感谢您的帮助。

3 个答案:

答案 0 :(得分:8)

你的期望是错误的。

中的

sizeof(new->pages)

int size = sizeof(new->pages)/sizeof(new->pages[0]);

不会返回int个元素的总数。只是int指针的大小(int*)。由于您的平台上sizeof(int*)为8且sizeof(int)为4,因此返回2.

顺便说一句,您应该size_t使用size作为sizeof运算符返回size_t%zu是格式说明符({{1} }})打印printf()

答案 1 :(得分:2)

您看到了这一点,因为class Projects(APIView): def post(self, request, format=None): data=request.data ... class SyncProjects(APIView): def get(self, request, format=None): PostContent={ 'name':newProject["name"], 'projectParent':'' ... } 运算符产生其操作数类型的大小(以字节为单位),sizeof的类型是指向整数的指针,由结构定义,因此它计算指针的大小,而不是数组。

请注意示例的不同之处:

new->pages

使用int arr[4] = {0,1,2,3}; int *p = arr; printf("%zu\n", sizeof(arr)); // prints 16 printf("%zu\n", sizeof(p)); // prints 4 获取数组元素数量的惯例仅适用于数组,它不适用于指针,您必须自己跟踪长度。

答案 2 :(得分:0)

指针不是数组。尽管指针可以指向数组,但在指针上应用sizeof()运算符会返回指针的大小,而不是指向它的数组的大小。

因此,为了跟踪大小,我建议您使用size_t类型的变量来存储值(大小)。

哦,是的,如果您想使用c ++编译器,请不要将任何变量命名为new

struct Query {
    int *pages;
    int currentpage;
};

size_t size = 4;

struct Query *p = malloc(sizeof(struct Query));

p->pages = malloc(sizeof(int) * size);