请问,有人可以告诉我为什么下面的程序编译,但是当我尝试运行它时,我收到错误消息,说有内存故障? 该程序甚至没有运行主要功能的第一行。我把printf行放在main函数的开头,但是没有执行。
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
typedef struct element {
struct element *next;
struct element *previous;
char imie[256];
char nazwisko[256];
char tytul[256];
int numer;
double cena;
} el_listy;
el_listy* tworzpierwszy(el_listy *nowy){
nowy=(el_listy*)realloc(nowy, sizeof(el_listy));
strcpy(nowy->imie,"");
strcpy(nowy->nazwisko,"");
strcpy(nowy->tytul,"");
nowy->numer=0;
nowy->cena=0.00;
nowy->next=NULL;
nowy->previous=NULL;
return nowy;
}
void addoddolu (el_listy *lista){
el_listy *wsk, *nowy;
wsk = lista;
while (wsk->next != NULL)
{
wsk = wsk->next; /* przesuwamy wsk aż znajdziemy ostatni element */
}
nowy =(el_listy*) malloc (sizeof(el_listy));
char bufor[256];
int nm;
double no;
printf("Podaj imie autora ksiazki > ");
if(scanf("%s", bufor)==1){strcpy(nowy->imie,bufor);};
printf("Podaj nazwisko autora ksiazki > ");
if(scanf("%s", bufor)==1){strcpy(nowy->nazwisko, bufor);};
printf("Podaj tytul ksiazki > ");
if(scanf("%s", bufor)==1){strcpy(nowy->tytul, bufor);};
printf("Podaj numer katalogowy ksiazki");
if(scanf("%d", &nm)==1){nowy->numer=nm;};
printf("Podaj cene ksiazki > ");
if(scanf("%lf", &no)==1){nowy->cena=no;};
nowy->next = NULL;
nowy->previous=wsk;
wsk->next = nowy; /* podczepiamy nowy element do ostatniego z listy */
}
void addodgory (el_listy *lista){
el_listy *wsk, *nowy;
char bufor[256];
int nm;
double no;
wsk = lista;
nowy =(el_listy*) malloc (sizeof(el_listy));
printf("Podaj imie autora ksiazki > ");
if(scanf("%s", bufor)==1){strcpy(nowy->imie,bufor);};
printf("Podaj nazwisko autora ksiazki > ");
if(scanf("%s", bufor)==1){strcpy(nowy->nazwisko, bufor);};
printf("Podaj tytul ksiazki > ");
if(scanf("%s", bufor)==1){strcpy(nowy->tytul, bufor);};
printf("Podaj numer katalogowy ksiazki");
if(scanf("%d", &nm)==1){nowy->numer=nm;};
printf("Podaj cene ksiazki > ");
if(scanf("%lf", &no)==1){nowy->cena=no;};
nowy->previous = NULL;
nowy->next=wsk;
wsk->previous = nowy; /* podczepiamy nowy element do ostatniego z listy */
}
void wypiszliste(el_listy *lista){
el_listy *wsk=lista;
int numer=1;
while( wsk != NULL )
{
printf ("Ksiazka %d, %s, %s, %s, %d, %lf \n", numer, wsk->imie, wsk->nazwisko, wsk->tytul, wsk->numer, wsk->cena);
numer=numer+1;
wsk = wsk->next;
}
}
void usunzlisty(el_listy *lista, int numer){
el_listy *wsk=lista;
while (wsk->next != NULL)
{
if (wsk->next->numer == numer) /* musimy mieć wskaźnik do elementu poprzedzającego */
{
el_listy *usuwany=wsk->next; /* zapamiętujemy usuwany element */
wsk->next = usuwany->next; /* przestawiamy wskaźnik next by omijał usuwany element */
usuwany->next->previous=wsk;
free(usuwany); /* usuwamy z pamięci */
} else
{
wsk = wsk->next; /* idziemy dalej tylko wtedy kiedy nie usuwaliśmy */
} /* bo nie chcemy zostawić duplikatów */
}
}
int szukaj_nazwisko(el_listy *lista, char* nazwisko){
el_listy *wsk;
wsk = lista;
while (wsk != NULL) {
if (strcmp(wsk->nazwisko,nazwisko)==0) return wsk->numer;
wsk = wsk->next;
}
return 0;
}
int main (){
printf("Program glowny, pierwszy wiersz");
el_listy *wskaznik;
printf("Program glowny, drugi wiersz");
el_listy* lista;
lista = tworzpierwszy(wskaznik);
addodgory(lista);
wypiszliste(lista);
return 0;
}
答案 0 :(得分:2)
您尚未在malloc()
中为wskaznik
致电main()
。它应该看起来像:
el_listy *wskaznik = (el_listy *) malloc(sizeof(struct element));
答案 1 :(得分:2)
在功能tworzpierwszy
nowy=(el_listy*)realloc(nowy, sizeof(el_listy));
进入
nowy=(el_listy*)malloc(sizeof(el_listy));
它会起作用!
答案 2 :(得分:0)
tworzpierwszy
正在尝试重新分配一个从未分配过的指针,甚至是以任何方式初始化的指针(wskaznik
)。