【问题标题】:How to dynamically allocate array of structs inside a function in C如何在C中的函数内动态分配结构数组
【发布时间】:2020-04-06 00:20:19
【问题描述】:

我试图在从文件中读取数据的函数中动态调整 struts 数组的大小,所以我不知道编译时的大小。

在主中填充动态分配的数组时出现错误“抛出异常:写访问冲突)在(看似)随机索引上为该数组分配值的行之一,如@987654322 中的i=170 @ in main,表明我没有正确分配函数中的内存。我在这里搜索过,但找不到我做错了什么 - 我很感激这可能是我遗漏的一些微不足道的事情。所以,请问我是什么这里做错了吗?

#define ELEMENT_COUNT   10000

typedef struct mystruct
{
    uint64_t a;
    uint64_t b;
    uint64_t c;
} mystruct_t;

void test(mystruct_t ** p_struct_array, uint32_t * p_count)
{
    *p_count = ELEMENT_COUNT;
    *p_struct_array = malloc(ELEMENT_COUNT * sizeof(mystruct_t *));
}

void main()
{
    mystruct_t * mystruct_array = NULL;
    uint32_t count;
    test(&mystruct_array, &count);
    for (uint64_t i = 0; i < ELEMENT_COUNT; i++)
    {
        (mystruct_array)[i].a = i;
        (mystruct_array)[i].b = i;
        (mystruct_array)[i].c = i;
    }
    getch();
}

【问题讨论】:

    标签: c struct malloc


    【解决方案1】:
    *p_struct_array = malloc(ELEMENT_COUNT * sizeof(mystruct_t *));
    

    应该是

    *p_struct_array = malloc(ELEMENT_COUNT * sizeof(mystruct_t));
    

    您想分配一个包含 10000 个 mystruct_ts 的数组,而不是 10000 个指针。


    许多人建议通过始终遵循以下模式来避免此类错误

    ptr = malloc(count * sizeof(*ptr));
    

    在你的情况下会读

    *p_struct_array = malloc(ELEMENT_COUNT * sizeof(**p_struct_array));
    

    确实**p_struct_array 的类型是mystruct_t,而不是mystruct_t *

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 2014-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多