История изменений
Исправление firkax, (текущая версия) :
А не нарушает ли твой способ стандарт? Даже если нет - проверь на compiler explorer, чтобы не пришлось всё переделывать потом при смене компилятора.
Компилятор нужен для того, чтобы помогать программисту, а не для того, чтобы портить ему поддержку фич. Не надо менять компилятор с хорошего на плохой.
Ну и чему равен sizeof структуры в этом случае?
Весьма элегантное решение оказалось - ничего не ломает но динамическое поле создаёт.
#include <stdio.h>
typedef struct {
int a;
char b[];
} str_t;
str_t A1 = { .b[4] = 0 };
str_t A2 = { .b[14] = 0 };
str_t A3 = { .b[104] = 0 };
str_t A4 = { .b[1004] = 0 };
int main(void) {
printf("%u %u\n", (unsigned)&A1, sizeof(A1));
printf("%u %u\n", (unsigned)&A2, sizeof(A2));
printf("%u %u\n", (unsigned)&A3, sizeof(A3));
printf("%u %u\n", (unsigned)&A4, sizeof(A4));
return 0;
}
$ ./a.out
4665376 4
4665388 4
4665408 4
4665520 4
Но что меня больше удивило так это то что оно с -std=c89 скомпилилось.
Исходная версия firkax, :
А не нарушает ли твой способ стандарт? Даже если нет - проверь на compiler explorer, чтобы не пришлось всё переделывать потом при смене компилятора.
Компилятор нужен для того, чтобы помогать программисту, а не для того, чтобы портить ему поддержку фич. Не надо менять компилятор с хорошего на плохой.
Ну и чему равен sizeof структуры в этом случае?
Весьма элегантное решение оказалось - ничего не ломает но динамическое поле создаёт.
#include <stdio.h>
typedef struct {
int a;
char b[];
} str_t;
str_t A1 = { .b[4] = 0 };
str_t A2 = { .b[14] = 0 };
str_t A3 = { .b[104] = 0 };
str_t A4 = { .b[1004] = 0 };
int main(void) {
printf("%u %u\n", (unsigned)&A1, sizeof(A1));
printf("%u %u\n", (unsigned)&A2, sizeof(A2));
printf("%u %u\n", (unsigned)&A3, sizeof(A3));
printf("%u %u\n", (unsigned)&A4, sizeof(A4));
return 0;
}
$ ./a.out
4665376 4
4665388 4
4665408 4
4665520 4