LINUX.ORG.RU

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

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

Неизвестное распределение памяти - это не UB, я уже писал об этом. А запись за конец массива некоторые специально используют для разных целей. Одно из применений:

struct x {
  int a;
  int b;
  char str[1];
};

struct x *p;
p = malloc(sizeof(struct x)+10);
p->str[5] = 1;
С помощью malloc ты выделяешь кусок памяти больший чем формальный размер структуры, и пользуешься им как структурой у которой последний массив более длинный чем указано в описании. При этом с точки зрения компилятора это всё ещё остаётся записью за границу массива.

Применение «неизвестного распределения»:

void dump_stack(void) {
  size_t j;
  for(j=0; j<256; j++) {
    printf("%02X ", *(((unsigned char*)&j)+j));
    if((j%16)==15) printf("\n");
  }
}

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

Неизвестное распределение памяти - это не UB, я уже писал об этом. А запись за конец массива некоторые специально используют для разных целей. Одно из применений:

struct x {
  int a;
  int b;
  char str[1];
};

struct x *p;
p = malloc(sizeof(struct x)+10);
p->str[5] = 1;
С помощью malloc ты выделяешь кусок памяти больший чем формальный размер структуры, и пользуешься им как структурой у которой последний массив более длинный чем указано в описании. При этом с точки зрения компилятора это всё ещё остаётся записью за границу массива.