¿Qué significa “solicitud de miembro ‘*******’ en algo que no es una estructura o sindicato”?

6 minutos de lectura

avatar de usuario
Pedro

¿Hay una explicación fácil de lo que significa este error?

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

Lo he encontrado varias veces en el tiempo que he estado aprendiendo C, pero no tengo ni idea de lo que significa.

  • La mejor respuesta debe aceptarse en la parte superior.

    – T. Woody

    30 de octubre de 2014 a las 1:07

avatar de usuario
relajarse

También sucede si está intentando acceder a una instancia cuando tiene un puntero, y viceversa:

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

Como se señaló en un comentario, esto puede volverse insoportable si alguien va y typedefsa puntero, es decir, incluye el * en un typedef, así:

typedef struct foo* Foo;

Porque luego obtienes un código que mira como si estuviera tratando con instancias, cuando en realidad está tratando con punteros:

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

Tenga en cuenta cómo se ve lo anterior como si debería estar escrito a_foo.fieldpero eso fallaría ya que Foo es un puntero a la estructura. Lo recomiendo en contra typedefPunteros :ed en C. Los punteros son importantes, no oculte sus asteriscos. Déjalos brillar.

  • Apuesto a que este es el problema real. Todavía me muerde de vez en cuando, especialmente si alguien ha definido un tipo de puntero.

    – Juan Bode

    2 de febrero de 2010 a las 15:04

  • Solo agregaría que este error aparecerá si no se ha asignado una matriz (malloc) y se accede a ella.

    – máx.

    14/03/2012 a las 16:35

  • Sé que ha pasado una década o más desde que se publicó esto, pero esas dos últimas oraciones hicieron de esta mi nueva publicación favorita. “Los punteros son importantes, no escondas tus asteriscos. Déjalos brillar”.

    – Aiden Blishen Cuneo

    30 de abril de 2020 a las 23:58

Está intentando acceder a un miembro de una estructura, pero en algo que no es una estructura. Por ejemplo:

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

avatar de usuario
Rayo Kaustav

También puede ocurrir en el siguiente caso:

p.ej. si consideramos la función push de una pila:

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

El error está en la función push y en la línea comentada. el puntero s debe incluirse entre paréntesis. El código correcto:

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

  • Gracias por hacer explícito el punto del puntero (sin un terrible juego de lenguaje). Otras respuestas lo mencionaron (por ejemplo, “deja que tus punteros brillen”), pero a las 2 a. m. luchando en una batalla épica con GDB y Valgrind, las personas como yo apreciamos que tu respuesta muestre explícitamente cómo el puntero puede ser un problema y cómo se puede rectificar ese problema. .

    –Max Von Hippel

    6 de mayo de 2016 a las 3:16

avatar de usuario
mahesha999

He enumerado posiblemente todos los casos en los que este error puede ocurrir en el código y sus comentarios a continuación. Por favor agréguelo si encuentra más casos.

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

Las ideas subyacentes son claras:

  • Utilizar . con estructura variable. (Casos 2 y 4)
  • Utilizar -> con puntero a estructura. (Casos 1 y 3)
  • Si alcanza la variable de estructura o el puntero a la variable de estructura siguiendo el puntero, envuelva el puntero dentro del corchete: (*ptr). y (*ptr)-> contra *ptr. y *ptr-> (Todos los casos excepto el caso 1)
  • Si está llegando siguiendo los punteros, asegúrese de haber llegado correctamente al puntero para estructurar o estructurar lo que desee. (Caso 5, especialmente 5.5)

Puede significar que olvidó incluir un archivo de encabezado que define esta estructura/unión. Por ejemplo:

archivo 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();

archivo principal.c:

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

avatar de usuario
Nahúm

también puede aparecer si:

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

foo.x=12

en lugar de

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

foo.x=12

avatar de usuario
mosa

Vi esto cuando estaba tratando de acceder a los miembros.

Mi estructura fue esta:

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

Normalmente accedemos a los miembros de la estructura como

testvar.a;
testvar.b;

Me confundí testvar ser un puntero e hizo esto.

testvar->a;

Fue entonces cuando vi este error.

solicitud de miembro ‘a’ en algo que no es una estructura o unión

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad