Code Snippet
- #include<stdio.h>
- #include<stdlib.h>
-
- int main(void)
- {
- char *ar[3];
- char *arr[3] = { "AAA" , "BBBB" , "CCCCC" };
- char arrr[3][20] = { "AAA", "BBBB", "CCCCC" };
-
- int num[3];
- int i;
-
- for (i = 0; i < 3; i++)
- {
- scanf("%d", &num[i]);
- ar[i] = (char *)malloc(num[i] * sizeof(char));
- // memset(ar[i],'%', num[i]);
- // printf("%c\n", ar[i][0]);
- }
-
- for (i = 0; i < 3; i++)
- {
- printf("%d \n", sizeof(ar[i]));
- printf("%d \n", sizeof(arr[i]));
- printf("%d \n\n", sizeof(arrr[i]));
- }
-
- for (i = 0; i < 3; i++)
- {
- free(ar[i]);
- }
-
- }
재가 작성한 코드입니다.
입력을 통해 num배열에 숫자를 저장하고
malloc을 통해서 문자열배열 ar에 필요한 만큼의 메모리를 할당하고
할당된 메모리 크기를 sizeof를 통해서 출력하는 프로그램인데
동적 메모리 할당한 *ar과 문자형 포인터배열(문자열 배열)인 *arr은 4가 출력되고(아마 포인터 크기를 반환한듯합니다.)
문자형 2차원 배열인 arrr만이 배열의 크기인 10을 반환합니다.
sizeof에 인수로 포인터를 전달했다고 4를 반환한거라면
배열의 이름도 포인터임에도 불구하고 sizeof에 인수로 넣을경우 왜 포인터 크기인 4가아닌 배열의 크기가 출력되는건지...
인터넷에서는 '배열의 이름은 포인터다.'라고 표현한건 동작이 비슷하기 때문에
이해하기 쉽게 그렇게 알려주는거지 실제 내용은 너무 어려워서 그냥 "똑같다"라고 표현하는 책이 많아서 그런거라는 말이 있네요...
즉, 엄밀히 말하자면
"배열의 이름은 포인터처럼 사용할 수 있지만 포인터는 아니다" 가 되는건데...
여기 까지 오니 머릿속으로 차곡차곡 쌓아놓은 지식들이 뭔가 위태위태 해지는 느낌이......
왜 출력값이 달라지는건지 쉬원하게 설명좀 해주세요 ㅠㅠ