你的struct聲明有點混亂了,typedef在很多層次上都是錯誤的。下面是我建議:
//typedef + decl in one
typedef struct _memory {
int type;
int prot;
} Memory;
然後分配如下所示:
Memory *mem = malloc(sizeof *mem);
閱讀malloc
調用就像這樣:「分配的內存來存儲任何類型mem
指向所需的量」。如果更改Memory *mem
到Memory **mem
,它會分配4首或8個字節(取決於平臺),因爲目前的情況是,它可能會分配8個字節,取決於int
的大小,以及如何編譯器墊結構check wiki for more details and examples。
使用sizeof *<the-pointer>
被普遍認爲是分配內存的更好的辦法,但你想,你可以這樣寫:
Memory *mem = malloc(sizeof(Memory));
Memory *mem = malloc(sizeof(struct _memory));
他們都做同樣的事情。請注意,如果你是一個結構體,那可能是因爲你想抽象某個東西的內部運作,並且想編寫一個類的API。在這種情況下,你應該鼓勵使用struct _memory
儘可能,有利於Memory
或*<the-pointer>
反正
如果你想typedef
指針,那麼你可以這樣寫:
typedef struct _memory {
int type;
int prot;
} *Memory_p;
在其中情況下,這個:
Memory_p mem = malloc(sizeof *mem);
威力似乎直覺,但是否正確,如:
Memory_p mem = malloc(sizeof(struct _memory));
但這:
Memory_p mem = malloc(sizeof(Memory_p));
是錯誤的(它不會分配的結構所需的內存,但內存來存儲指向它)。
這是個人喜好,也許是一個問題,但我個人覺得typedef
的朦朧某些事情。在許多情況下,這是更好的(即FILE*
),但是一旦API開始隱藏你正在使用指針的事實,我就開始擔心一點。它往往使代碼更難以閱讀,調試和文檔...
試想一下這樣的:
int *pointer, stack;
的*
運營商修改一個給定類型的變量,指針的typedef做到這些。這只是我的看法,我確信有許多程序員比我更擅長使用指針typedef。
大多數時候,雖然,指針typedef
伴隨着定製分配功能或宏觀的,所以你不必奇怪的前瞻性陳述寫這樣Memory_p mem = malloc(sizeof *mem);
,而是你可以寫ALLOC_MEM_P(mem, 1);
它可以定義爲:
#define ALLOC_MEM_P(var_name, count) Memory_p var_name = malloc(count * sizeof *var_name)
什麼
您的'typedef'在很多層面上都是錯誤的......這是一個等待發生的事故,真的。無論哪種方式,寫'struct memory {};'然後像這樣分配'struct memory * mem = malloc(sizeof * mem);' –
你認爲你需要分配一個對象多少內存?也許你想分配的對象類型的大小? – juanchopanza
@EliasVanOotegem謝謝。那麼它應該是什麼大小?它是8個字節還是4個字節? – moeseth