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