柔軟な配列メンバーを持つ次の構造体があります。
struct test {
size_t sz;
const char str[];
};
ここで、この構造体を連続して (配列のように) 配置するためにメモリを割り当てたいと考えています。struct test test_arr[]
問題は、未定義の動作のような宣言です。6.7.2.1(p3)
:
複数の名前付きメンバーを持つ構造体の最後のメンバーは、不完全な配列型を持つ可能性があります。そのような構造体 (およびそのような構造体であるメンバーをおそらく再帰的に含む共用体) は、構造体のメンバーまたは配列の要素であってはなりません。
によって返されるポインターはmalloc
、基本的なアラインメントを使用して任意のオブジェクト型へのポインターに変換できることがわかっています。次のコードを検討してください。
void *obj= malloc(100 * sizeof(struct test)); //enough memory
struct test *t1 = obj;
t1 -> sz = 2;
t1 -> str = {'a', 'b'};
struct test *t2 = (void *) (((char *) obj) + sizeof(struct test) + sizeof(char[2])); // non conforming
そうするための適合方法は何ですか?