LINUX.ORG.RU

История изменений

Исправление mxfm, (текущая версия) :

«invalid» это не UB, а «не скомпилируется»

В стандарте написано, что само declaration is invalid, при этом чтение/запись в flexible array member (за исключением первого элемента при определённых случаях) - это UB («The assignment to t1.d[0] is probably undefined behavior, but it is possible that …»). Короче говоря, писать или читать из такого массива для практических целей - UB.

Ничего не понятно. gcc для этой конструкции выделяет SIZE+1 байт, в послений из которых записывает то что после знака равенства (потому что это инициализация SIZE-ного элемента массива).

Речь о том, что в конструкции var = {.arr[5]=0}; память выделяется только для одного char, а не для пяти (в независимости от того, что понималось под SIZE - индекс или размер массива). Даже если под SIZE понимался индекс массива (допустим 5), как создать массив с размером меньше, чем 5? В любом случае на моей машине gcc выделяет не SIZE+1 байт, а ровно 1 байт.

Чтобы инициализировать весь массив, а не символ, надо писать .arr = «text» (будет 5 байт, указать явно нельзя).

Инициализировать массив можно так: var = {.arr[5]= {‘A’, ‘B’, ‘C’} }, но судя по дампу gcc выделяет память только для A, для остальных жалуется на избыточность списка. Я не понимаю как у автора работал код из первого поста.

Исходная версия mxfm, :

«invalid» это не UB, а «не скомпилируется»

В стандарте написано, что само declaration is invalid, при этом чтение/запись в flexible array member (за исключением первого элемента при определённых случаях) - это UB («The assignment to t1.d[0] is probably undefined behavior, but it is possible that …»). Короче говоря, писать или читать из такого массива для практических целей - UB.

Ничего не понятно. gcc для этой конструкции выделяет SIZE+1 байт, в послений из которых записывает то что после знака равенства (потому что это инициализация SIZE-ного элемента массива).

Речь о том, что в конструкции var = {.arr[5]=0}; память выделяется только для одного char, а не для пяти (в независимости от того, что понималось под SIZE - индекс или размер массива). Даже если под SIZE понимался индекс массива (допустим 5), как создать массив с размером меньше, чем 5? В любом случае на моей машине gcc выделяет не SIZE+1 байт, а ровно 1 байт.

Чтобы инициализировать весь массив, а не символ, надо писать .arr = «text» (будет 5 байт, указать явно нельзя).

Инициализировать массив можно так: var = {.arr[5]= {‘A’, ‘B’, ‘C’} }, но судя по дампу gcc выделяет память только для A, для остальных жалуется на избыточность списка. Я не понимаю, как у автора код из первого поста.