分段错误(核心转储)但不知道如何解决它

问题描述 投票:0回答:2

当试图输入一串字符时,我收到警告

warning: 'doc' may be uninitialized in this function [-Wmaybe-uninitualized]

当我运行代码时,它只允许我输入字符串本身然后停止。

我尝试使用在线编译器编译代码,并返回“分段错误(核心转储)”。我知道有些事情是错的,但我不知道如何解决它。

#include <stdio.h>
#include <string.h>

typedef struct Pacient{
    char ime_prezime[100];
    int osiguruvanje;
    int broj_pregledi;
}Pacient;

typedef struct MaticenDoktor{
    char ime_prezime[100];
    int broj_pacienti;
    Pacient pacient[200];
    float cena;
}MaticenDoktor;

void najuspesen_doktor(MaticenDoktor *doc, int n){
    int i, j, najgolema_zarabotka=0, najmnogu_pregledi=0, zarabotka, pregledi;
    char najuspesen[100];
    for(i=0; i<n; i++){
        zarabotka=0;
        pregledi=0;
        for(j=0; j<doc[i].broj_pacienti; j++){
            if(doc[i].pacient[j].osiguruvanje==0){
                zarabotka+=doc[i].cena;
                pregledi++;
            }
        }
        if(zarabotka>najgolema_zarabotka){
            najgolema_zarabotka=zarabotka;
            strcpy(najuspesen, doc[i].ime_prezime);
            najmnogu_pregledi=pregledi;
        }
        else if(zarabotka==najgolema_zarabotka){
            if(pregledi>najmnogu_pregledi){
                najgolema_zarabotka=zarabotka;
                strcpy(najuspesen, doc[i].ime_prezime);
                najmnogu_pregledi=pregledi;
            }
        }
    }
    printf("%s %d %d", najuspesen, najgolema_zarabotka, najmnogu_pregledi);
}

int main()
{
    int i, j, n;
    printf("Vnesi broj na doktori\n");
    scanf("%d", &n);
    MaticenDoktor *doc;
    for(i=0; i<n; i++){
        scanf("%s", doc[i].ime_prezime);   //  <---- warning here
        scanf("%d", &doc[i].broj_pacienti);
        scanf("%f", &doc[i].cena);
        for(j=0; j<doc[i].broj_pacienti; j++){
            scanf("%s", doc[i].pacient[j].ime_prezime);
            scanf("%d", &doc[i].pacient[j].osiguruvanje);
            scanf("%d", &doc[i].pacient[j].broj_pregledi);
        }
    }
    najuspesen_doktor(doc, n);
    return 0;
}

有谁知道如何解决这一问题?

c struct scanf
2个回答
2
投票

MaticenDoktor *doc;只声明一个指针,而不是完整的结构(或数组)。你需要初始化它指向某个地方,在那里你可以保证有足够的可用内存来保存信息。您可以通过多种方式确保这一点:

  • 相反,您可以在函数体中保存一个完整的结构(在您的情况下为main,使用类似的声明: MaticenDoktor doc; /* no pointer, but a full structure variable is declared */ scan("%s", doc.ime_prezime); ...
  • 您可以使用以下代码声明MaticenDoktor结构数组: MaticenDoktor doc[100]; /* now doc is an array with space for 100 MaticenDoktors */ scan("%s", doc[n].ime_prezime); /* n ranges from 0 to 99 max */
  • 你可以,如果你不知道你将拥有多少个MaticenDoktor,并且你在循环之前阅读它,有: MaticenDoktor *doc = malloc(n * sizeof *doc); /* you have doc pointing to an array of n MaticenDoktors */ scan("%s", doc[n].ime_prezime); ... free(doc); /* after you are completely finished using doc */
  • 如果内存不足,只需声明一个空格最大的指针数组,并根据需要分配结构: MaticenDoktor *doc[1000]; /* space for maximum of 1000 pointers to MaticenDoktor */ for (i = 0; i < n && i < 1000; i++) { doc[i] = malloc(sizeof *doc[i]); /* size of pointed value, not of pointer */ scanf("%s", doc[i]->ime_prezime); ... } 后来 for (i = 0; i < n && i < 1000; i++) { free(doc[i]); /* free space used by doc[i] */ }
  • ...以及许多其他方式来组织你的记忆:)

0
投票

doc尚未被分配到一个不可预测的位置。你应该把它放在堆栈上:

首先分配动态内存。

MaticenDoktor *doc;
int len = 10; // all memory that you need.
doc =(MaticenDoktor *)malloc(sizeof(MaticenDoktor)*len);

它修复了警告。

© www.soinside.com 2019 - 2024. All rights reserved.