【问题标题】:Allocating memory for array of structs为结构数组分配内存
【发布时间】:2014-04-21 13:24:01
【问题描述】:

我有一个类似下面的结构:

typedef struct author
{
char letter;
char *name[200];
int counter;
} Aut, *i_aut;

它由一个字符、“字符串”和 int 数组组成。我的目标是在内存中为 30 个此类结构的数组分配空间,因此我尝试了以下操作:

i_aut lista_autores=calloc(30,sizeof(Aut));

但是,它总是返回“分段错误”。我也尝试一次初始化一个,但结果相同。我的问题是,我如何分配这种内存以及以后如何访问它?

提前感谢您,如有任何错别字,我们深表歉意。

【问题讨论】:

  • 使用char *name[200];,您可以在每个结构中拥有 200 个不同的字符串(如您所描述的,一个字符串数组)。但是:您也需要保留琴弦。如果你只想要一个最大的字符串。长度为 200,删除 *。
  • 你是如何访问name的?
  • “分段错误”什么时候发生?当您只做i_aut lista_autores=calloc(30,sizeof(Aut)); free(lista_autores); 而中间什么都不做时会发生这种情况吗?
  • 我感觉你想要char name[200],因为作者只有一个名字(长度最多199)?

标签: c struct malloc calloc


【解决方案1】:

结构成员 name 是一个包含 200 个指针的数组。
您可能希望将 malloc 的结果分配给数组的元素。

struct author *i_aut;
i_aut = malloc(sizeof *i_aut);
if (i_aut) {
    for (size_t k = 0; k < 200; k++) {
        i_aut->name[k] = malloc(30);
        if (!i_aut->name[k]) /* error */;
        /* DONT FORGET TO FREE EACH NAME LATER ON */
    }
    free(i_aut);
}

【讨论】:

    【解决方案2】:

    试试这个

        struct author **i_aut;
        i_aut=(struct author **)malloc(30*sizeof(struct author*));
        for(i=0;i<30;i++)
            i_aut[i]=(struct *)malloc(sizeof(struct author)); 
    

    在此之后,您无需为 name[] 单独分配空间。 你有 30 个 struct author 类型元素的数组* 您可以使用访问所有三种类型 i_aut[i]->字母; i_aut[i]->名称[j]; i_aut[i]->计数器; 这里我

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      • 2021-05-29
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多