inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

10.6 2차원 배열 연습문제

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

해결된 질문

484

쉽지않네

작성한 질문수 19

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의 전체 길이를 반환할 수 있을까요..??

c

답변 1

2

Soobak

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

1

쉽지않네

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

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

Export template 안됨

1

18

2

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

54

3

main 함수에서 왜 int만 선언이 되는걸까요

1

56

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

54

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

49

1

프로토타입과 함수간의 인자 불일치

1

73

2

12.12 헤더 관련 질문

1

60

2

Visual Studio Community 2026 사용 문의

1

137

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

61

2

getchar(), putchar()

1

93

3

강의자리ㅛ

1

79

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

113

2

소스파일안에 여러 파일

1

75

2

F5와 F7의 차이

1

76

2

c = TWO * (a+b); 에서 a와 b는?

1

58

2

; 세미콜론을 붙이는 기준에 문의

1

69

1

Step over 기능 문의

1

53

2

2.6 강의 따옴표 출력 규칙 문의

1

74

2

int main 함수 관련 오류 문의

1

67

2

13.4 words[0]

0

60

2

11.7 함수를 구현해 봤습니다.

1

62

2

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

1

65

2

11.6 my_strcat과 my_strncat을 구현해봤습니다.

1

53

2

11.6 fit_str함수를 구현해 봤습니다.

1

53

2