我试图将内存分配给结构数组的指针,但是当我编译时,终端向我发送 segmentation fault ,这是我的代码:
typedef struct codif {
unsigned char simbolo;
int nbits;
unsigned int codigo;
} codificacion;
codificacion **matcod;
*matcod = malloc(256 * sizeof((*matcod)[0]));
答案 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
引用数组中的元素。