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