2011-12-18 2 views
-1

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

#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); 

спасибо.

+1

Что это касается файлов? – Joe

+1

Также вы можете использовать «универсальный нулевой инициализатор» для вашего массива: 'struct s_myStruct stuff [MAGIC] = {0};' – pmg

ответ

1

Это не то же самое. Заявляя данные, как это:

struct s_myStruct stuff[MAGIC]; 

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

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

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

+0

Вы говорите, что два случая совершенно разные, и что во втором случае все, что я сделал, это выделить хранилище для указателей на структуры, а не на сами структуры? И поэтому мне нужен еще один шаг, чтобы выделить хранилище для структур? – PaeneInsula

+0

Нет, они в основном одни и те же - я просто перечислял некоторые различия. –

+0

OK. Спасибо за вашу помощь. – PaeneInsula

0

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

Но это не имеет никакого отношения к использованию fread и fwrite.

+0

Я не собирался помещать вещи [MAGIC] в стек; это глобальный. – PaeneInsula

+0

@ user994179: В этом случае на практике будет очень мало различий, кроме того, что вам нужно будет «освободить» динамическую версию в какой-то момент. Кроме того, как упоминает @Paul в своем ответе, массивы и указатели имеют некоторые тонкие различия в поведении. –

+0

Извините мое невежество здесь, но если, как говорит Павел, я только выделяю хранилище для указателей на структуры, а не на сами структуры, 2 случая (статические и динамические), которые я представил, совершенно разные, и что мне нужно что-то делать иначе, если я хочу использовать динамический маршрут? – PaeneInsula

Смежные вопросы