【问题标题】:C. Dynamic Array of StructC. 结构体的动态数组
【发布时间】:2013-11-08 04:34:33
【问题描述】:

我想创建 struct player 的动态数组。我知道结构的大小,所以我不想为每个结构分配内存。所以我定义

struct player
{
    uint32_t efficiency ;
    uint32_t number;
} ;

struct array
{
    size_t   size;
    struct player data[];
};

但是在我创建和填充数组并尝试读取数据后,我得到一个错误

static inline size_t sizeof_array(size_t size)
{
    return sizeof(struct array) + (size * sizeof(struct player));
}

struct array *create_array(size_t size)
{
    struct array *ret = calloc(1, sizeof_array(size));
    if (! ret)
        abort();
    ret->size = size;
    return ret;
}

void free_array(struct array *array)
{
    free(array);
}

int main()
{
    size_t size;
    scanf("%d",&size);
    struct array *players = create_array(size);

    for(size_t i = 0; i < size; ++i){
        players -> data[i].efficiency = i; //some data
        players -> data[i].number = i;     //some data
    }

    for(size_t i = 0; i < size; ++i){
        printf("%d) %d\n", players -> data[i].number,players -> data[i].efficiency);
    }

    free_array(players);
    return 0;
}

错误: 此应用程序已请求运行时以不寻常的方式终止它。 请联系应用程序的支持团队了解更多信息。

我应该如何分配内存?

更新 头文件:stdio.h、stdint.h、inttypes.h、stdlib.h

gcc (rev2, 由 MinGW-builds 项目构建) 4.8.0 版权所有 (C) 2013 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有 保修单;甚至不是为了适销性或特定用途的适用性。

【问题讨论】:

  • 你能发布错误吗?
  • 当我用 gcc 4.8.1 编译它时为我工作,也许还有一些其他代码你没有显示?标头 #include stdio.h inttypes.h malloc.h ?
  • scanf("%d", &amp;size);。不知道是否是问题所在,但您应该将"%d" 用于size_t 数据类型。见viva64.com/en/k/0023

标签: c arrays struct dynamic-allocation calloc


【解决方案1】:

什么是错误?

在你的结构定义错误是struct player data[]; 它应该是struct player* data; 或写data[100]

【讨论】:

  • -1 你不应该从一个问题开始回答。编辑:我删除了反对票,因为您是 SO 新手,可能无法制作 cmets。
  • 但是没有给出错误的问题,我不确定毛绒问哪个错误我建议更正。
  • 我建议查找术语“灵活数组成员”,然后删除此问题/答案。
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 2020-04-14
  • 2017-03-13
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 2017-09-20
相关资源
最近更新 更多