Инициализация массива с {0}, {0,}?

Скажем, я хочу инициализировать myArray

char myArray[MAX] = {0}; 
char myArray[MAX] = {0,}; 
char myArray[MAX]; memset(myArray, 0, MAX);

Все ли они равны или предпочтительнее других?

Спасибо

6 ответов

Они эквивалентны сгенерированному коду (по крайней мере, в оптимизированных сборках), поскольку, когда массив инициализируется синтаксисом {0}, все значения, которые явно не указаны, неявно инициализируются с помощью 0, и компилятор будет достаточно знать, чтобы вставить вызов memset.

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


Собственно, я лично рекомендую:

char myArray[MAX] = {};

Все они делают то же самое, но мне это нравится лучше; это наиболее красноречиво. = D

Кстати, обратите внимание, что char myArray[MAX] = {1}; делает не инициализировать все значения до 1! Он только инициализирует первое значение равным 1, а остальное - нулю. Из-за этого я рекомендую вам не писать char myArray[MAX] = {0};, поскольку он немного вводит в заблуждение для некоторых людей, хотя он работает правильно.


Я думаю, что первое решение лучше всего.

char myArray[MAX] = {0}; //best of all


Можно либо использовать

Но я чувствую, что ниже понятнее и читабельнее.

char myArray[MAX]; 
 memset(myArray, 0, MAX);


Предполагая, что вы всегда хотите инициализировать с помощью 0.

- > Ваш первый способ и второй способ - то же самое. Я предпочитаю 1-й.

- > Третий способ memset() должен использоваться, если вы хотите назначить 0s, кроме инициализации.

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


Вы также можете использовать bzero fn (записать нулевые байты)

#include <strings.h>
void bzero(void *s, size_t n)
</strings.h>

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

licensed under cc by-sa 3.0 with attribution.