セグメンテーション違反でクラッシュするはずのコードのスニペットに出くわしましたが、それでも問題なく動作します。問題のコードと関連するデータ構造は次のとおりです (関連するコメントはすぐ上にあります)。
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]));
}
なぜこれが機能するのですか?char * のサイズは、指定されたアーキテクチャのポインターのサイズに解決されると思いますが、ポインターを逆参照しているときにクラッシュして燃えてはいけませんかNULL
?