简体   繁体   中英

Question regarding de-referencing structure pointers

I am compiling this piece of code and I get compilation errors saying " dereferencing pointer to incomplete type" . I get the errors for the last print statement and before that where I try to point (*temp). num to the address of b

void main()
{

    struct {
        int xx;
        char *y;
        int * num;
        struct x *next;
    }x;

    struct x* temp;
    int b = 10;

    temp = ((struct x *)malloc(sizeof(x)));

    (*temp).num = &b;

    x.next = temp ;

    printf(" %d\n",temp->num, x.next->num);

}

The problem is that the statement:

struct {
   ...
} x;

defines an unnamed instance 'x' - not a named type 'x'.

So when you refer to 'struct x' from within there all the compiler knows is that you want some pointer of type 'x' - which you'll define later (and you never do).

To define a named type 'x' you need:

struct x {
   ...
};

I think you meant:

struct x {
  int xx;
  char *y;
  int * num;
  struct x *next;
}x;

You reference a "struct tag" that you haven't defined wherever you use struct x . You have no way to refer to the type of variable x . Since you want to refer to it with struct x you must define the struct tag.

I think it's the fact that your struct refers to itself before it's completely defined.

In particular, your struct has no name; "x" is the name of a variable having such a structure, but there is no type name.

Just declare " struct x { ... } x " and it should be fine.

Besides what Draemon write about struct x {...} x , I took the liberty of correcting the various other small problems like the printf() :

void main()
{
  struct x {
    int xx;
    char *y;
    int *num;
    struct x *next;
   } x;
   struct x* temp;
   int b = 10;
   temp = ((struct x *)malloc(sizeof(struct x)));
   (*temp).num = &b;
   x.next = temp ;
   printf("%d %d\n",*temp->num, *x.next->num);
}

Just out of curiosity: What are you trying to achieve?

Please note that void main() has never been a valid prototype for main in C or C++.

If you want to pointer to the struct you are declaring within the struct , you need to tag the struct . The typedef is sometimes useful, but not necessary.

Please study the differences between your code and the following and understand why the differences are there. That will help you learn. So will reading the C FAQ list (eg see Structures, Unions, and Enumerations .

#include<stdio.h>
#include<stdlib.h>

int main(void) {
    int b = 10;

    typedef struct x_struct {
        int xx;
        char *y;
        int *num;
        struct x_struct *next;
    } x;

    x *temp = malloc(sizeof(*temp));
    if ( !temp ) {
        return EXIT_FAILURE;
    }

    temp->num = &b;
    temp->next = temp;

    printf("%d %d\n", *(temp->num), *(temp->next->num));
    return 0;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM