What does "request for member '*******' in something not a structure or union" mean?

CStructUnions

C Problem Overview


Is there an easy explanation for what this error means?

request for member '*******' in something not a structure or union

I've encountered it several times in the time that I've been learning C, but I haven't got a clue as to what it means.

C Solutions


Solution 1 - C

It also happens if you're trying to access an instance when you have a pointer, and vice versa:

struct foo
{
  int x, y, z;
};

struct foo a, *b = &a;

b.x = 12;  /* This will generate the error, should be b->x or (*b).x */

As pointed out in a comment, this can be made excruciating if someone goes and typedefs a pointer, i.e. includes the * in a typedef, like so:

typedef struct foo* Foo;

Because then you get code that looks like it's dealing with instances, when in fact it's dealing with pointers:

Foo a_foo = get_a_brand_new_foo();
a_foo->field = FANTASTIC_VALUE;

Note how the above looks as if it should be written a_foo.field, but that would fail since Foo is a pointer to struct. I strongly recommend against typedef:ed pointers in C. Pointers are important, don't hide your asterisks. Let them shine.

Solution 2 - C

You are trying to access a member of a structure, but in something that is not a structure. For example:

struct {
    int a;
    int b;
} foo;
int fum;
fum.d = 5;

Solution 3 - C

It may also happen in the following case:

eg. if we consider the push function of a stack:

typedef struct stack
{
    int a[20];
    int head;
}stack;

void push(stack **s)
{
    int data;
    printf("Enter data:");
    scanf("%d",&(*s->a[++*s->head])); /* this is where the error is*/
}

main()
{
    stack *s;
    s=(stack *)calloc(1,sizeof(stack));
    s->head=-1;
    push(&s);
    return 0;
}

The error is in the push function and in the commented line. The pointer s has to be included within the parentheses. The correct code:

scanf("%d",&( (*s)->a[++(*s)->head]));

Solution 4 - C

I have enumerated possibly all cases where this error may occur in code and its comments below. Please add to it, if you come across more cases.

#include<stdio.h>
#include<malloc.h>

typedef struct AStruct TypedefedStruct;

struct AStruct
{
	int member;
};

