error: invalid application of 'sizeof' to incomplete type 'struct PolyNode'


1、問題說明

PolyNode 聲明在 poly.h 頭文件中:

#ifndef POLYNOMIALCOMPUTE_POLY_H
#define POLYNOMIALCOMPUTE_POLY_H

struct PolyNode;
typedef struct PolyNode *Polynomial;

void Attach(int c, int e, Polynomial *pRear);
Polynomial PolyAdd(Polynomial P1, Polynomial P2);
void PrintPoly(Polynomial P);
void TestPoly();

#endif //POLYNOMIALCOMPUTE_POLY_H

PolyNode 定義在 poly.c 文件中:

#include "poly.h"
#include <malloc.h>
#include <stdlib.h>
#include <stdio.h>

struct PolyNode {
    Polynomial link; // 指向下一個節點的位置
    int expon; // 指數,英文是 exponent
    int coef; // 系數,英文是 coefficient
};

// 新增一個節點
void Attach(int c, int e, Polynomial *pRear)
{
    Polynomial P;

    P = (Polynomial)malloc(sizeof(struct PolyNode)); // 分配空間
    P->coef = c; // 對新節點賦值
    P->expon = e;
    P->link = NULL;
    (*pRear)->link = P; // 尾節點指向P
    *pRear = P; // 修改 pRear 值
}

int Compare(int Lhs, int Rhs)
{
    return Lhs - Rhs;
}

Polynomial PolyAdd(Polynomial P1, Polynomial P2)
{
    Polynomial front, rear, temp;
    int sum;
    rear = (Polynomial)malloc(sizeof(struct PolyNode));
    front = rear; // 由 front 記錄結果多項式鏈表頭節點
    while (P1 && P2)
    { // 當兩個多項式都有非零項待處理時
        switch (Compare(P1->expon, P2->expon))
        {
            case 1:
                Attach(P1->coef, P1->expon, &rear);
                P1 = P1->link;
                break;
            case -1:
                Attach(P2->coef, P2->expon, &rear);
                P2 = P2->link;
                break;
            case 0:
                sum = P1->coef + P2->coef;
                if (sum) Attach(sum, P1->expon, &rear);
                P1 = P1->link;
                P2 = P2->link;
                break;
        }
    }
    // 將未處理完的另一個多項式的所有節點依次復制到結果多項式中去
    for(; P1; P1 = P1->link) Attach(P1->coef, P1->expon, &rear);
    for(; P2; P2 = P2->link) Attach(P2->coef, P2->expon, &rear);
    rear->link = NULL;
    temp = front;
    front = front->link; // 令 front 指向結果多項式的第一個非零項
    free(temp); // 釋放臨時空表頭節點
    return front;
}

void PrintPoly(Polynomial P)
{
    Polynomial tmp = P;
    for(; tmp; tmp = tmp->link)
    {
        printf("%d %d   ", tmp->coef, tmp->expon);
    }
}

void TestPoly()
{
    int P1Coef[5] = {3, 4, -1, 2, -1};
    int P1expon[5] = {5, 4, 3, 1, 0};
    int P2Coef[4] = {2, 1, -7, 1};;
    int P2expon[4] = {4, 3, 2, 1};

    Polynomial P1, P2;
    P1 = (Polynomial)malloc(sizeof(struct PolyNode));
    P2 = (Polynomial)malloc(sizeof(struct PolyNode));
    
    Polynomial P1Rear;
    P1Rear = P1;

    Polynomial P2Rear;
    P2Rear = P2;

    for (int i = 0; i < 5; ++i)
    {
        Attach(P1Coef[i], P1expon[i], &P1Rear); // 注意這里傳的是地址!!!
    }
    P1 = P1->link; // 因為第一個節點沒有存儲數據,所以 P1 要往后挪一位

    for (int i = 0; i < 4; ++i)
    {
        Attach(P2Coef[i], P2expon[i], &P2Rear);
    }
    P2 = P2->link;

    Polynomial res = PolyAdd(P1, P2);

    PrintPoly(P1);
    printf("\n");
    PrintPoly(P2);
    printf("\n");
    PrintPoly(res);

}

然后是我的 main,就是在這里出的錯

#include "poly.h"
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

// 測試函數
int main()
{

    Polynomial P;
    P = (Polynomial)malloc(sizeof(struct PolyNode)); // 這里有錯

    TestPoly();

    return 0;
}

錯誤信息:

error: invalid application of 'sizeof' to incomplete type 'struct PolyNode'

20201019083247

2、解決方案

如果你的目的是隱藏這個結構體(structure)的實現,那么你可以在可以訪問到這個結構體的 C 文件(比如上面的 poly.c 文件)中這樣做:

struct PolyNode *
init_PolyNode(...)
{
    struct PolyNode *P = malloc(sizeof(struct PolyNode));

    return P;
}

否則,如果這個結構體的實現不應該被隱藏,換句話說,main 可以合法地進行這樣的操作:

P = (PolyNomial)malloc(sizeof(struct PolyNode));
P->expon = 1;

那么,更好的做法是將結構體的定義放在頭文件中(本例中是 poly.h)。

參考:https://stackoverflow.com/questions/8915230/invalid-application-of-sizeof-to-incomplete-type-with-a-struct


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM