C函数返回指针-内存故障,内核转储

C函数返回指针-内存故障,内核转储,c,C,请问,有人能告诉我为什么下面的程序会编译,但当我尝试运行它时,我收到了错误消息,内存出现故障? 程序甚至不执行主函数的第一行。我将printf行放在主函数的开头,但它没有被执行 #include<stdlib.h> #include<stdio.h> #include<string.h> typedef struct element { struct element *next; struct element *previous; ch

请问,有人能告诉我为什么下面的程序会编译,但当我尝试运行它时,我收到了错误消息,内存出现故障? 程序甚至不执行主函数的第一行。我将printf行放在主函数的开头,但它没有被执行

#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;
 }
#包括
#包括
#包括
类型定义结构元素{
结构元素*next;
结构元素*previous;
字符集[256];
查尔·纳兹维斯科[256];
char-tytul[256];
整数;
双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;
现在就回来;
}
void addoddolu(el_listy*lista){
el_listy*wsk,*nowy;
wsk=lista;
while(wsk->next!=NULL)
{ 
wsk=wsk->next;/*przesuwamy wsk ażznajdziemy ostatni元素*/
}
nowy=(el_listy*)malloc(sizeof(el_listy));
char-bufor[256];
int纳米;
双重否定;
printf(“Podaj imie autora ksiazki>”;
如果(scanf(“%s”,bufor)==1){strcpy(nowy->imie,bufor);};
printf(“Podaj nazwisko autora ksiazki>”;
如果(scanf(“%s”,bufor)==1){strcpy(nowy->nazwisko,bufor);};
printf(“Podaj tytul ksiazki>”;
如果(scanf(“%s”,bufor)==1){strcpy(nowy->tytul,bufor);};
printf(“Podaj numer katalogwy ksiazki”);
如果(scanf(“%d”,&nm)==1{nowy->numer=nm;};
printf(“Podaj cene ksiazki>”;
如果(scanf(“%lf”,&no)==1){nowy->cena=no;};
nowy->next=NULL;
nowy->previous=wsk;
wsk->next=nowy;/*podczepiamy nowy元素do ostatniego z listy*/
}
无效添加(el_listy*lista){
el_listy*wsk,*nowy;
char-bufor[256];
int纳米;
双重否定;
wsk=lista;
nowy=(el_listy*)malloc(sizeof(el_listy));
printf(“Podaj imie autora ksiazki>”;
如果(scanf(“%s”,bufor)==1){strcpy(nowy->imie,bufor);};
printf(“Podaj nazwisko autora ksiazki>”;
如果(scanf(“%s”,bufor)==1){strcpy(nowy->nazwisko,bufor);};
printf(“Podaj tytul ksiazki>”;
如果(scanf(“%s”,bufor)==1){strcpy(nowy->tytul,bufor);};
printf(“Podaj numer katalogwy ksiazki”);
如果(scanf(“%d”,&nm)==1{nowy->numer=nm;};
printf(“Podaj cene ksiazki>”;
如果(scanf(“%lf”,&no)==1){nowy->cena=no;};
nowy->previous=NULL;
nowy->next=wsk;
wsk->previous=nowy;/*podczepiamy nowy元素do ostatniego z listy*/
}
void wypiszliste(el_listy*lista){
el_listy*wsk=lista;
整数=1;
while(wsk!=NULL)
{
printf(“Ksiazka%d、%s、%s、%s、%d、%lf\n”、数字、wsk->imie、wsk->nazwisko、wsk->tytul、wsk->数字、wsk->cena);
数值=数值+1;
wsk=wsk->next;
}
}
无效usunzlisty(el_listy*lista,整数){
el_listy*wsk=lista;
while(wsk->next!=NULL)
{
如果(wsk->next->numer==numer)/*musimy miećwskaźnik do elementu poprzedzającego*/
{
el_listy*usuvany=wsk->next;/*zapamiętujemy usuvany元素*/
wsk->next=usuvany->next;/*przestawiamy wskaźnik next由omijałusuvany元素编写*/
通常->下一步->上一步=wsk;
免费(通常);/*通常是免费的*/
}否则
{
wsk=wsk->next;/*idziemy dalej tylko wtedy kiedy nie usuwaliśmy*/
}/*bo nie chcemy zostawićduplikatów*/
}
}
内szukaj_nazwisko(el_listy*lista,char*nazwisko){
el_listy*wsk;
wsk=lista;
while(wsk!=NULL){
如果(strcmp(wsk->nazwisko,nazwisko)==0)返回wsk->numer;
wsk=wsk->next;
}
返回0;
}
int main(){
printf(“glowny程序,pierwszy wiersz”);
el_listy*wskaznik;
printf(“glowny计划,drugi wiersz”);
el_listy*lista;
lista=tworzpierwszy(wskaznik);
addodgory(lista);
wypiszliste(lista);
返回0;
}

tworzpierwszy
试图重新分配一个从未分配过的指针,或者以任何方式初始化过的指针(
wskaznik
)。
tworzpierwszy
试图重新分配一个从未分配过的指针,或者甚至从未以任何方式初始化过的指针(
wskaznik
)。

您还没有调用
malloc()
用于
main()中的
wskaznik
。它应该看起来像:

el_listy *wskaznik = (el_listy *) malloc(sizeof(struct element));

您没有在
main()
中为
wskaznik
调用
malloc()
。它应该看起来像:

el_listy *wskaznik = (el_listy *) malloc(sizeof(struct element));

在函数tworzpierwszy中更改此行

nowy=(el_listy*)realloc(nowy, sizeof(el_listy));
进入


它会起作用的

在函数中更改此行
tworzpierwszy

nowy=(el_listy*)realloc(nowy, sizeof(el_listy));
进入


它会起作用的

不要强制转换
malloc
realloc
的结果:使用所有警告和调试信息编译(
gcc-Wall-Wextra-g
)。然后使用调试器(
gdb
)始终检查malloc系列函数的返回值,以确保操作成功。标准输出被缓冲,缓冲区仅在缓冲区满时发送到终端。要强制立即输出到终端,请在printf格式字符串末尾加“\n”或(更好)在每个printf后面加“fflush(stdout);”关于这类行:if(scanf(“%s”,bufor)==1){strcpy(nowy->imie,bufor);};用户可以输入的字符数没有限制,因此很容易发生缓冲区溢出,这是一种未定义的行为,导致seg故障事件。不要强制转换
malloc
realloc
:使用所有警告和调试信息编译(
gcc-Wall-Wextra-g
)。然后使用调试器(
gdb
)始终检查malloc系列函数的返回值,以确保操作成功。标准输出被缓冲,缓冲区仅在缓冲区满时发送到终端。要强制立即输出到终端,请在printf格式字符串结尾加“\n”或(更好)follo