2012-11-07 97 views
3

這感覺像一個愚蠢的問題,但我只是不能找出一個乾淨的解決方案,並找不到類似的問題在大量的其​​他指針相關的問題。存儲指針地址在malloced內存

我有一些動態分配未知類型的內存,並希望在開始時在其中存儲指針。由malloc返回的動態內存應該適當對齊,所以當寫入分配塊的開始時,我不認爲我必須擔心對齊。

這是我的代碼,它的工作原理,但我代表指針作爲64位整數,並希望做一個更清潔/可移植的方式:

void *my_area = malloc(512); 
void *my_pointer = get_my_pointer(); 
((long long *) my_area)[0] = (long long) my_pointer; 
+0

或者您也可以使用'uintptr_t'。 – 2012-11-07 17:20:45

回答

2

鑄到long long只是額外的行李。改爲投射到void *

void *my_area = malloc(512); 
void *my_pointer = get_my_pointer(); 
((void **) my_area)[0] = my_pointer; 

(我認爲這是某種形式的自由列表或類似,即你不需要在同一時間使用結構。)

1

什麼會中找到my_area[0]是指向某些東西,對吧?

然後,您可以分配my_area類型爲void **,它們表示指向包含內存區域的指針的指針。

void **my_area = malloc(512 * sizeof(*my_area)); // alloc 512 pointer sized memory blocks 
void *my_pointer = get_my_pointer(); 
my_area[0] = my_pointer; 
0

定義一個結構與內部數組8個字節。將所有long long類型的引用替換爲您的自定義結構。這樣你就不會依賴長期的平臺特定的大小。該結構在所有平臺上都是64位(如果擔心對齊,可以添加#pragma pack)

+1

'long long'已經保證在所有平臺上至少有64位,使用'struct'代替不會改善任何事情。 –

+0

這僅適用於C99和C++ 11。此外,大於64位打破了便攜性,同樣的成功。 – SomeWittyUsername