LINUX.ORG.RU

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

Исправление 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