如何在不知道名称的情况下访问结构成员?

时间:2015-07-27 09:00:46

标签: c++ c struct

我们如何在不知道其名称的情况下访问结构的成员?

例如:这是我的结构。

struct A
{
   int a;
   char b;  
   int c;
 }

现在我想访问结构A的char成员而不使用它的名字。

我只有一个指向该结构的指针。

示例:struct A * temp;

现在我需要访问' temp'。

我知道这个How would you access a C structure's members without knowing the name?的问题是相似的, 但它并没有澄清我的怀疑。

5 个答案:

答案 0 :(得分:2)

从评论中,我了解到您有以下功能

struct A;
void foo( struct A * temp )
{
    // access temp->b here
}

如果您可以包含具有结构A定义的文件,请执行此操作

#include "A.h"
void foo( struct A * temp )
{
    do_something_with_b(temp->b);
}

如果您不能包含该文件,请执行Luc Forget在其答案中建议的内容: 声明具有相同结构的struct B,并将temp投射到struct B。由于struct B的内存布局与struct A相同,因此访问((struct B*)temp)->e与访问A->b相同。

答案 1 :(得分:1)

如果你是什么结构字段,我认为访问字段的最简单方法是声明另一个具有相同字段的结构B,并将结构A *转换为结构B,然后访问&#34中的字段;传统"办法。 这是我的意思的一个简单例子:

#include <stdlib.h>
#include <stdio.h>

struct A {
    int a;
    char b;
    int c;
};

struct B {
    int d;
    char e;
    int f;
};

void printStruct(void* struct_ptr)
{
    struct B *tmp = struct_ptr; 
    fprintf(stdout, "a:%d b:%c c:%d\n", tmp->d, tmp->e, tmp->f);
}

int main(int argc, char** argv)
{
    struct A test = { 42, 'A', 24 };
    printStruct(&test);
}

这里printStruct&#34;不知道&#34;结构A的字段名称但可以访问它们

答案 2 :(得分:1)

如果您知道成员的类型和顺序(以及打包)那么您可以创建另一个结构并投射指针,如下所示:

struct AMirror {
  int a;
  char b;
  int c;
};
void function_to_use_struct(AMirror *ptr);
...
A *s;
...
function_to_use_struct((AMirror*)s);

答案 3 :(得分:0)

我想一种方法是强制转换char*,但在这种情况下,您必须知道成员声明的类型和顺序。

答案 4 :(得分:0)

以下代码应该有效

void *b=temp;
int *c = (int *) b;
cout<<"Value1: "<<*c <<endl;
char *cc =(char *) (b+4);
cout<<"Char1: "<<*cc<<endl;
c =(int *) (b+6);
cout<<"Value2: "<<*c<<endl;