简体   繁体   中英

c struct in multiple file error: dereferencing pointer to incomplete type

I am trying to declare a struct and use it in multiple files and I am getting an error that I cannot figure out. Sample code is posted below.

in test.h

#ifndef TEST_H
#define TEST_H

struct mystruct;
struct mystruct *new_mystruct();
void myprint(struct mystruct*,int);

#endif

int test.c

#include "test.h"

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

struct mystruct {
    int *myarray;
};

struct mystruct *new_mystruct(int length)
{
    int i;

    struct mystruct *s;
    s = malloc(sizeof(struct mystruct));
    s->myarray = malloc(length*sizeof(int));

    for(i = 0; i < length; ++i)
        s->myarray = 2*i;

    return s;
}

in main.c

#include "test.h"

#include <stdio.h>

int main()
{
    int len = 10;

    struct mystruct *c = new_mystruct(len);
    myprint(c, len);

    printf("%f", c->myarray[3]); // error: dereferencing pointer to incomplete type

    return 0;

myprint() prints out 0 2 4 6 8 10 12 14 16 18. why doesn't the myprint(function work but the printf statement doesn't? why is it ok to pass it into a function but not use it in main? Thanks.

Currently main() only knows that struct mystruct is a type, but it doesn't know anything about its internal structure, because you've hidden it in test.c.

So you need to move this definition:

struct mystruct {
    int *myarray;
};

from test.c to test.h, so that it's visible to main() .

Note: what you're doing here is a classic example of an opaque type . This can be a very useful technique when you want to hide implementation details from code that is going to be calling your API.

Main.c doesn't know the contents of the mystruct structure. Try moving these lines:

struct mystruct {
    int *myarray;
};

from test.c to test.h.

While you're at it, I think you mean "int myarray" not "int *myarray".

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