簡體   English   中英

將 memory 分配給結構數組的指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM