"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");


이렇게 하면 배열 변수와 포인터가 구별되네요. 그렇다면 과연 이 방법이 옳을까요?

주장이 틀린 것이 아니지만, 저는 옳다고 생각하지 않습니다.

이 주장에 대해 어떻게 생각하시나요? ^^