[완료][초보질문] 포인터 예제 연습 중 segmentation fault가 발생했습니다.

soundlake의 이미지

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 &lt;stdio.h&gt;
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&lt;*p; i++) 
        putchar('*');
    putchar('\n');
}

혹시나 싶어서, 저는 우분투 리눅스 9.10 칼믹 amd-x64 사용 중이며,
컴파일러는 우분투 저장소에서 받은 gcc 4.4.1버전입니다.

함수가 int *p형의 매개변수를 받는다면, 포인터를 매개변수로 갖는 것이지요?

4. 질문을 하다가 다시 생각이 떠올라 실험을 해보았는데 이 경우도 성공입니다.

#include &lt;stdio.h&gt;
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&lt;*p; i++) 
        putchar('*');
    putchar('\n');
}

4번의 예가 성공한다면, 어째서 단지 a를 *a로, &a를 a로 바꾼 것 밖에 없는 2번은 segmentation fault가 나는 것일까요. ㅠ

어쩌다보니 쓰잘데 없이 긴 푸념성 글이 된 듯 싶지만, 혹시라도 가르쳐주실 수 있을까요?
음... 아니면 뭘 공부하면 이런 문제를 해결할 수 있게 될런지라도 가르쳐주실 수 있을까요?

flymc83의 이미지

포인터 개념이 아직 잘 안잡히셔서 모를수도 있습니다. 서점이나 c언어책, 혹은 인터넷자료에서 포인터 개념을 잡으시면 이해가 가실듯 싶네요.

soundlake의 이미지

일단 좀더 인내심을 가지고 열공하겠습니다!

ifree의 이미지

C 인가요?
printf scanf 를 사용하면서 문제가 생기기도 합니다.
1번 코드에서 두 함수를 쓰지 말고 *a = 10 , 이런 식으로 숫자를 직접 대입해서 원하는 결과가 나오는지 보세요.

ps. 포인터 초기화도 안돼 있군요.

int *a = new int();
or
int b;
a = &b;

soundlake의 이미지

아직 포인터를 초기화한다는 개념을 잘 못 잡은 것 같아요.
열공하겠습니다.

보여주신 코드 보니까, 좀 알 것 같기도 합니다.

아, 질문드릴 때 빠뜨린 사항 없다고 생각했더니,
정작 중요한, 무슨 언어인지를 빠뜨려버렸네요.
지적 감사드려요.^^

kgcrom의 이미지

포인터와 배열의 차이점을 알면 될것같아요 : )

힌트 : 겪은바로는 segmentation fault는 대부분 메모리 문제더라구요 ㅎㅎ

흘러가고있는 지금 이 시간에 충실하자.

soundlake의 이미지

좀더 공부하겠습니다.
음... 역시 '입문자'와 '숙련가'의 차이겠지요..? ㅎㅎ;

haze11의 이미지

segmentation fault 는 포인터의 메모리접근을 잘못해서 그렇습니다.
경험상 대부분이 NULL 포인터죠...
1번 코드의 int *a 가 어디를 가리키는지 생각해보세요.

soundlake의 이미지

segmentation fault가 대부분 NULL 포인터 때문라는 말씀이지요?
아직 NULL 포인터가 뭔지, 머릿 속에 개념이 잘 안 잡힌 것 같아요.
*a를 선언하면, 'a라는 이름을 가진 주소를 선언할 거야.'인데,
음... 그 놈의 'a라는 이름의 주소'의 실제주소지가 어디인지 정해져있지 않았다는 것 같기도 하고.
음.. 그래서 scanf로 받은 정수값도 들어갈 자리를 못 찾은 것 같기도 하고..
음... 음..

아직 좀 알듯말듯 알송달송 합니다.
좀더 공부하겠습니다.

아무튼 답변 감사드려요.^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.