user1801359
user1801359

Reputation: 422

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.

Upvotes: 0

Views: 1236

Answers (2)

Nigel Horne
Nigel Horne

Reputation: 53

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

Upvotes: 1

Paul R
Paul R

Reputation: 213060

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.

Upvotes: 1

Related Questions