c-将指针动态设置为int,给出不正确的大小



我定义了一个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]);

然而,与4相反,size保持返回2

有人知道我做错了什么吗?

谢谢你的帮助。

您的期望是错误的。

中的sizeof(new->pages)

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

不返回CCD_ 7元素的总数。只是int指针(int*)的大小。由于在您的平台上sizeof(int*)是8,sizeof(int)是4,因此它返回2。

顺便说一下,size应该使用size_t,因为sizeof运算符返回size_t,而%zu是打印size_t的格式说明符(在printf()中)。

您之所以看到这一点,是因为sizeof运算符产生的操作数类型的大小以字节为单位,而new->pages的类型是一个指向整数的指针,由结构定义,因此它的计算结果是指针的大小,而不是数组的大小。

通过示例注意差异:

int arr[4] = {0,1,2,3};
int *p = arr;
printf("%zun", sizeof(arr)); // prints 16
printf("%zun", sizeof(p)); // prints 4

使用sizeof(arr)/sizeof(arr[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);

相关内容

  • 没有找到相关文章