C函数返回指针 - 内存错误,核心转储

时间:2014-12-27 19:57:27

标签: c

请问,有人可以告诉我为什么下面的程序编译,但是当我尝试运行它时,我收到错误消息,说有内存故障? 该程序甚至没有运行主要功能的第一行。我把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;
 }

3 个答案:

答案 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)。