C/C++
이번 시간도 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[]로 선언해야 에러가 발생하지 않습니다.
이 이유를 아시겠습니까?
다음 글에서 자세히 설명해 드리겠습니다.