Вы должны дать имена своим структурам. Например,
struct foo {
char * str1;
float tt1;
};
Тогда вы можете объявить свои экземпляры так:
struct foo var1 = { "This is me", 12 };
Затем вы можете привести void *
к 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);
}
Обновление: Комментатор Йоханнес был прав, мой ответ не учитывает тот факт, что оригинальный автор сказал, что он может не знать тип каждой структуры. Обновленное решение ниже:
Поскольку вы знаете, что все ваши структуры содержат char * str1
, вы можете воспользоваться «моделью плоской памяти» C, приведя ваши структуры непосредственно к общей теговой структуре, которая содержит только char * str1
. Это будет работать только если 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);
}
Это довольно грязный хак, IMO. Если есть другие участники, которыми вы хотите поделиться, вы не сможете использовать этот же трюк.
Другой вариант - определить 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 printStruct(void * ptr) {
struct foo * p = (struct foo *)ptr;
printf("string is %s\n", p->str1);
}
Это может потребовать немного больше работы, но это намного чище, ИМО.