2017-04-05 41 views
-2

我平時看到的語法,malloc分配:正確的語法使用malloc:的sizeof(* INT)或的sizeof(INT *)

int **p = malloc(N*sizeof(int*)) 

p是一個指針。我也看到了以下語法(也許我的消息來源是不對的):上面的語法

int **p = malloc(N*sizeof(*int)) 

的差異之間2是「明星」 *第一個類型int後和之前第二個出現。

你能告訴我上面兩者之間的正確語法嗎?

+0

不應該是'int * p = malloc(N * sizeof(int))'或'int ** p = malloc(N * sizeof(int *))'? – Axel

+0

是的,它是'int ** p = malloc(N * sizeof(int *))'我在我的編輯中修復它 – youpilat13

+1

而不是在互聯網上發佈這個問題,爲什麼你不試試它們在你的編譯器中,它會告訴你。另外,如果你閱讀並理解一本C編程書籍,你應該能夠弄清楚'* int'是無稽之談。 – Lundin

回答

1

以上都不是適合足夠的內存量。下面是正確的:

int *p = malloc(N * sizeof(int)); 

int **p = malloc(N * sizeof(int *)); 

在第一個,你分配的內存整數和返回它的指針。第二個是分配指針數組,因此您需要sizeof關鍵字中的*字符。

但搞亂的尺寸的未來,如果你改變int *p讓我們說char *p,這是更好地使用這個語法:

int *p = malloc(N * sizeof(*p)); 
0

TL; DR第一個,部分(考慮您的實際代碼已終止;)。

可能是一個更好的正確的方式來寫這將是

int *p = malloc(N*sizeof(*p)); // need memory for "int" type, not pointer to int 

這消除了對數據類型的硬編碼依賴性。


FWIW,第二個,

int *p = malloc(N*sizeof(*int)) 

是一個錯誤的語句,句法錯誤。

而且,爲了挑剔,它不是一個「明星」,它被稱爲引用操作。

+0

這個'int * p = malloc(N * sizeof(* int))'應該是這樣的:int * p = malloc(N * sizeof(int))' – tilz0R

+0

@ tilz0R :) –

+0

如果你大聲閱讀'sizeof * p',你會說「sizeof star p」還是「sizeof dereferenced p」? – mch

4

第二個只能用表達作爲使用sizeof運算符的操作數(而*int不是表達式,它是語法錯誤)。 你可能已經看到它在使用規範的方式來分配任意類型的N個元的動態數組代碼:

p = malloc (N * sizeof *p); 

我故意不顯示指針類型p的聲明,因爲它是不需要。即使p的類型發生變化,您也不需要觸摸此分配線路。它總是做正確的事情。

C語法sizeof怪癖:對於表達式操作數,括號是可選的。當操作數是一個類型時,它們是必需的。

相關問題