【问题标题】:Dereferencing pointer to incomplete type in C (pointer to struct)在 C 中取消引用指向不完整类型的指针(指向结构的指针)
【发布时间】:2013-12-22 18:28:15
【问题描述】:

当我第一次尝试使用指向该结构的指针时(在 main 中),我在 main.c 第 14 行中遇到此错误“取消引用指向不完整类型的指针”。这些是我的文件:

main.c

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

int main(int argc, char *argv[])
{
Prodotti *prodotti;
int i, k, nc=0;

k=atoi(argv[1]);

prodotti=leggi_medicinali();

printf("%d", prodotti->categorie[0]);

free(prodotti); /*da liberare anche vett */
return 0;
}

struttura_dati.h

#ifndef STRUTTURA_DATI_
#define STRUTTURA_DATI_

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

#define MAXNOME 21          /* max lunghezza nomi */
#define MAXPROD 50          /* max numero prodotti */
#define MAXDITT 10          /* max numero ditte */

typedef struct strutt_dati medicinale;
typedef struct vett_struct Prodotti;

Prodotti* leggi_medicinali();
int cerca(char temp[MAXNOME], char database[MAXPROD][MAXNOME], int n);
void stampa(char stringa[]);

#endif

struttura_dati.c

#include "struttura_dati.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct strutt_dati {
char nome[MAXNOME];
int ditta;
int categoria;
};

struct vett_struct {
medicinale *vett;
char ditte[MAXDITT][MAXNOME];
char categorie[MAXPROD][MAXNOME];
int n_categorie;
int n_ditte;
};

Prodotti* leggi_medicinali() {

int i=0, fl;
char temp_categ[MAXNOME], temp_ditta[MAXNOME];
FILE *fp;

Prodotti* leggi_medicinali() {

int i=0, fl;
char temp_categ[MAXNOME], temp_ditta[MAXNOME];
FILE *fp;

Prodotti* prodotti;

fp=fopen("Medicinali.txt", "r");
if(fp==NULL) {
    printf("Errore nell'apertura del file ''Medicinali.txt''\n");
    exit(EXIT_FAILURE);
}

prodotti=malloc(MAXPROD*sizeof(Prodotti*));
prodotti->vett=malloc(MAXPROD*sizeof(medicinale));

prodotti->n_categorie=0;
prodotti->n_ditte=0;


while(!feof(fp)) {
    fscanf(fp, "%s %s %s", temp_categ, prodotti->vett[i].nome, temp_ditta);
    fl=cerca(temp_categ, prodotti->categorie, prodotti->n_categorie);
    if(fl==-1) {
        strcpy(prodotti->categorie[prodotti->n_categorie], temp_categ);
        prodotti->vett[i].categoria=prodotti->n_categorie;
        prodotti->n_categorie++;
    }
    else
        prodotti->vett[i].categoria=fl;

    fl=cerca(temp_ditta, prodotti->ditte, prodotti->n_ditte);
    if(fl==-1) {
        strcpy(prodotti->ditte[prodotti->n_ditte], temp_ditta);
        prodotti->vett[i].ditta=prodotti->n_ditte;
        prodotti->n_ditte++;
    }
    else
        prodotti->vett[i].ditta=fl;
    i++;
}
printf("%s ", prodotti->categorie[0]); /* THIS, IN struttura_dati.c WORKS, BUT IT DOESN'T IN main.c */
fclose(fp);
return prodotti;
}

您能帮我理解为什么 main.c 不能正确使用 prodotti->(something) 的所有内容吗?谢谢!

【问题讨论】:

    标签: c pointers struct typedef


    【解决方案1】:

    这些定义:

    struct strutt_dati {
    char nome[MAXNOME];
    int ditta;
    int categoria;
    };
    
    struct vett_struct {
    medicinale *vett;
    char ditte[MAXDITT][MAXNOME];
    char categorie[MAXPROD][MAXNOME];
    int n_categorie;
    int n_ditte;
    };
    

    需要在struttura_dati.h,而不是struttura_dati.c。目前,当您使用 main.c 中的结构时,定义是不可见的。

    【讨论】:

    • 谢谢你的回答,我这样做是因为我需要做一个 ADT(我以后会做得更好,现在我只是在草绘代码..)。但是,我在其他时候使用这种方法来定义结构并且它有效,为什么它现在不起作用?这是我知道以后拥有 ADT 的唯一方法..
    • 如果你真的想隐藏结构定义,你可以在struttura_dati.c中实现对结构指针进行操作的函数。
    【解决方案2】:

    代码当前的结构方式,我认为即使您解决了当前问题,您也会遇到 NULL 引用问题。在您的 main.c 中,您已声明,

    Prodotti *prodotti;
    

    你(大概)填写的;

    prodotti=leggi_medicinali();
    

    但是看看当前引用的函数;

    Prodotti* leggi_medicinali() {
    
        int i=0, fl;
        char temp_categ[MAXNOME], temp_ditta[MAXNOME];
        FILE *fp;
    
        Prodotti* prodotti;
    
        (... things that works)
    
        return;
    }
    

    看到最后的“回归”了吗?它的真正作用是什么?它会返回任何东西吗?它只是将控制权转移回需要返回值的主函数。我真的很惊讶编译器没有选择这个。

    【讨论】:

    • Ops,真的很抱歉,我忘记在问题中写了,但是在代码中我有“return prodotti”,但是,它不起作用。 ://
    • 我已经在第一篇文章中添加了 Prodotti* prodotti,现在什么都有了,但是代码很长,只有你想回答我才回答。
    猜你喜欢
    • 2017-02-24
    • 1970-01-01
    • 2014-07-06
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2013-03-11
    相关资源
    最近更新 更多