Разыменование нулевого указателя допустимо в операции sizeof [duplicate]
На этот вопрос уже есть ответ:
Почему моя программа не вызывает ошибку, когда я разыменую нулевой указатель внутри malloc? 4 ответаЯ натолкнулся на фрагмент кода, который, по-моему, должен завершиться с ошибка сегментации, и все же это работает без помех. Рассматриваемый код плюс соответствующая структура данных выглядит следующим образом (соответствующий комментарий находится справа вверху):
typedef struct {
double length;
unsigned char nPlaced;
unsigned char path[0];
}
RouteDefinition* Alloc_RouteDefinition()
{
// NB: The +nBags*sizeof.. trick "expands" the path[0] array in RouteDefinition
// to the path[nBags] array
RouteDefinition *def = NULL;
return (RouteDefinition*) malloc(sizeof(RouteDefinition) + nBags * sizeof(def->path[0]));
}
Почему это работает? Я понимаю, чразме the Символ * разрешается до размера указателя в данной архитектуре, но не должен аварийно завершить работу и сгореть при разыменованииNULL
-указатель