的澆注你幫助編譯器發現錯誤在此代碼段
int** pt;
pt = (int*) malloc(sizeof(int)*10);
例如錯誤消息可以像
error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
pt = (int*) malloc(sizeof(int)*10);
^
沒有鑄造,編譯器可以接受這個明顯無效的代碼,因爲函數malloc
的返回類型是void *
,並且類型void *
的指針可能被分配給任何其他類型的對象的指針。
即在所評估的表達式的類型int *
轉讓的右側,而在分配的左側有類型int **
的目的和有從類型int *
的隱式轉換的類型int **
。
這段代碼
int** pt;
*pt = (int*) malloc(sizeof(int)*10);
是另一個原因無效。指針pt
未通過對象的有效地址進行初始化。如果指針具有自動存儲持續時間,則它具有不確定的值,如果指針具有靜態存儲持續時間,則它具有NULL。無論如何,其解引用導致未定義的行爲。
因此,這將是正確的寫
int* pt;
^^^^^^^
pt = (int*) malloc(sizeof(int)*10);
但是這種結構
int** pt;
//...
*pt = (int*) malloc(sizeof(int)*10);
可以在某些範圍內有效。
讓我們假設你聲明的指針
int *pt;
,並希望在一個函數來初始化它。在這種情況下,您必須通過引用將指針傳遞給函數。否則,函數將處理指針的副本,在這種情況下,原始指針不會被分配到函數中。
所以相應的代碼片段可以看,因爲它是在示範程序中顯示
#include <stdlib.h>
#include <stdio.h>
size_t f(int **pt)
{
const size_t N = 10;
*pt = (int*) malloc(sizeof(int) * N);
if (*pt)
{
int value = 0;
for (size_t i = 0; i < N; i++) (*pt)[i] = value++;
}
return *pt == NULL ? 0 : N;
}
int main(void)
{
int *pt;
size_t n = f(&pt);
if (n)
{
for (size_t i = 0; i < n; i++) printf("%d ", pt[i]);
putchar('\n');
}
free(pt);
}
程序輸出是
0 1 2 3 4 5 6 7 8 9
請不要指指針到指針作爲「雙指針」。後者聽起來太像是一個指向雙的指針,這是一個完全不同的動物。 –
不要在C++中使用malloc。 – 2017-10-10 17:05:00
@PeteBecker固定。感謝您的建議 – user2979872