我试图为一个结构数组的指针分配内存,但当我编译时,终端机向我发送了以下信息 分段故障这是我的代码。
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]));
例如,如果你定义了一个函数,如
void f( codificacion **matcod )
{
*matcod=malloc(256*sizeof((*matcod)[0]));
//...
}
便可称为
codificacion *matcod;
f( &matcod );
你可能要写一个函数,把指向这个结构数组的指针作为参数。所以 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");
}
你应该总是用一些东西来声明你的变量。编译器不会总是将未初始化的变量清零。我也很喜欢使用 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
.