我正在尝试动态创建一个结构数组。虽然小尺寸似乎工作正常,但程序稍后崩溃(分段错误)。当有一个大的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个整数答案 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;
}