構造体に名前を付ける必要があります。例えば、
struct foo {
char * str1;
float tt1;
};
次に、次のようにインスタンスを宣言できます。
struct foo var1 = { "This is me", 12 };
次に、関数でvoid *
aにキャストできます。struct foo *
void printStruct(void * ptr) {
printf("str=%s\n", ((struct foo *)ptr)->str1);
}
そして、次のように呼び出すことができます:
int main(...) {
struct foo var1 = { "This is me", 12 };
printStruct(&var1);
}
更新:コメンター Johannes は正しかったです。私の答えは、元の投稿者が各構造体の型を知らないかもしれないと言ったという事実を説明していません。更新されたソリューションは以下のとおりです。
すべての構造体に が含まれていることがわかっているので、構造char * str1
体を のみを含む汎用のタグ付き構造体に直接キャストすることで、C の「フラット メモリ モデル」を利用できますchar * str1
。これは、 が structsの最初の要素である場合にのみ機能char * str1
します。
struct base { char * str1; };
struct { char * str1; float tt1; } var1 = { "This is me", 12 };
struct { char * str1, int tt2; } var2 = { "This is me", 18 };
void printStruct(void * ptr) {
printf("str is %s\n", ((struct base *)ptr)->str1);
}
ただし、これはかなり汚いハックです。共有したい他のメンバーがいる場合、この同じトリックを使用することはできません。
もう 1 つのオプションはstruct
、共用体で実際に使用されている型を追跡するために、列挙子を使用して共用体を使用する を定義することです。
enum { FLOAT_TYPE, INT_TYPE };
struct foo {
char * str1;
union {
float tt1;
int tt2;
} numericValue;
int unionType;
};
これにより、次のように変数を定義できます。
struct foo var1 = { .str1 = "This is me", .numericValue.tt1 =12, .unionType = FLOAT_TYPE };
struct foo var2 = { .str1 = "This is me", .numericValue.tt2 =18, .unionType = INT_TYPE };
struct foo *
次に、さまざまなタイプの構造体を処理する必要はありません。代わりにvoid ポインターをキャストできます。
void printStruct(void * ptr) {
struct foo * p = (struct foo *)ptr;
printf("string is %s\n", p->str1);
}
これにはもう少し作業が必要になるかもしれませんが、IMO の方がはるかにクリーンです。