본문 바로가기
배운 것들 메모/따라 배우는 C언어

[홍정모의 따라하며 배우는 C언어] 6.16 배열(Array)과 런타임(Runtime) 에러

by 야속한 낭만 2024. 10. 20.

[ ] 배열 자동 크기 조절

	char my_chars[] = "Hello, World!";

 

이렇게, 비워놓고 사용하며, 후에 나올 Null character의 글자 수만큼 자동으로 늘어난다.

 

 

▶C 스타일 코딩에서는 상수, 고정되어 있는 숫자를 표현할 때 \#define을 많이 쓴다고 한다.

 

 

고정된 상수를 #define으로 사용할 때,

자주 보는 형태가 배열에 사용하는 것이다.

 

후에 쓸 NUM_DAYS에 하나 하나 대입하지 않고, 위에 숫자만 수정하면 나머지는 자동으로 바뀌기 때문에 편리하다.

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#define NUM_DAYS 365

int main()
{
	char my_chars[] = "Hello, World!";
	int daily_temperature[NUM_DAYS];
	double stock_price_history[NUM_DAYS];
	
	printf("%zd\n", sizeof(stock_price_history));
	printf("%zd\n", sizeof(daily_temperature));
	printf("%zd\n", sizeof(double) * NUM_DAYS);
	printf("%zd\n", sizeof(stock_price_history[0]));

}

 

여기서, 재미있게 보던 부분은 요 부분이다.

	printf("%zd\n", sizeof(stock_price_history));
	printf("%zd\n", sizeof(double) * NUM_DAYS);
  • 둘의 생김새는 다르지만, 결과 값은 똑같이 나온다. 한 번 하나 하나 파헤쳐 보자.

sizeof(double)와 배열의 개수를 의미하는 NUM DAYS를 곱한다. 라는 의미다.

double의 타입 크기는 8바이트 그리고 NUM_DAYS는 365이다.

둘이 곱하면, 2920이다.

 

배열 예시 1)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#define NUM_DAYS 365

int main()
{

	int my_number[5];

	my_number[0] = 1;
	my_number[1] = 3;
	my_number[2] = 4;
	my_number[3] = 2;
	my_number[4] = 1024;

	scanf("%d", my_number);

	printf("%d\n", my_number[0]);
	printf("%d\n", my_number[1]);
	printf("%d\n", my_number[2]);
	printf("%d\n", my_number[3]);
	printf("%d\n", my_number[4]);

}

 

배열의 순서는 인간처럼 순서를 1 , 2, 3, 4, 5 이런 식으로 정하는 것이 아니라,

첫 번째가 0인, 0, 1, 2, 3, 4 이렇게 센다.

scanf("%d", &(my_number[0]); // 첫 번째
scanf("%d", &my_number[0]; // 두 번째
scanf("%d", my_number[0]; // 세 번째

 

▶우선순위에 대해서

&(adress operator) < [0] 배열

따라서, 첫 번째처럼 안 쓰고, 두 번째처럼 써도 무방하다.

그리고, 배열 같은 경우는 이 이름 자체가 주소이기 때문에, &을 안 붙여도 제대로 작동한다.

따라서, 세 번째처럼 써도 무방하다.

 

컴파일 타임(Compile) 그리고 런타임(Runtime) 에러

초보자 때, 우리가 배열에서 자주 실수하는 것을 예시를 들겠다.

int my_number[5];

my_number[5] = 123;

 

[ ] 안에 있는 인덱스가 0 ~ 4까지 해서 5개인데, 가끔 사람들이 배열 범위에서 초과된 숫자를 집어 넣을 때가 있다.

이럴 때는 문법  오류는 아니기 때문에, 비쥬얼 스튜디오에서는 안 잡아주고, 런타임(실시간)으로 프로그램을 실행했을 때 잡아준다고 한다.

 

근데 강의가 5년 전 강의라 그런지 2022년 비쥬얼 스튜디오에서는 경고 정도는 해준다.

 

출처:  홍정모의 따라배우는 C언어

강의 외의 추가된 것들은 책 그리고 인터넷 조사해서 얻었음