void main()
{
	/*  Case 1
	    ============================================================================
	    Use (->) operator to access structure member with structure pointer, instead
		of dot (.) operator. 
	*/
	struct AStruct *aStructObjPtr = (struct AStruct *)malloc(sizeof(struct AStruct));
	//aStructObjPtr.member = 1;      //Error: request for member ‘member’ in something not 
	                                  //a structure or union. 
								      //It should be as below.
	aStructObjPtr->member = 1;
	printf("%d",aStructObjPtr->member); //1
	

	/*  Case 2
	    ============================================================================
	    We can use dot (.) operator with struct variable to access its members, but 
		not with with struct pointer. But we have to ensure we dont forget to wrap 
		pointer variable inside brackets.
	*/
	//*aStructObjPtr.member = 2;     //Error, should be as below.
	(*aStructObjPtr).member = 2;
	printf("%d",(*aStructObjPtr).member); //2
	
	
	/* Case 3
	   =============================================================================
	   Use (->) operator to access structure member with typedefed structure pointer, 
	   instead of dot (.) operator. 
	*/
	TypedefedStruct *typedefStructObjPtr = (TypedefedStruct *)malloc(sizeof(TypedefedStruct));
	//typedefStructObjPtr.member=3;  //Error, should be as below.
	typedefStructObjPtr->member=3;
	printf("%d",typedefStructObjPtr->member);  //3

	
	/*  Case 4
	    ============================================================================
	    We can use dot (.) operator with struct variable to access its members, but 
		not with with struct pointer. But we have to ensure we dont forget to wrap 
		pointer variable inside brackets.
	*/
	//*typedefStructObjPtr.member = 4;  //Error, should be as below.	
	(*typedefStructObjPtr).member=4;
	printf("%d",(*typedefStructObjPtr).member);  //4
	
	
	/* Case 5
	   ============================================================================
	   We have to be extra carefull when dealing with pointer to pointers to 
	   ensure that we follow all above rules.
	   We need to be double carefull while putting brackets around pointers.
	*/
	
	//5.1. Access via struct_ptrptr and  ->
	struct AStruct **aStructObjPtrPtr = &aStructObjPtr;
	//*aStructObjPtrPtr->member = 5;  //Error, should be as below.
	(*aStructObjPtrPtr)->member = 5;
	printf("%d",(*aStructObjPtrPtr)->member); //5
	
	//5.2. Access via struct_ptrptr and .
	//**aStructObjPtrPtr.member = 6;  //Error, should be as below.
	(**aStructObjPtrPtr).member = 6;
	printf("%d",(**aStructObjPtrPtr).member); //6
	
	//5.3. Access via typedefed_strct_ptrptr and ->
	TypedefedStruct **typedefStructObjPtrPtr = &typedefStructObjPtr;
	//*typedefStructObjPtrPtr->member = 7;  //Error, should be as below.
	(*typedefStructObjPtrPtr)->member = 7;
	printf("%d",(*typedefStructObjPtrPtr)->member); //7
	
	//5.4. Access via typedefed_strct_ptrptr and .
	//**typedefStructObjPtrPtr->member = 8;  //Error, should be as below.
	(**typedefStructObjPtrPtr).member = 8;
	printf("%d",(**typedefStructObjPtrPtr).member); //8
	
	//5.5. All cases 5.1 to 5.4 will fail if you include incorrect number of *
	//     Below are examples of such usage of incorrect number *, correspnding
	//     to int values assigned to them
	
	//(aStructObjPtrPtr)->member = 5; //Error
	//(*aStructObjPtrPtr).member = 6; //Error 
	//(typedefStructObjPtrPtr)->member = 7; //Error 
	//(*typedefStructObjPtrPtr).member = 8; //Error
}

The underlying ideas are straight:

  • Use . with structure variable. (Cases 2 and 4)
  • Use -> with pointer to structure. (Cases 1 and 3)
  • If you reach structure variable or pointer to structure variable by following pointer, then wrap the pointer inside bracket: (*ptr). and (*ptr)-> vs *ptr. and *ptr-> (All cases except case 1)
  • If you are reaching by following pointers, ensure you have correctly reached pointer to struct or struct whichever is desired. (Case 5, especially 5.5)

Solution 5 - C

It may means that you forgot include a header file that define this struct/union. For example:

foo.h file:

typedef union
{
	struct
	{
		uint8_t	FIFO_BYTES_AVAILABLE	: 4;
		uint8_t	STATE					: 3;
		uint8_t	CHIP_RDY				: 1;
	};
	uint8_t status;
} RF_CHIP_STATUS_t;

RF_CHIP_STATUS_t getStatus();

main.c file:

.
.
.
if (getStatus().CHIP_RDY) /* This will generate the error, you must add the  #include "foo.h" */
.
.
.

Solution 6 - C

can also appear if:

struct foo {   int x, int y, int z }foo; 

foo.x=12

instead of

struct foo {   int x; int y; int z; }foo; 

foo.x=12

Solution 7 - C

I saw this when I was trying to access the members.

My struct was this:

struct test { 
    int a;
    int b;
};
    
struct test testvar;

Normally we access structure members as

testvar.a;
testvar.b;

I mistook testvar to be a pointer and did this.

testvar->a;

That's when I saw this error.

> request for member ‘a’ in something not a structure or union

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPieterView Question on Stackoverflow
Solution 1 - CunwindView Answer on Stackoverflow
Solution 2 - CThomas Padron-McCarthyView Answer on Stackoverflow
Solution 3 - CKaustav RayView Answer on Stackoverflow
Solution 4 - CMahesha999View Answer on Stackoverflow
Solution 5 - CDenys YurchenkoView Answer on Stackoverflow
Solution 6 - CNahumView Answer on Stackoverflow
Solution 7 - CmosaView Answer on Stackoverflow