これは、古いCコンパイラ(C99より前)の一般的なトリックです。コンパイラを使用すると、forward
宣言された長さの終わりを超えた要素を、struct
;の最後の要素であるときに逆参照できます。次に、次のように、追加の要素にmalloc
十分なメモリを使用できます。node
nodeStructure *ptr = malloc(sizeof(nodeStructure)+4*sizeof(node));
for (int i = 0 ; i != 5 ; i++) { // The fifth element is part of the struct
ptr->forward[i] = ...
}
free(ptr);
このトリックを使用すると、個別の動的割り当てなしで、可変サイズの配列を構造体に埋め込むことができます。別の解決策は宣言することですが、それとは別に宣言するnode *forward
必要がありmalloc
、 sの数が不必要に倍増し、メモリの断片化が増える可能性があります。free
nodeStructure
malloc
上記のフラグメントがハックなしでどのように見えるかを次に示します。
typedef struct nodeStructure{
keyType key;
valueType value;
node *forward;
};
nodeStructure *ptr = malloc(sizeof(nodeStructure));
ptr->forward = malloc(5*sizeof(node));
for (int i = 0 ; i != 5 ; i++) {
ptr->forward[i] = ...
}
free(ptr->forward);
free(ptr);
編集(Adam Rosenfieldによるコメントへの応答):C99では、次のようにサイズのない配列を定義できます。node forward[];
これは柔軟な配列メンバーと呼ばれ、C99標準のセクション6.7.2.1.16で定義されています。