使用结构取消引用指向不完整类型的指针

时间:2016-04-21 11:10:55

标签: c pointers struct

我在标题" point.h":

中有以下代码
#ifndef POINT_H_INCLUDED
#define POINT_H_INCLUDED

struct Point* createDefaultValues();

#endif // POINT_H_INCLUDED

point.c文件包含以下代码:

#include <stdlib.h>
struct Point {
int x;
int y;
};


struct Point* createDefaultValues()
{
    struct Point* point;
    point = (struct Point*) malloc(sizeof(struct Point));
    point->x = 2;
    point->y = 1;
    return point;
};

main.c由以下几行组成:

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

int main()
{
    struct Point* cerc;
    cerc = createDefaultValues();
    printf("%d, %d", cerc->x, cerc->y);
    return 0;
}

我在printf()行取消引用指向不完整类型错误的指针。我该怎么做才能修复它?

我知道我可以在struct中指定默认值,但我不想这样做,我只想用我标题中的函数分配它们。

2 个答案:

答案 0 :(得分:5)

您可以将结构定义移动到头文件中:

 #ifndef POINT_H_INCLUDED
 #define POINT_H_INCLUDED

    struct Point {
      int x;
      int y;
    };


    struct Point* createDefaultValues();

    #endif // POINT_H_INCLUDED

并在point.c中包含头文件

答案 1 :(得分:1)

另一种方法是编写两个访问器函数,因此您可以通过它们获取成员的值而不是引用指针。这种方法可能更好,因为它不会强迫您将struct定义放入公共视图。

为此,您可以添加到point.h

int getX(struct Point* point);
int getY(struct Point* point);

定义进入point.c

int getX(struct Point* point)
{
    return point->x;
}

int getY(struct Point* point)
{
    return point->y;
}

并在main.c中将其替换为:

printf("%d, %d", getX(cerc), getY(cerc));

通过扩展它,您可以编写setter函数,例如验证等。