2016-05-13 72 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);