【问题标题】:Allocating array of structs dynamically with malloc使用 malloc 动态分配结构数组
【发布时间】:2017-05-29 02:19:59
【问题描述】:

我正在尝试动态创建一个 structs 数组。尽管小尺寸似乎可以正常工作,但程序稍后会崩溃(分段错误)。当 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=malloc(ipt_size*sizeof(frame*)); --> *ipt=malloc(ipt_size*sizeof(frame));.. if (*ipt==NULL) return 1; for(i=0;i&lt;ipt_size;i++){ (*ipt)[i].empty=1; }
  • 谢谢你。就是这样。添加您的评论作为答案,使其变为绿色:)

标签: c arrays pointers struct dereference


【解决方案1】:

create_ipt,你使用:

ipt 访问 **ipt(指向您在 main 中创建的指针的指针)

*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;
}

【讨论】:

    【解决方案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(为了避免不想要的效果)而存在显式括号。

    【讨论】:

      猜你喜欢
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 2021-05-29
      • 1970-01-01
      • 2021-10-30
      相关资源
      最近更新 更多