将内存分配给结构数组的指针

时间:2020-05-06 20:29:18

标签: c malloc

我试图将内存分配给结构数组的指针,但是当我编译时,终端向我发送 segmentation fault ,这是我的代码:

typedef struct codif {
    unsigned char simbolo;
    int nbits;
    unsigned int codigo;
} codificacion;

codificacion **matcod;
*matcod = malloc(256 * sizeof((*matcod)[0]));

3 个答案:

答案 0 :(得分:1)

此指针

codificacion **matcod;

尚未初始化,并且具有不确定的值。因此,像*matcod那样对其取消引用会导致未定义的行为。

也许您是说以下

codificacion *matcod;
matcod = malloc( 256 * sizeof( *matcod ) );

或类似以下内容

codificacion *p;
codificacion **matcod = &p;
*matcod=malloc(256*sizeof((*matcod)[0]));

例如,如果您定义的函数类似

void f( codificacion **matcod )
{
    *matcod=malloc(256*sizeof((*matcod)[0]));
    //...
}

然后可以将其命名为

codificacion *matcod;
f( &matcod );

答案 1 :(得分:0)

您可能希望编写一个函数,该函数将指向此结构数组的指针作为参数。因此codificacion **matcod是函数的参数,而不是局部未定义变量,当您取消引用它以存储分配的数组的地址时,局部变量会导致未定义的行为。

这是修改后的版本:

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;
}

并通过传递实际指针的地址来调用此函数:

    codificacion *mat;
    if (!allocate_array(&mat)) {
        printf("allocation error\n");
    }

答案 2 :(得分:0)

您应该始终用一些东西声明变量。编译器不会总是将未初始化的变量清零。我还是在声明数组时使用calloc的忠实拥护者-这是一种风格选择,但尤其是对于指针数组,可以确保一切都归零。未初始化的数据可能很难调试。

codificacion **matcod = NULL;
matcod = calloc(256, sizeof(codificacion*));

请注意,我们创建了一个256个元素的指针数组,而不是整个结构,并且由于**是一个指向结构的指针而不是一个结构的数组,因此您需要分配每个结构:

for(int index=0; index<256; index++)
  matcod[index] = malloc(sizeof(codificacion));

然后,您将使用matcod[index]->nbits来引用您的元素。

现在,您应该做的只是实现结构的平面数组,然后将指针传递给它。使用静态分配,您甚至可以避免调用calloc

codificacion matcod_array[256] = { 0 };
codificacion *matcod = (codificacion *)&matcod_array;

由于只传递了指向结构数组的指针,而不是指向单个结构的指针数组的指针,因此您将使用matcod[index].nbits引用数组中的元素。