Инициализировать все элементы массива значением с помощью составных литералов

float myArray[myArraySize] = {1};

в выражении выше только первый элемент init с 1. Как вы можете инициализировать все элементы со значением, используя составные литералы (не memset)?

Я использую GCC 4.2 в unix для компиляции.

6 ответов


этой

float myArray[100] = {[0 ... 99] = 1.0};

Как вы делаете это.

посмотреть Назначенные Инициализаторы в документах GCC, в которых говорится:

чтобы инициализировать диапазон элементов с тем же значением, напишите `[first ... последние] = значение'.


нет, только первый элемент будет инициализирован до 1.0. Остальные будут инициализированы, но до 0,0 в стандарт C. Взгляните на C faq дополнительные примеры.


С языка стандартный:

инициализации 6.7.8
...
10 если объект с автоматической длительностью хранения не инициализирован явно, его значение не определено. Если объект со статической длительностью хранения не инициализируется явно, то:
- если он имеет тип указателя, он инициализируется нулевым указателем;
- если он имеет арифметический тип, он инициализируется (положительный или нет) ноль;
- если это является агрегатом, каждый член инициализируется (рекурсивно) в соответствии с этими правилами;
- если это объединение, первый именованный член инициализируется (рекурсивно) в соответствии с этими правила.
...
21 Если в списке, заключенном в скобки, меньше инициализаторов, чем элементов или членов или меньше символов в строковом литерале, используемом для инициализации массива известных размер чем элементы в массиве, остаток компосита будет инициализированный неявно то же самое, что и объекты со статической длительностью хранения.

int arr[10]={1} и int arr[10]={0} производства точно такой же результат - элемент 0 инициализируется тем, что указано между фигурными скобками, а элементы 1-9 инициализируются до 0 на основе пунктов 10 и 21 выше. Это только появляется отличаться, потому что в одном случае явный инициализатор совпадает с неявным инициализатором.


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

float myArray[4] = {1, 1, 1, 1};

вы можете найти, что простой for цикл приведет к наиболее поддерживаемому коду. Я, конечно, не буду поощрять использование memset здесь.


как вы можете ввести все элементы со значением, используя эту формулу (не memset)?

С петлей. Вы не можете сделать это в здравом уме и портативным способом с memset.

float myArray[myArraySize] = {1};
for (size_t i=0; i<myArraySize; i++)
    myArray[i] = 1.;

это может показаться уродливым, но это путь C (и он становится красивее, если вы переименуете myArraySize что-то вроде N). В качестве альтернативы, если количество элементов фиксировано, вы можете просто перечислить массив и, возможно, оставить размер:

float myArray[] = {1., 1., 1., 1., 1., 1.};

инициализация любого массива в современных версиях C инициализирует все не указанные записи до нуля.

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

для массивов без символов вы должны написать цикл.