如何访问函数中的结构成员,使其成为void*类型?

Ahm*_*mad 3 c structure void

我希望有一个函数接受不同类型的结构作为参数.所以,由于我没有特定的类型,我必须使用void*.现在的问题是:当我将结构传递给此函数时,如何在函数内访问此结构的已知成员?具体来说,我知道所有结构都有str1作为成员,我想要,例如,打印它.这是一个示例代码:

struct {  
  char* str1;  
  float tt1; } var1 = {"This is me", 12};  

struct {  
   char* str1;  
   int   tt2; } var2 = {"This is you", 18};  

void printStruct(void* str)  
{  
   printf("\n the structure string is %s", ??);   
  //can I put something in ?? to print the string?  
}

main(....)  
{  
   printStruct(&var1);  
   printStruct(&var2);  
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*itb 7

您可以传递函数指针以将函数与其用户分离

void printStruct(void* data, char * (*namef)(void *data)) {  
   printf("\n the structure string is %s", namef(data));    
}
Run Code Online (Sandbox Code Playgroud)

然后假设您传递struct S1*给函数,您可以传递一个这样的getter:

char * whois(void *data) {
  return ((struct S1*)data)->str1;
}

int main(void) {
  struct S1 s = {"This is me", 12};
  printStruct(&s, whois);
}
Run Code Online (Sandbox Code Playgroud)

offsetof尽管如此,你可以使用更加丑陋的替代品

void printStruct(void* data, size_t named) {  
   printf("\n the structure string is %s", *(char**) ((char*)data + named));    
}

int main(void) {
  struct S1 s = {"This is me", 12};
  printStruct(&s, offsetof(struct S1, str1));
}
Run Code Online (Sandbox Code Playgroud)

offsetof是一个宏,它为您提供结构中成员的偏移量.在函数中,您将指针定位到char*成员(因此您必须转换char**为获取适当的类型)并获取成员值.

但是,我更喜欢使用函数的第一种方式.这样,print函数甚至不必知道data指向结构.它可以将它作为黑盒子移交给getter函数,在其中你可以让编译器为你处理低级偏移量计算.


小智 6

您可以将其转换为您想要的类型,然后访问该成员,例如,假设您有原型,请执行以下操作:

struct X
{
char* str1;  
float tt1; } var1 = {"This is me", 12};  

void printStruct(void* str)
{
    ((struct X *)str)->str1;
    ...
}
Run Code Online (Sandbox Code Playgroud)

注意使用括号; 所发生的是一个类型为void*到struct var2*的强制转换,这个类型在最外面的()括号内,可以作为该类型的变量进行访问.