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 |