Инициализиране на голям двуизмерен масив в 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 ще го направи. Иска размер_t, нали? (редактиране: греша, току-що го опитах. Даването на int на memset не дава предупреждение. Извинения, ще редактирам отговора си.) - person jimw; 22.03.2012