본문 바로가기
공부/TIL

[TIL]2022/03/01

by 노르웨이모리 2022. 3. 1.

C static 배열과 dynamic 배열 (malloc)의 차이

 

다음과 같은 static하게 정의된 배열이 있다고 하자.

int arr1[3] = {1,2,3};
printf("%p\n", arr1);
printf("%p\n", &arr1);

output:
0000003CF52FF648
0000003CF52FF648

arr1는 배열의 첫번째 원소를 가리키는 포인터고, &arr1는 배열 전체를 가리키는 포인터이다. 

내포하는 의미는 다르지만 arr의 첫 원소 주소 값으로 같은 값을 가진다.

그런데 이건 static하게 정의된 배열에 관해서는 맞는 말이다.

 

다음과 같이 malloc을 사용해서 정의한 배열이 있다 하자.

int* arr2 = (int*)malloc(sizeof(int) * 4);
printf("%p\n", arr2);
printf("%p\n", &arr2);

output:
000002574617E060
000000ED47AFFA98

여기서는 arr2값이랑 &arr2값이 아예 다른 것을 관찰할 수 있다.

왜냐하면 이 경우에선 &arr2이 포인터의 포인터로서 독립적인 메모리 공간을 가지고 있기 때문이다.

arr2 포인터가 저장된 주소가 &arr2인 거다. 

 

결론은, malloc으로 배열을 선언하면 연속적인 메모리를 할당한다는 것 빼고는 배열 보다는 포인터에 더 가깝다는 거다.

malloc으로 선언된 배열은 그러니까 static 하게 선언된 배열을 대하는 것과는 다르게, 포인터인 것 처럼 취급하는 게 더 편리하다.

'공부 > TIL' 카테고리의 다른 글

[TIL]2022/03/08  (0) 2022.03.08
[TIL]2022/03/05  (0) 2022.03.05
[TIL]2022/02/22  (0) 2022.02.22
[TIL]2022/02/14  (0) 2022.02.14
[TIL]2022/2/3  (0) 2022.02.03