动态分配char数组和int数组的结构

时间:2014-11-03 02:52:39

标签: c struct malloc

我正在尝试使用malloc为包含struct数组和char数组的int分配内存。我将使用文件中的信息填充这两个数组,该文件的长度我不会提前知道。

typedef struct bulk_data{
    int *l_bulk_pos_arr;
    char (*l_bulk_anc_arr)[10001];
}bulk_data;

我还在学习内存分配,但我在这里想象的是,由于每个char数组元素的大小是固定的,我不应该遍历该数组来分配内存。此时我现在知道我需要的数组元素的数量(n_rows)。我尝试了以下(显然不是所有的同时):

struct bulk_data *bulk_counts;
    bulk_counts = malloc(sizeof(bulk_data)); // 1st attempt
    bulk_counts = (bulk_data *)malloc(sizeof(bulk_data)); // 2nd
    bulk_counts = malloc(sizeof(bulk_data) * n_rows); // 3rd
    bulk_counts = (bulk_data *)malloc(sizeof(bulk_data) * n_rows); // 4th

编译时没有错误,但似乎上面列出的尝试没有正确分配空间:

(gdb) p bulk_counts->l_bulk_anc_arr
$1 = (char (*)[10001]) 0x0
(gdb) p bulk_counts->l_bulk_anc_arr[0]
Cannot access memory at address 0x0

(gdb) p bulk_data->l_bulk_pos_arr
$2 = (int *) 0x0
(gdb) p bulk_data->l_bulk_pos_arr[0]
Cannot access memory at address 0x0

我想知道如何为这个陈述的情况分配内存,但是当你不知道每个char数组元素中的字符数时也是如此。

1 个答案:

答案 0 :(得分:4)

l_bulk_anc_arr是指向 10001 char s 数组的指针。它不是一个数组。

你仍然需要为它分配内存。

struct bulk_data *bulk_counts;
bulk_counts = malloc(sizeof(bulk_data));
bulk_counts->l_bulk_pos_arr = malloc( /*some size*/ );
bulk_counts->l_bulk_anc_arr = malloc(10001);

现在,您可以使用:

(*bulk_counts->l_bulk_anc_arr)[0] = 'a';
(*bulk_counts->l_bulk_anc_arr)[1000] = '\0';

bulk_counts->l_bulk_anc_arr[0][0] = 'a';
bulk_counts->l_bulk_anc_arr[0][1000] = '\0';