[英]allocating memory to a pointer of an array of structures
我正在嘗試將 memory 分配給結構數組的指針,但是當我編譯終端向我發送分段錯誤時,這是我的代碼:
typedef struct codif {
unsigned char simbolo;
int nbits;
unsigned int codigo;
} codificacion;
codificacion **matcod;
*matcod = malloc(256 * sizeof((*matcod)[0]));
這個指針
codificacion **matcod;
未初始化並且具有不確定的值。 因此,像*matcod
那樣取消引用它會導致未定義的行為。
也許你的意思是以下
codificacion *matcod;
matcod = malloc( 256 * sizeof( *matcod ) );
或類似以下內容
codificacion *p;
codificacion **matcod = &p;
*matcod=malloc(256*sizeof((*matcod)[0]));
例如,如果您有一個 function 定義為
void f( codificacion **matcod )
{
*matcod=malloc(256*sizeof((*matcod)[0]));
//...
}
那么它可以被稱為
codificacion *matcod;
f( &matcod );
您可能需要編寫一個 function ,它將指向該結構數組的指針的指針作為參數。 所以codificacion **matcod
是 function 的參數,而不是本地未定義變量,當您取消引用它以存儲分配的數組的地址時會導致未定義的行為。
這是修改后的版本:
typedef struct codif {
unsigned char simbolo;
int nbits;
unsigned int codigo;
} codificacion;
int allocate_array(codificacion **matcod) {
*matcod = malloc(256 * sizeof((*matcod)[0]));
return *matcod != NULL;
}
並調用此 function 傳遞實際指針的地址:
codificacion *mat;
if (!allocate_array(&mat)) {
printf("allocation error\n");
}
你應該總是用一些東西來聲明你的變量。 編譯器不會總是將未初始化的變量清零。 我也是在聲明 arrays 時使用calloc
的忠實粉絲——這是一種風格選擇,但尤其是使用 arrays 指針時,可以確保一切都歸零。 未初始化的數據可能很難調試。
codificacion **matcod = NULL;
matcod = calloc(256, sizeof(codificacion*));
請注意,我們創建了一個 256 元素的指針數組,而不是整個結構,並且因為**
是指向結構的指針數組而不是結構數組,所以您需要分配每個結構:
for(int index=0; index<256; index++)
matcod[index] = malloc(sizeof(codificacion));
然后,您將使用matcod[index]->nbits
引用您的元素。
現在,您應該做的只是實現一個平面結構數組,然后將指針傳遞給它。 使用 static 分配,您甚至可以避免calloc
調用。
codificacion matcod_array[256] = { 0 };
codificacion *matcod = (codificacion *)&matcod_array;
因為您只傳遞指向結構數組的指針,而不是指向指向單個結構的指針數組的指針,所以您將使用matcod[index].nbits
引用數組中的元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.