这个错误有没有简单的解释?
request for member '*******' in something not a structure or union
在我学习C语言的过程中,我遇到了几次这个问题,但我不知道它的含义。
如果您尝试访问一个实例,但是使用了指针,或者反之亦然,也会发生这种情况:
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 */
typedef
定义了一个指针类型,即在 typedef
中包含了 *
,那么这将会变得非常棘手:typedef struct foo* Foo;
这是因为有时候代码看起来像是在处理实例,但实际上是在处理指针:
Foo a_foo = get_a_brand_new_foo();
a_foo->field = FANTASTIC_VALUE;
a_foo.field
,但是这样会失败,因为Foo
是指向结构体的指针。我强烈建议不要在C语言中使用typedef
关键字定义指针类型,指针很重要,不要隐藏星号,让它们发光。struct {
int a;
int b;
} foo;
int fum;
fum.d = 5;
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;
}
s
必须包含在括号内。正确的代码是:scanf("%d",&( (*s)->a[++(*s)->head]));
我已经列举出可能导致代码中出现此错误的所有情况及其注释。如果您遇到更多情况,请添加。
#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
}
.
。 (情况2和4) ->
。 (情况1和3)(*ptr)。
和 (*ptr)->
vs *ptr。
和 *ptr->
(除了情况1外的所有情况)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文件:
.
.
.
if (getStatus().CHIP_RDY) /* This will generate the error, you must add the #include "foo.h" */
.
.
.
https://dev59.com/Y3I95IYBdhLWcg3wtwb4#42668014
上面是对同一个问题的回答。我想补充一个我遇到的案例。typedef struct Node{
int data;
Node *next;
} Node;
typedef struct Node{
int data;
struct Node *next;
} Node;
或者
typedef struct Node Node;
struct Node{
int data;
Node *next;
};
Node
是什么。如果出现以下情况,也可能会出现:
struct foo { int x, int y, int z }foo;
foo.x=12
而不是
struct foo { int x; int y; int z; }foo;
foo.x=12
我荒谬的经历是我错误地使用了“.”而不是“,”。
printf("%c". ch);
当我尝试访问成员时,我看到了这个。
我的结构体是这样的:
struct test {
int a;
int b;
};
struct test testvar;
通常我们访问结构成员时会这样做:
testvar.a;
testvar.b;
我错误地将 testvar 视为指针并执行了这个操作。
testvar->a;
那时我看到了这个错误。
请求访问非结构体或联合体的成员“a”