簡體   English   中英

使用結構取消引用不完整類型的指針

[英]Dereferencing pointer to incomplete type using a 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中分配默認值,但是我不想這樣做,我只想使用在標頭中找到的函數來分配它們。

您可以將結構定義移到頭文件中:

 #ifndef POINT_H_INCLUDED
 #define POINT_H_INCLUDED

    struct Point {
      int x;
      int y;
    };


    struct Point* createDefaultValues();

    #endif // POINT_H_INCLUDED

並在point.c中包含頭文件

另一種方法是編寫兩個訪問器函數,因此您可以通過它們獲取成員的值,而不是延遲指針。 這種方法可能更好,因為它不會強迫您將結構定義放到公眾視野中。

為此,您可以添加intto 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函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM