[C/C++] 배열 선언

김민석·2024년 12월 3일
0

C/C++

목록 보기
9/9

C언어 베열 선언 방식

int arr[] = {0,1,2,3,4};
printf("%p\n", arr);

=> 0x{첫 번째 요소의 메모리 주소}

위의 코드는 C언어에서 배열을 선언하는 코드이다. 변수 arr에는 배열 {0,1,2,3,4}의 첫 번째 요소의 메모리 주소가 들어간다.

그렇다면 아래와 같은 방식으로 포인터 변수를 선언한 이후 그 포인터 변수에 배열을 할당 하려고 하면 어떻게 될까?

int* arr = {0,1,2,3,4};
printf("%d\n", arr[0]);

=> Segmentation fault: 11

Segmentation fault 오류가 발생하는데 왜냐하면 int* arr 포인터 변수에 배열 할당이 안되기 때문이다. 실제로 포인터 변수 arr를 확인해보면 배열의 첫 번째 요소의 주소가 아니라 0x0으로 초기화되어있는 것을 확인할 수 있다.

printf("%p\n", arr);

=> 0x0

그렇다면 왜 int* arr = {0,1,2,3,4}와 같이 포인터 변수를 사용한 배열 선언이 불가능할까? int arr[] = {0,1,2,3,4}와 같이 선언한 배열의 int arr[]int* arr와 같이 배열의 첫 번째 요소를 가리키는 포인터인데 말이다.

그 이유는 {0,1,2,3,4} 배열 선언이 첫 번째 요소의 주소값을 반환하는게 아니라 배열 그 자체를 복사해서 반환하기 때문이다. int* arr는 배열 그 자체를 담을 수 없는 단순 포인터 변수이기 때문에 선언이 안되는 것이다. 그리고 int arr[]는 배열 자체를 담지만 코드에서 사용될 때에는 첫 번째 요소를 가리키는 포인터 상수로 동작하기 때문이다.

profile
명품개발자지망생

0개의 댓글