Инициализация указателя на составные литералы в C
Вот один не очень распространенный способ инициализации указателя:
int *p = (int[10]){[1]=1};
Здесь указатель указывает на составные литералы.
#include <stdio.h>
int main(void)
{
int *p = (int[10]){[1]=1};
printf("%d\n", p[1]);
}
Выход:
1
Эта программа скомпилирована и прекрасно работает в компиляторе G++.
Так,
Это правильный способ инициализации указателя на составные литералы? или же
Это неопределенное поведение инициализировать указатель на составные литералы?
1 ответ
Решение
Да, допустимо иметь указатель на составные литералы. Стандарт это позволяет.
n1570-§6.5.2.5 (p8):
ПРИМЕР 1 Определение области файла
int *p = (int []){2, 4};
инициализирует
p
указывать на первый элемент массива из двух целых, первый из которых имеет значение два, а второй - четыре. Выражения в этом составном литерале должны быть постоянными. Безымянный объект имеет статическую продолжительность хранения.