使用malloc动态分配结构数组

时间:2017-01-13 16:28:05

标签: c arrays pointers struct dereference

我正在尝试动态创建一个结构数组。虽然小尺寸似乎工作正常,但程序稍后崩溃(分段错误)。当有一个大的ipt_size时,它会用nosense数字快速压缩,所以我认为问题在于我分配我的数组的方式。

int create_ipt(int ipt_size,frame **ipt){
    int i;
    *ipt=malloc(ipt_size*sizeof(frame*));
 for(i=0;i<ipt_size;i++){
    ipt[i]=malloc(sizeof(frame));
     if (ipt[i]==NULL) return 1; //error
    ipt[i]->empty=1;
   }
 return 0; //success
}//create page table

我用

调用该函数
     frame *ipt;
    create_ipt(ipt_size,&ipt);

你知道发生了什么吗?

框内有3个整数

2 个答案:

答案 0 :(得分:2)

查看*ipt的类型,它是frame *,这意味着,它是指向frame类型的指针,即指向类型frame。因此,您需要分配能够保存类型frame的内存并将地址分配给*ipt

更改内存分配以反映相同内容。变化

 *ipt=malloc(ipt_size*sizeof(frame*));

*ipt=malloc(ipt_size*sizeof(frame));

然后,查看并修改(删除)以下语句ipt[i]=malloc(sizeof(frame));,您已经分配了用于保存ipt_size个元素的内存。

之后,查看解除引用声明。而不是

ipt[i]->empty=1;

你需要写

(*ipt)[i].empty = 1;
由于(以避免不需要的效果)operator precedence,因此存在明确的括号。

答案 1 :(得分:0)

create_ipt中,您使用:

ipt访问** ipt(指向你在主要创建的指针的指针)

*ipt访问* ipt(指向结构框的指针)

**ipt访问ipt(struct frame本身)

int create_ipt(int ipt_size, frame **ipt)
{
        int i;
        *ipt = malloc(ipt_size*sizeof(frame*)); // *ipt is the pointer to the struct frame you want to allocate memory)
        for(i=0; i < ipt_size; i++)
        {
                // If you only have integers you don't need to allocate memory to the struct, it's already allocated, but if you have char* you should malloc that var
                (*ipt)[i].text = malloc(text_size*sizeof(char));
                (*ipt)[i].empty = 1;
        }
        return 0;
}