이번 시간도 C언어의 포인터와 배열 사용의 주의 점을 설명합니다.

C언어에 어느 정도 자신이 생겼다 싶었는데 포인터는 물론 배열 때문에 주눅이 들 때가 있습니다.

이유는 포인터와 배열 사용의 모호한 모습을 보여 주고 있는 C언어의 특성 때문으로

C의 포인터와 배열이 같다라고 생각하는 분이 많습니다.

그러나 이전 강좌 내용을 보시면 비슷해도 전혀 같지 않음을 알 수 있습니다.

  • 포인터 - 헷갈리게 하는 것 하나
    http://forum.falinux.com/zbxe/index.php?mid=gcc&page=2&document_srl=405856
  • C 배열 요소의 주소값을 참조할 때의 옳은 습관?
    http://forum.falinux.com/zbxe/index.php?mid=gcc&document_srl=804305
  • C 배열 요소의 주소값을 참조할 때의 옳은 습관? 두 번째
    http://forum.falinux.com/zbxe/index.php?mid=gcc&document_srl=804338

포인터와 배열의 차이점을 정확히 알아야 버그 없는 안전한 코드를 작성할 수 있습니다.

그렇다면 아래 코드 main.c의 내용을 보실까요?


void print_fun( char *str){


    printf( "str=%s\n", str);

}


char    str[]   = "falinux.com";


int main( void){


    print_fun( str);

    return 0;

}


위 코드에 잘 못된 부분이 있나요? 네, 정상적인 코드입니다.

배열 변수 str을 print_fun()에서 포인터 변수로 받았다는 점을 주목하여 주십시오.


자, 이제 void print_fun() 함수를 sub.c 에 옮기겠습니다.

그래서 main.c를 아래와 같이 고쳤습니다.


extern void print_fun( char *str);


char    str[]   = "falinux.com";


int main( void){

    print_fun( str);

    return 0;

}


어떻습니까? 전혀 문제가 없죠? 그렇다면 print_fun()에서 main.c에 있는 str[] 전역 변수를 사용해 보겠습니다.

즉, main()에서 print_fun( str)이 아닌 print_fun()으로 호출하고 sub.c의 print_fun()에서 main.c에 있는 str 배열 변수를

직접 출력하겠습니다.


그래서 아래와 같이 sub.c를 수정했습니다.


extern char *str;


void print_fun( void){

    printf( "str=%s\n", str);

}


어떻습니까? 코드에 이상이 있나요? 컴파일하면 에러 없이 잘 됩니다.

그러나 실행하면 세그멘테이션 에러가 발생합니다.


extern char str[];


void print_fun( void){

    printf( "str=%s\n", str);

}


char *str 이 아니라 배열 변수 char str[]로 선언해야 에러가 발생하지 않습니다.

이 이유를 아시겠습니까?


다음 글에서 자세히 설명해 드리겠습니다.