2016-02-28 56 views
1
TRANSITION *transitions = malloc(sizeof(TRANSITION)); 
STATE *destination = malloc(sizeof(STATE)); 
transitions->destination = (struct STATE *) destination; 
int new_size = sizeof(*transitions) + sizeof(TRANSITION); 
printf("%d ", new_size); 
transitions = realloc(transitions, new_size); 

new_size是32,因爲sizeof(*轉換)ist 16和sizeof(TRANSITION)ist 16.現在我想要轉換有32個大小的內存。realloc-call後沒有變化

的問題是,如果我這樣做:

printf("%d ", sizeof(*transitions)); 

轉變的大小仍然是16爲什麼不是32?

+0

'* transitions'是一個頂級元素。 – BLUEPIXY

+3

結構的大小在編譯時是固定的。 '的sizeof(*躍遷)'意味着完全一樣'的sizeof(過渡)' –

+1

與往常一樣,你應該張貼在你的代碼片段中使用的所有類型的定義。 'transitions-> destination =(struct STATE *)destination;'中的轉換可能是不必要的。 – chqrlie

回答

3

sizeof操作者在編譯時被評估。它的值是操作數類型的大小。不能使用sizeof來檢索malloccallocrealloc分配的實際大小。一些malloc實現有一個功能來做到這一點,但它不是標準的。

如果分配在塊存儲多個對象或數組的內存,您必須跟蹤分配的空間自己的,在不同的變量或結構成員。

請注意,printf格式%d是或int值。 sizeof計算結果爲size_t值,這是無符號的,可能有不同的尺寸。標準格式轉換size_t%zu

printf("%zu ", sizeof(*transitions)); 

如果你的C庫不支持C99格式說明,你可以使用一個投:

printf("%lu ", (unsigned long)sizeof(*transitions)); 
+1

有些'sizeof'表達式在運行時被評估(不是這個) –

+0

@MM:一些'sizeof'表達式的確在運行時被評估:'sizeof(char [random()])'調用了'random ()'函數,但施加到物體'sizeof',相對於一個類型,計算結果爲要麼是一個編譯器的時間常數,或者被計算爲對象實例化(對於VLAS)的一部分的值。這似乎不是這種情況,但類型定義丟失。 – chqrlie