C 什么是;会员申请'*******';在非结构或联盟的事物中”;什么意思?

C 什么是;会员申请'*******';在非结构或联盟的事物中”;什么意思?,c,struct,unions,C,Struct,Unions,这个错误意味着什么,有没有简单的解释 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

这个错误意味着什么,有没有简单的解释

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
s是一个指针,即在typedef中包含
*
,这可能会让人非常痛苦,例如:

typedef struct foo* Foo;
因为这样一来,代码看起来像是在处理实例,而实际上它是在处理指针:

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

请注意,上面的内容看起来似乎应该写入
a_foo.field
,但这将失败,因为
foo
是指向struct的指针。我强烈建议不要使用
typedef
:C中的ed指针。指针很重要,不要隐藏星号。让它们发光。

您试图访问结构的一个成员,但访问的对象不是结构。例如:

struct {
    int a;
    int b;
} foo;
int fum;
fum.d = 5;
如果出现以下情况,也可以显示:

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

foo.x=12
而不是

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

foo.x=12

在以下情况下也可能发生这种情况:

如果我们考虑栈的推送函数:

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]));

这可能意味着您忘记包含定义此结构/联合的头文件。 例如:

struct {
    int a;
    int b;
} foo;
int fum;
fum.d = 5;
foo.h文件:

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" */
.
.
.

我列举了可能在代码及其注释中出现此错误的所有情况。如果你遇到更多的情况,请加上

#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
}
#包括
#包括
typedef结构AStruct TypedefedStruct;
结构构造
{
国际会员;
};
void main()
{
/*案例1
============================================================================
改为使用(->)运算符使用结构指针访问结构成员
关于点(.)运算符。
*/
struct AStruct*aStructObjPtr=(struct AStruct*)malloc(sizeof(struct AStruct));
//aStructObjPtr.member=1;//错误:请求某些内容中的成员'member'
//结构或联合体。
//它应该如下所示。
aStructObjPtr->member=1;
printf(“%d”,aStructObjPtr->member);//1
/*案例2
============================================================================
我们可以使用点(.)运算符和结构变量来访问其成员,但是
不是结构指针。但是我们必须确保我们不会忘记包装
括号内的指针变量。
*/
//*aStructObjPtr.member=2;//错误,应如下所示。
(*aStructObjPtr)。成员=2;
printf(“%d”,(*aStructObjPtr.member);//2
/*案例3
=============================================================================
使用(->)运算符使用typedefed结构指针访问结构成员,
而不是点(.)运算符。
*/
TypedefedStruct*typedefStructObjPtr=(TypedefedStruct*)malloc(sizeof(TypedefedStruct));
//typedefStructObjPtr.member=3;//错误,应如下所示。
typedefStructObjPtr->member=3;
printf(“%d”,typedefStructObjPtr->member);//3
/*案例4
============================================================================
我们可以使用点(.)运算符和结构变量来访问其成员,但是
不是结构指针。但是我们必须确保我们不会忘记包装
括号内的指针变量。
*/
//*typedefStructObjPtr.member=4;//错误,应如下所示。
(*typedefStructObjPtr).member=4;
printf(“%d”,(*typedefStructObjPtr.member);//4
/*案例5
============================================================================
在处理指向的指针时,我们必须格外小心
确保我们遵守上述所有规则。
在指针周围放括号时,我们需要加倍小心。
*/
//5.1.通过struct_ptrpr和->
结构AStruct**aStructObjPtrPtr=&aStructObjPtr;
//*AstructObjptr->member=5;//错误,应如下所示。
(*AstructObjptr)->成员=5;
printf(“%d”,(*aStructObjPtrPtr)->成员);//5
//5.2.通过struct_ptrpt和访问。
//**aStructObjPtrPtr.member=6;//错误,应如下所示。
(**aStructObjPtrPtr).成员=6;
printf(“%d”,(**aStructObjPtrPtr.member);//6
//5.3.通过typedefed\u strct\u ptrptr和->
TypedefedStruct**typedefStructObjPtr=&typedefStructObjPtr;
//*TypeDefstructObjptrR->member=7;//错误,应如下所示。
(*TypeDefstructObjptr)->成员=7;
printf(“%d”,(*typeDefstructObjptr)->成员);//7
//5.4.通过typedefed_strct_ptrptr和。
//**TypeDefstructObjptrR->member=8;//错误,应如下所示。
(**typeDefstructObjptr).成员=8;
printf(“%d”,(**typeDefstructObjptr.member);//8
//5.5.如果包含错误的数量,则所有案例5.1至5.4都将失败*
//下面是使用不正确数字*的示例,对应
//指定给它们的int值
//(aStructObjPtrPtr)->member=5;//错误
//(*AstructObjptr).member=6;//错误
//(TypeDefstructObjptr)->member=7;//错误
//(*TypeDefstructObjptr).member=8;//错误
}
基本思想是直截了当的:

  • 对结构变量使用
    。(案例2和4)
  • 使用带有指向结构指针的
    ->
    。(案例1和3)
  • 如果通过以下指针到达结构变量或指向结构变量的指针,则将指针括在括号内:
    (*ptr)。
    (*ptr)->
    *ptr.
    *ptr->
    (除情况1外的所有情况)
  • 如果你是通过fol到达的
    testvar.a;
    testvar.b;
    
    testvar->a;