C/C++
"C 배열 요소의 주소값을 참조할 때의 옳은 습관?" 이라는 주제로 글을 이어서 글을 올립니다.
이전 글을 통해 C언어에서 포인터와 배열의 차이를 알아 보았습니다.
제가 이 글을 쓰게된 이유는 작은 논란 때문입니다.
버그 없는 코딩을 위해 배열의 주소를 넘겨 줄 때 배열 이름만 사용하는 것이 아니라
첫 번째 요소를 이용하는 것이 버그 없는 코딩이라는 것이죠.
즉, 아래와 같은 코드입니다.
void fun( char *ptr){
}
int main( void){
char array[100];
fun( &array[0]);
}
어떻습니까? 이와 같은 방법이 옳을까요?
왜 이렇게 사용할까요?
이렇게 사용하자는 분의 주장은 이렇습니다.
예를 들어 array[10] 번째 주소를 넘겨 주려 합니다.
그러면 코드는 당연히 아래와 같이 됩니다.
fun( &array[10]);
당연하죠? 배열은 포인터와 달리 변수 자체에 대한 메모리가 없습니다.
이전 글에서 여러 번 말씀 드렸죠.
연속되는 메모리인 배열에서 [10]번 요소의 주소값을 넘겨 주기 위해 &array[10]을 사용했다면
당연히 첫 번째 요소인 [0]에 대해서도 &array[0]으로 해야 옳다는 얘기입니다.
이 주장에 동의하시나요? 만일 동의하신 다면 지금까지 이렇게 사용해 오시지 않으셨나요?
char array[100];
strcpy( array, "falinux.com");
"falinux.com"을 array 배열 첫 번째 요소부터 차례로 넣어야 하고
strcpy()의 첫 번째 요소도 포인터 이므로 앞서 주장대로라면 아래와 같이 사용해야 합니다.
strcpy( &array[0], "falinux.com");
이렇게 반드시 사용해야 한다면 포인터 변수와 배열 변수는 코드에서 구별됩니다.
char array[100];
char *ptr;
ptr = malloc( 100);
strcpy( &array[0], "falinux.com");
strcpy( ptr, "falinux.com");
이렇게 하면 배열 변수와 포인터가 구별되네요. 그렇다면 과연 이 방법이 옳을까요?
주장이 틀린 것이 아니지만, 저는 옳다고 생각하지 않습니다.
이 주장에 대해 어떻게 생각하시나요? ^^