Инициализация большого двумерного массива в C

Я хочу инициализировать все элементы:

char buffer[1000][1000];

to ' '.

я пробовал

char buffer[1000][1000] = { ' ' };

а также

char buffer[1000][1000] = { { ' ' } };

но оба способа, кажется, только инициализируют только первый термин.

Я готов рассмотреть альтернативные подходы, которые позволяют выполнить работу, но я бы предпочел избегать написания такого кода инициализации в main или даже отдельного метода инициализации.


person math4tots    schedule 21.03.2012    source источник
comment
Итак, во-первых, вы выделяете в стеке 1000 * 1000 = 1,000,000 символов. Это плохо.   -  person Ed S.    schedule 22.03.2012
comment
Он инициализирует все члены, но с нулями.   -  person ipc    schedule 22.03.2012
comment
Он не сказал, что массив находится в автоматическом хранилище.   -  person wildplasser    schedule 22.03.2012
comment
Примерно здесь многие люди считают, что использование C++ (и std::vector<char>(1000*1000, ' ');) имеет некоторые преимущества.   -  person Jerry Coffin    schedule 22.03.2012
comment
@wildplasser: Он должен говорить это прямо? Я могу читать код, вы знаете, это массив с автоматическим временем хранения, если я когда-либо видел его.   -  person Ed S.    schedule 22.03.2012
comment
@EdS.: нет, если это объявление области действия файла   -  person Christoph    schedule 22.03.2012
comment
Я не вижу его объявленным внутри тела функции. Я даже не вижу функции. Может быть, ты тоже умеешь читать невидимый код?   -  person wildplasser    schedule 22.03.2012
comment
@Christoph, wildplasser: Хороший вопрос.   -  person Ed S.    schedule 22.03.2012


Ответы (2)


memset(buffer, ' ', sizeof buffer);

Если массив имеет автоматическую продолжительность хранения, рассмотрите возможность выделения кучи, чтобы избежать переполнения стека.

Если массив имеет статическую продолжительность хранения, вам все равно нужно будет инициализировать массив во время выполнения, поскольку невозможно инициализировать элементы ненулевым значением, не предоставляя отдельное значение инициализации для каждого из них.

person Christoph    schedule 21.03.2012

http://linux.die.net/man/3/memset

char *buffer = malloc(1000*1000);
memset(buffer, ' ', 1000*1000);

Вы захотите протестировать код возврата malloc и заменить литералы, но суть в этом.

person jimw    schedule 21.03.2012
comment
malloc без приведения не должно выдавать предупреждение в C, и на самом деле приведение в первую очередь плохо. - person Ed S.; 22.03.2012
comment
На самом деле нет, но я думаю, что memset будет. Он хочет size_t, не так ли? (редактировать: я ошибаюсь, только что попробовал. Предоставление memset int не дает предупреждения. Извините, я отредактирую свой ответ.) - person jimw; 22.03.2012