私はシステムを開発しています(仮想マシン?これを呼び出す方法がわからない)すべてのデータ構造が配列(または構造体)であり、先頭に3つの整数フィールドがあります(これはバイトをパディングせずに次々と先頭にある必要があります)およびnジェネリック ポインター。私はこれについて多くのことを考えましたが、明確な解決策を見つけるのは難しいようです.
以下は私の最初の試みです。
void **a = malloc(SOME_SIZE);
a[0] = (void *)1;
a[1] = (void *)0;
a[2] = (void *)1;
a[3] = malloc(SOME_SIZE); a[4] = malloc(SOME_SIZE); //and so on...
void *
ここでは、整数へのキャストが安全かどうかわかりませんでした。少し勉強した後、次のようにコードを変更しました。
void **a = malloc(SOME_SIZE);
*(uintptr_t *)a = 1;
*((uintptr_t *)a + 1) = 0;
*((uintptr_t *)a + 2) = 1;
a[3] = malloc(SOME_SIZE); a[4] = malloc(SOME_SIZE); //and so on...
しかし、一部のプラットフォームでsizeof(void *)
はsizeof(uintptr_t)
. そこで、これを構造体に変更することにしました。
typedef struct data {
size_t counts[3]; //padding bytes are okay after this line
void *members[]; //flexible array member
} *data;
data a = malloc(sizeof(*a) + SOME_SIZE);
a->counts[0] = 1;
a->counts[1] = 0;
a->counts[2] = 1;
a->members[0] = malloc(SOME_SIZE); a->members[1] = malloc(SOME_SIZE); //and so on...
ここで、C には 100% 移植可能なジェネリック ポインターがないという問題を発見しましたが、その解決策を見つけることができないので、いくつかの異なるポインター サイズを持ついくつかの奇妙なプラットフォームを無視させてください。
a が任意のオブジェクトへのポインターを格納できることを考えると、void *
私の最後の解決策は私の目的を満たしていますか? 私は柔軟な配列メンバーにあまり慣れていないので、間違いを犯した可能性があります。または、まだ見落としている点があるかもしれません。
どんな助けでも感謝します。