为一个结构数组的指针分配内存。

问题描述 投票:-1回答:1

我试图为一个结构数组的指针分配内存,但当我编译时,终端机向我发送了以下信息 分段故障这是我的代码。

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

codificacion **matcod;
*matcod = malloc(256 * sizeof((*matcod)[0]));
c malloc
1个回答
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 );

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

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.

© www.soinside.com 2019 - 2024. All rights reserved.