Praveenupadrasta
Praveenupadrasta

Reputation: 51

How to access a structure member without knowing the name?

How can we access a structure's member without knowing the name of it?

For example : This is my struct.

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

Now I want to access char member of the struct A without using it's name.

I have only a pointer to that structure.

Example : struct A *temp;

Now I need to access with 'temp'.

I know the question is simillar to this How would you access a C structure's members without knowing the name?, but it doesn't clarified my doubt.

Upvotes: 0

Views: 5317

Answers (5)

Sravan Upadrasta
Sravan Upadrasta

Reputation: 67

The below code should work

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;

Upvotes: 0

Sigve Kolbeinson
Sigve Kolbeinson

Reputation: 1161

From the comments, I understand you have the following function

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

If you can include the file that has struct A's definition, do so

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

If you can't include the file, do what Luc Forget suggested in his answer: Declare a struct B with identical structure, and cast temp to struct B. Because struct B have the same memory layout as struct A, accessing ((struct B*)temp)->e is identical to accessing A->b.

Upvotes: 2

riodoro1
riodoro1

Reputation: 1256

If You know the types and order of members (as well as packing) then You can create another struct and cast a pointer, like so:

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

Upvotes: 1

lforg37
lforg37

Reputation: 95

If you what are the structure fields, I think the simplest way of accessing the fields is to declare another structure Struct B with the same fields and casting your struct A* to struct B and then accessing the fields in a "traditional" way. Here is a simple example of what I mean :

#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);
}

Here printStruct "doesn't know" the field names of Struct A but can access them

Upvotes: 1

Eduard Rostomyan
Eduard Rostomyan

Reputation: 6566

I guess one way is to cast and increment the char* , but in this case you must know the types and order of declarations of your members.

Upvotes: 0

Related Questions