Calloc, Malloc и динамическое распределение структуры - PullRequest
0 голосов
/ 18 декабря 2011

Я пытаюсь динамически выделить массив структур в c, чтобы я мог ссылаться на них так же, как если бы я сделал статическое объявление.Я понимаю, что calloc () выполняет дополнительный шаг инициализации всей выделенной памяти равным 0. Но, кроме этого, полностью ли взаимозаменяемы 2 для следующего кода?Если я использую fread () и fwrite (), чтобы получить эти структуры данных в файл и из файла, помогает ли calloc () или мешает этому?

#define MAGIC   13
    struct s_myStruct {
int a[6000][400];
int b[6000][400];
int c[6000][400];
};

struct s_myStruct stuff[MAGIC];
vs
struct s_myStruct *stuff = calloc(MAGIC, sizeof(s_myStruct);

Спасибо.

Ответы [ 2 ]

1 голос
/ 18 декабря 2011

Они не одинаковы.Объявление данных следующим образом:

struct s_myStruct stuff[MAGIC];

оставит память неинициализированной, если вы объявляете ее в области действия функции (которой вы должны быть, учитывая второй выбор).Добавление = {0} до того, как точка с запятой исправляет это.

Второй вариант использования calloc выделяет память в куче.

Хотя всегда есть разница: sizeof(stuff) будет 13 *sizeof (struct s_myStruct) в первом случае и размер указателя во втором случае.

0 голосов
/ 18 декабря 2011

Вы действительно не хотите делать первый, поскольку вы кладете 13 * 3 *6000* 400 * 4 = 370 МБ в стек.

Но это не имеет ничего общего с использованием fread и fwrite.

...