views:

101

answers:

5

I am compiling this piece of code and I get compliation 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

Here's the code snippet:

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

}
+5  A: 

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 {
   ...
};
Aaron
That does not define a named type 'x' - it's just a struct tag. To define a named type you would need a typedef.
Draemon
@Draemon - Partially true - it defines a struct named 'x'... In straight C you can't use 'x' without the 'struct' part but it's still named as opposed to OP when it was unnamed.
Aaron
@Aaron: It defines a struct named "struct x", not a type that is a struct that is named "x". Structs tags and type names are distinct namespaces, in C.
unwind
A: 

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.

Draemon
A: 

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.

Carl Smotricz
A: 

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?

digitalarbeiter
A: 

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 (e.g. 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;
}
Sinan Ünür
Hi, In your code, did you want to say x_struct * temp = malloc ..instead of x *temp = malloc... Please clarify. Also if you can look at the comment I have added at the top (for the question) summarizing my understanding. If you can have a quick look, will be great Thanks.
I did mean `x *temp = malloc(...)`. `struct x *temp` would have been fine as well. However, why not use the `typedef` now that we have typedef'ed it?
Sinan Ünür