2016-05-13 56 views
3

我有一个struct定义:动态设置指针为int给予不正确的大小

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

有人会知道我可能会做错什么吗?

感谢您的帮助。

+5

'的sizeof(新建 - >页)/的sizeof(新建 - >页面[0])''的意思的sizeof(INT *)/的sizeof(int)的'' – BLUEPIXY

+2

是pages'一个'pointer',不一个'数组'。你说的是:给我一个指针的大小除以int的大小(在大多数系统中是8/4 = 2)。 – nicola

+2

我建议你在存储元素数量的struct上添加第三个成员变量。 – user694733

回答

8

你的期望是错的。

sizeof(new->pages)

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

不返回int元素的总数。只是int指针的大小(int*)。由于sizeof(int*)是8和sizeof(int)是4你的平台上,它返回2.

顺便说一句,你应该使用size_tsizesizeof符返回size_t%zu是格式说明(在printf())打印size_t

+0

根据我们所知,在他们的平台上不能使用sizeof(int *)'4和sizeof(int)'2? – nicola

+0

是的,这很有可能,但对于目前使用的任何体面编译器来说都不太可能(除非它是过时的Turbo C编译器)。理论上,它分别是16和8。 –

2

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

的说明例子的区别:

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

获得使用sizeof(arr)/sizeof(arr[0])仅能用于数组的数组元素的数量的惯例,它不指针工作,你必须不断跟踪长度你自己。

0

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

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

哦是的,并且不要指定任何变量new以防您想要使用C++编译器!

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

size_t size = 4; 

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

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