我平時看到的語法,malloc分配:正確的語法使用malloc:的sizeof(* INT)或的sizeof(INT *)
int **p = malloc(N*sizeof(int*))
與p
是一個指針。我也看到了以下語法(也許我的消息來源是不對的):上面的語法
int **p = malloc(N*sizeof(*int))
的差異之間2是「明星」 *
第一個類型int
後和之前第二個出現。
你能告訴我上面兩者之間的正確語法嗎?
我平時看到的語法,malloc分配:正確的語法使用malloc:的sizeof(* INT)或的sizeof(INT *)
int **p = malloc(N*sizeof(int*))
與p
是一個指針。我也看到了以下語法(也許我的消息來源是不對的):上面的語法
int **p = malloc(N*sizeof(*int))
的差異之間2是「明星」 *
第一個類型int
後和之前第二個出現。
你能告訴我上面兩者之間的正確語法嗎?
以上都不是適合足夠的內存量。下面是正確的:
int *p = malloc(N * sizeof(int));
或
int **p = malloc(N * sizeof(int *));
在第一個,你分配的內存整數和返回它的指針。第二個是分配指針數組,因此您需要sizeof關鍵字中的*
字符。
但搞亂的尺寸的未來,如果你改變int *p
讓我們說char *p
,這是更好地使用這個語法:
int *p = malloc(N * sizeof(*p));
TL; DR第一個,部分(考慮您的實際代碼已終止;
)。
可能是一個更好的正確的方式來寫這將是
int *p = malloc(N*sizeof(*p)); // need memory for "int" type, not pointer to int
這消除了對數據類型的硬編碼依賴性。
FWIW,第二個,
int *p = malloc(N*sizeof(*int))
是一個錯誤的語句,句法錯誤。
而且,爲了挑剔,它不是一個「明星」,它被稱爲引用操作。
第二個只能用表達作爲使用sizeof
運算符的操作數(而*int
不是表達式,它是語法錯誤)。 你可能已經看到它在使用規範的方式來分配任意類型的N個元的動態數組代碼:
p = malloc (N * sizeof *p);
我故意不顯示指針類型p
的聲明,因爲它是不需要。即使p
的類型發生變化,您也不需要觸摸此分配線路。它總是做正確的事情。
C語法sizeof
怪癖:對於表達式操作數,括號是可選的。當操作數是一個類型時,它們是必需的。
不應該是'int * p = malloc(N * sizeof(int))'或'int ** p = malloc(N * sizeof(int *))'? – Axel
是的,它是'int ** p = malloc(N * sizeof(int *))'我在我的編輯中修復它 – youpilat13
而不是在互聯網上發佈這個問題,爲什麼你不試試它們在你的編譯器中,它會告訴你。另外,如果你閱讀並理解一本C編程書籍,你應該能夠弄清楚'* int'是無稽之談。 – Lundin