Инициализация указателя на составные литералы в 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 указывать на первый элемент массива из двух целых, первый из которых имеет значение два, а второй - четыре. Выражения в этом составном литерале должны быть постоянными. Безымянный объект имеет статическую продолжительность хранения.

Другие вопросы по тегам