[완료][초보질문] 포인터 예제 연습 중 segmentation fault가 발생했습니다.
글쓴이: soundlake / 작성시간: 목, 2010/02/04 - 1:04오후
1. 발생된 코드
#include <stdio.h> void prt_star(int *p); void main(void){ int *a; printf("input a natural nuber : "); scanf("%d", a); prt_star(a); } void prt_star(int *p){ int i; for(i=0; i<*p; i++) putchar('*'); putchar('\n'); }
컴파일 후 실행을 시켜서 숫자를 대입하니, segmentation fault가 발생했습니다.
그래서 고민을 해보다가 일단 포인터를 전부 일반 변수로 바꿔 컴파일, 실행해보았습니다.
그러니 성공을 하는 것이었습니다.
2. 바꿔서 성공한 코드
#include <stdio.h> void prt_star(int p); void main(void){ int a; printf("input a natural nuber : "); scanf("%d", &a); prt_star(a); } void prt_star(int p){ int i; for(i=0; i<p; i++) putchar('*'); putchar('\n'); }
옳타쿠나 하고, 변수는 포인터값으로, 주소는 포인터로(&a -> a)수정해서 컴파일 시도 했습니다.
그런데 웬걸
9: warning: passing argument 1 of ‘prt_star’ makes pointer from integer without a cast 2: note: expected ‘int *’ but argument is of type ‘int’
하고 컴파일 워닝이 납니다.
3. 컴파일 워닝이 생긴 코드
#include <stdio.h> void prt_star(int *p); void main(void){ int *a; printf("input a natural nuber : "); scanf("%d", a); prt_star(*a); } void prt_star(int *p){ int i; for(i=0; i<*p; i++) putchar('*'); putchar('\n'); }
혹시나 싶어서, 저는 우분투 리눅스 9.10 칼믹 amd-x64 사용 중이며,
컴파일러는 우분투 저장소에서 받은 gcc 4.4.1버전입니다.
함수가 int *p형의 매개변수를 받는다면, 포인터를 매개변수로 갖는 것이지요?
4. 질문을 하다가 다시 생각이 떠올라 실험을 해보았는데 이 경우도 성공입니다.
#include <stdio.h> void prt_star(int *p); void main(void){ int a; printf("input a natural nuber : "); scanf("%d", &a); prt_star(&a); } void prt_star(int *p){ int i; for(i=0; i<*p; i++) putchar('*'); putchar('\n'); }
4번의 예가 성공한다면, 어째서 단지 a를 *a로, &a를 a로 바꾼 것 밖에 없는 2번은 segmentation fault가 나는 것일까요. ㅠ
어쩌다보니 쓰잘데 없이 긴 푸념성 글이 된 듯 싶지만, 혹시라도 가르쳐주실 수 있을까요?
음... 아니면 뭘 공부하면 이런 문제를 해결할 수 있게 될런지라도 가르쳐주실 수 있을까요?
Forums:
포인터 책 한번 보시면 이해가 가실듯해요 ^^;
포인터 개념이 아직 잘 안잡히셔서 모를수도 있습니다. 서점이나 c언어책, 혹은 인터넷자료에서 포인터 개념을 잡으시면 이해가 가실듯 싶네요.
넵.
일단 좀더 인내심을 가지고 열공하겠습니다!
C 인가요? printf scanf
C 인가요?
printf scanf 를 사용하면서 문제가 생기기도 합니다.
1번 코드에서 두 함수를 쓰지 말고 *a = 10 , 이런 식으로 숫자를 직접 대입해서 원하는 결과가 나오는지 보세요.
ps. 포인터 초기화도 안돼 있군요.
int *a = new int();
or
int b;
a = &b;
아직 포인터를
아직 포인터를 초기화한다는 개념을 잘 못 잡은 것 같아요.
열공하겠습니다.
보여주신 코드 보니까, 좀 알 것 같기도 합니다.
아, 질문드릴 때 빠뜨린 사항 없다고 생각했더니,
정작 중요한, 무슨 언어인지를 빠뜨려버렸네요.
지적 감사드려요.^^
포인터와 배열의
포인터와 배열의 차이점을 알면 될것같아요 : )
힌트 : 겪은바로는 segmentation fault는 대부분 메모리 문제더라구요 ㅎㅎ
흘러가고있는 지금 이 시간에 충실하자.
아직 공부가 부족합니다.
좀더 공부하겠습니다.
음... 역시 '입문자'와 '숙련가'의 차이겠지요..? ㅎㅎ;
segmentation fault 는
segmentation fault 는 포인터의 메모리접근을 잘못해서 그렇습니다.
경험상 대부분이 NULL 포인터죠...
1번 코드의 int *a 가 어디를 가리키는지 생각해보세요.
segmentation fault가
segmentation fault가 대부분 NULL 포인터 때문라는 말씀이지요?
아직 NULL 포인터가 뭔지, 머릿 속에 개념이 잘 안 잡힌 것 같아요.
*a를 선언하면, 'a라는 이름을 가진 주소를 선언할 거야.'인데,
음... 그 놈의 'a라는 이름의 주소'의 실제주소지가 어디인지 정해져있지 않았다는 것 같기도 하고.
음.. 그래서 scanf로 받은 정수값도 들어갈 자리를 못 찾은 것 같기도 하고..
음... 음..
아직 좀 알듯말듯 알송달송 합니다.
좀더 공부하겠습니다.
아무튼 답변 감사드려요.^^
댓글 달기