Я наткнулся на фрагмент кода, который, по моему мнению, должен давать сбой из-за ошибки сегментации, и все же он работает без сучка и задоринки. Рассматриваемый код плюс соответствующая структура данных выглядит следующим образом (с соответствующим комментарием, найденным прямо выше):
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]));
}
Почему это работает? Я полагаю, что sizeof для char* будет соответствовать размеру указателя в данной архитектуре, но не должен ли он падать и гореть при разыменовании NULL
-указателя?
malloc()
в C. - person unwind   schedule 05.11.2013sizeof
, скорее всего, является внутренним для компилятора, вы часто можете наблюдать такое поведение языка в интересной и осязаемой форме, взглянув на реализациюoffsetof
вашей стандартной библиотеки: вероятно, она принимает адрес члена данных фиктивного объекта, созданного приведением Указатель 0/NULL... это даже ближе к пропасти, чемsizeof
, но вполне законно. - person Tony Delroy   schedule 05.11.2013sizeof(def->path[0])
это1
по определению, поэтому оператор return сворачивается до гораздо более читаемого:return malloc(sizeof(RouteDefinition) + nBags);
- person Klas Lindbäck   schedule 05.11.2013