인프런 커뮤니티 질문&답변

쉽지않네님의 프로필 이미지
쉽지않네

작성한 질문수

홍정모의 따라하며 배우는 C언어

10.6 2차원 배열 연습문제

10.6강 1번 문제 1차원 배열을 2차원 배열로 만드는 문제

해결된 질문

작성

·

341

·

수정됨

2

double year2021[MONTHS] = { -2.4, 2.7, 9.0, 14.2, 17.1, 22.8, 28.1, 25.9, 22.6, 15.6, 8.2, 0.6 };

double year2022[MONTHS] = { -2.2, -1.1, 7.7, 14.8, 19.1, 23.3, 27.3, 25.7, 22.4, 14.6, 10.0, -2.8 };

double year2023[MONTHS] = { -1.5, 2.3, 9.8, 13.8, 19.5, 23.4, 26.7, 27.2, 23.7, 15.8, 6.8, 3.1 };

// 1. 1차원 배열을 2차원 배열로 구현
// 배열명의 값은 배열의 시작 주소와 같다.
double* temperature[] = { year2021, year2022, year2023 };

printf("%zd %zd %zd %zd\n", sizeof(temperature), sizeof(temperature[0]), sizeof(*temperature[0]), sizeof(year2021) );

 

1차원 배열(2021년, 2022년, 2023년)의 주소를 2차원 포인터 배열의 요소로 초기화했습니다.

// 1. 1차원 배열을 2차원 배열로 구현
// 배열명의 값은 배열의 시작 주소와 같다.
double* temperature[] = { year2021, year2022, year2023 };

 

2중 for문의 내부 for문의 조건부를 지정할 때 sizeof 연산자를 이용해서 아래같은 방식으로 구현하려고 했습니다.

size_t col = sizeof(temperature[0]) / sizeof[double];

for(int j = 0; j < sizeof(temperature) / sizeof(temperature[0]); ++j) {
   for(int i = 0; i < col; ++i) {
       // (j, i)번째 요소 출력문
   }
}

 

제가 생각한건 'temperature[0]에 저장된 값이 year2021의 메모리 시작 주소와 같으므로 temperature[0]의 값을 역참조하면 year2021 배열 전체를 가리킬 것이다' 였는데

sizeof(*temperature[0]);

이 값이 year2021 0번째 double 요소로 역참조되서 그런지 결과값이 8로 잡혀서

size_t col = sizeof(temperature[0]) / sizeof[double];

col의 값이 1로 계산됩니다.. 

 

어떻게 하면 temperature[0]을 이용해서 배열 year2021의 전체 길이를 반환할 수 있을까요..??

답변 1

2

안녕하세요, 답변 도우미 Soobak 입니다.

 

잘 이해하고 계신 것 같아서, 약간의 부연 설명만 드려봅니다.

 

결론을 먼저 말씀드리면, 일반적인 경우 배열의 길이 정보를 별도로 저장하거나, 배열의 끝을 나타내는 특별한 값을 사용하는 방법 등의 추가적인 방식이 필요합니다.

 

sizeof 연산자는 배열이 아닌 포인터에 사용될 경우, 포인터의 크기를 반환합니다.

 

유추하신 것 처럼, temperaturedouble * 의 배열입니다.
따라서, temperature[0]double * 자료형이며, sizeof(temperature[0]) 은 포인터의 크기를 반환합니다.
즉, 64 비트 시스템에서는 8 바이트를, 32 비트 시스템에서는 4 바이트를 반환하게 됩니다.

 

C 언어에서 배열의 길이를 직접 포인터에서 얻어내는 것은 기본적으로 불가능합니다.
포인터는 배열 자체의 길이 정보를 포함하지 않기 때문입니다.

 

이는 일반적인 상황에서 배열의 길이를 알아내기 위해, 배열이 선언된 스코프에서 sizeof 연산자를 사용하는 것과는 구분하여야 합니다.
예를 들어, 잘 이해하고 계신 것 처럼 sizeof(year2021) / sizeof(double)year2021 배열의 원소 수를 반환합니다.
하지만, 포인터에 sizeof 연산자를 사용하는 경우에는 반환 값이 포인터의 크기입니다.

 

따라서, 위에서 말씀드린 것 처럼 추가적인 접근 방식을 사용해야 합니다.

쉽지않네님의 프로필 이미지
쉽지않네
질문자

답변해주신 내용으로 더 확실하게 이해했습니다!!

정말 상세한 답변 감사드립니다!!

쉽지않네님의 프로필 이미지
쉽지않네

작성한 질문수

질문하기