기출문제

yjjo8136 Reply 3 years 45 weeks ago
#include <stdio.h> void print_sizeof(char *name[]) { printf("%d\n", sizeof(name)); } void main() { char name1[][10] = { "Jan", "Feb" }; char *name2[] = { name1[0], name1[1] }; printf("%d\n", sizeof(name1)); printf("%d\n", sizeof(name2)); print_sizeof(name2); } 3,4분반 기출문제 8번입니다. 직접 실행시켜보니 sizeof(name2)가 16이고 print_sizeof(name2)의 출력값이 8이던데 이 두 값이 이렇게 나오는 이유를 모르겠습니다. 제가 예상하기로는 name2는 두개의 원소를 가진 포인터 배열이니까 크기가 8이고 print_sizeof(name2)역시 8이 나올것이라고 예상했습니다.. 이러한 결과가 나오는 이유를 설명해주시면 감사하겠습니다.
withcs2 Reply 3 years 45 weeks ago
name2는 사실 포인터로 구성된 일차원배열입니다. name2에는 포인터(8바이트)가 2개있으므로 printf("%d\n", sizeof(name2));는 16 void print_sizeof(char *name[])에서 name은 포인터이므로 print_sizeof(name2);는 원소 갯수 상관없이 8 #include <stdio.h> void print_sizeof(char *name[]) { printf("%d %p %p\n", sizeof(name), name, name[0]); } int main() { char name1[][10] = { "H", "e", "l", "l", "o" }; char *name2[] = { 1, 2, 3, 4, 5 }; char *name3[] = { name1[0], name1[1], name1[2], name1[3], name1[4] }; printf("%d %p %p\n", sizeof(name1), name1, name1[0]); print_sizeof(name1); printf("%d %p %p\n", sizeof(&name1), &name1, &name1[0]); printf("%d %p %p\n", sizeof(name2), name2, name2[0]); print_sizeof(name2); printf("%d %p %p\n", sizeof(&name2), &name2, &name2[0]); printf("%d %p %p\n", sizeof(name3), name3, name3[0]); print_sizeof(name3); printf("%d %p %p\n", sizeof(&name3), &name3, &name3[0]); } 이 코드를 한번 실행해보시면 이해하시는 데 도움이 될 것 같습니다. (%p는 주소값 출력하는 서식지정자입니다.)
hjhj5078 Reply 3 years 45 weeks ago
친절하신 설명 감사합니다.