c언어 스택에서 질문있습니다!
글쓴이: yhh68033 / 작성시간: 일, 2021/09/12 - 11:04오후
문제 설명부터하자면 push를 입력하면 데이터 입력
pop입력하면 데이터 할당 해제 및 출력
등등인데
여기서 문제는 마지막exit를 치면 세그멘테이션 오류라고 뜨고 끝나요..
다른 코드에는 문제가 없는데 어떤게 문제인걸까요?
#include<stdio.h> #include<string.h> #include<stdlib.h> struct node { int data; struct node *link; }; typedef struct node Stack; Stack *Getnode() { Stack *tmp; tmp=(Stack*)malloc(sizeof(Stack)); tmp->link=NULL; return tmp; } void push(Stack **top,int data) { Stack *tmp; tmp=*top; *top=Getnode(); (*top)->data=data; (*top)->link=tmp; } int pop(Stack **top) { if(*top==NULL) { return -1; } int num; Stack *tmp; tmp=*top; *top=(**top).link; num=(*tmp).data; free(tmp); return num; } int count(Stack **top) { int count=0; Stack *tmp; tmp=*top; while(tmp) { tmp=(*tmp).link; count++; } return count; } void print(Stack **top) { Stack *tmp=*top; printf("\n================현재 스택 내의 데이터===================\n"); while(tmp) { printf("%d\n",tmp->data); tmp=tmp->link; } } void EXIT(Stack **top) { Stack *tmp; while(tmp) { tmp=*top; *top=tmp->link; free(tmp); } } int main() { char input[20]; int data; Stack *top=NULL; while(1) { printf("\n=====================명령어======================\n"); printf("push . 데이터 입력\n"); printf("pop . 최신 데이터 출력 후 동적할당해제\n"); printf("count . 스텍의 정수 데이터 개수 출력\n"); printf("print . 스택에 모든 데이터 출력\n"); printf("exit . 스택에 모든 데이터 동적할당해제후 시스템 종료\n"); printf("입력:"); scanf("%s",input); if(strcmp("push",input)==0) { printf("x값 입력:"); scanf("%d",&data); if(data<0||data>100) { printf("데이터를 재입력 하세용\n"); continue; } else push(&top,data); } else if(strcmp("pop",input)==0) { printf("삭제 된 값 : %d\n",pop(&top)); } else if(strcmp("count",input)==0) { printf("\n스텍의 모든 데이터 갯수:%d\n",count(&top)); } else if(strcmp("print",input)==0) { print(&top); } else if(strcmp("exit",input)==0) { EXIT(&top); exit(0); } else printf("\n재 입력 하세요!\n"); } } <code/>
Forums:
debug를 해 보세요. main() 함수내의
debug를 해 보세요. main() 함수내의 EXIT(&top); 부분에 break를 걸고 EXIT 함수 내부로 들어가면 쉽게 원인을 찾을 수 있을 겁니다.
세그멘테이션 폴트는 NULL 인 것을 액세스할 때 발생하는 문제니 step으로 한줄 한줄 실행하다 보면 NULL로 바뀌는 부분을 찾을 수 있을 겁니다. 대충 보면 link가 NULL이 될 때 *top=tmp->link; 이후에 *top이 걸릴 것 같네요.
아마도..
free(tmp);
한뒤에 tmp 의 값을 확인해보세요
------------------------------------------------------------
ProgrammingHolic
gdb와 valgrind에 친해지시면 좋습니다.
gdb와 valgrind에 친해지시면 좋습니다.
복사붙여넣기로 재현이 쉽게 되어서, valgrind 돌려봤습니다. 파일명은 a.c 라고 합시다.
$ gcc -Wall -g -o a a.c
$ valgrind --tool=memcheck ./a
=====================명령어======================
push . 데이터 입력
pop . 최신 데이터 출력 후 동적할당해제
count . 스텍의 정수 데이터 개수 출력
print . 스택에 모든 데이터 출력
exit . 스택에 모든 데이터 동적할당해제후 시스템 종료
입력:exit
==1141885== Conditional jump or move depends on uninitialised value(s)
==1141885== at 0x10932C: EXIT (a.c:64)
==1141885== by 0x10952E: main (a.c:112)
==1141885==
==1141885== Invalid read of size 8
==1141885== at 0x109310: EXIT (a.c:67)
==1141885== by 0x10952E: main (a.c:112)
==1141885== Address 0x8 is not stack'd, malloc'd or (recently) free'd
==1141885==
==1141885==
==1141885== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==1141885== Access not within mapped region at address 0x8
==1141885== at 0x109310: EXIT (a.c:67)
==1141885== by 0x10952E: main (a.c:112)
64번째 줄에서 초기화되지 않은 값을 사용하네요.
61 void EXIT(Stack **top)
62 {
63 Stack *tmp;
64 while(tmp)
65 {
여기서부터 수정하시다보면 원인을 찾을 수 있겠습니다. 처음 답글 주신 분 말씀이 대부분 맞을 것 같습니다.
kldp 에 글 올리실 때 code 태그 살짝 잘
kldp 에 글 올리실 때 code 태그 살짝 잘 못 쓰신 듯.
마지막에 code/ 아니고 /code 써야 될 겁니다.
어쨌든 보이긴 하네요. ;p
세벌 https://sebuls.blogspot.kr/
다들 감사합니다!
좋은 답글들 모두 감사합니다 ㅎㅎ
더욱 열심히 공부하겠습니다!
댓글 달기