>我正在尝试动态创建一个结构数组。虽然小尺寸似乎工作正常,但程序稍后会崩溃(分段错误)。当有一个大ipt_size它很快就会被无意义的数字压碎,所以我认为问题出在我分配数组的方式上。
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 个整数
看*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;
并且该显式括号的存在是因为(以避免不必要的影响)运算符优先级。
在 create_ipt
中,您使用:
ipt
访问 **ipt(指向您在主中创建的指针的指针)
*ipt
访问 *ipt(指向结构框架的指针)
访问 IPT(结构框架本身)**ipt
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;
}