[C언어] 배열(array)[1] 선언, 초기화
배열(Array)란, 한가지 자료형을 연속적으로 나열하는 것을 말한다. 출석부와 비슷하게 생각할 수 있다.
선언 방법은
자료형 변수이름[갯수];로 한다. ex) int money[4] = {1000, 5000, 10000, 50000)
위와 같이 하나하나 입력해주는 방법이 있고 더 간단하게는 아래와 같은 방식이 있다.
int형 arr라는 변수는 5개를 저장할 수 있는 배열로 선언되었고, 각각의 요소에 1,2,3,4,5를 저장하도록 초기화 되었다.
중괄호{}로 묶어 각 요소를 콤마로 구분하는 것이 초기화다.
배열의 초기화는 아래와 같이 갯수보다 적은 요소를 저장할 수 있다.
나머지 값은 0으로 초기화 되는 걸 알 수 있다. 그래서 배열을 모두 0으로 초기화하고자 할 때는
int arr[5] = {0}; 이런 식으로 사용하는 게 좋다. 초기화 값을 아예 정해주지 않으면 다음과 같이 쓰레기값(garbage value)가 생기기 때문이다.
쓰레기값에 대해서는 잠시후 설명하겠다.
또한, 배열을 선언할 땐 다음과 같이 갯수를 지정하지 않고 쓰는 방법도 있다.
초기화된 값 외에는 0이 아니라 쓰레기값으로 나타나는 것을 알 수 있다.
그렇다면 쓰레기값이란?
C언어에서 변수를 선언한다는 것은 메모리 공간을 할당 받는 것이다. 그렇다면 변수를 선언하기 전, 처음 그 안에는 어떤 값이 들어있을까? 그건 알 수 없다. 하나의 프로그램이 사용하던 메모리 공간은 프로그램이 종료되면 새 프로그램에서 재활용된다. 따라서, 이전 프로그램에서 각 메모리에 어떤 값을 남겨놓았는지는 알 수 없다. 그 값이 무엇이든 현재의 프로그램에서는 의미없는 값이므로 '쓰레기값'이라고 하는 것이다.
쓰레기 값을 제거하려면 변수에 원한는 값을 대입하면 된다. 그리하여 이 과정을 초기화라고 부르는 것이다.
+++ 팁 +++
int a[50] = {1,2,3,4 ...49,50}; 같은 형식의 순서(규칙)이 있는 배열은 하나하나 입력하기 보다는 loop를 이용하자
배열 속 모든 변수들의 평균값 구하기
수를 입력받아 배열 만들기
최대값 구하기
짝수의 개수 구하기
주의할 점
int a[5]; 로 설정했는데 a[6] 등, 선언하지 않은 메모리에 데이터를 넣으려고 하면 벗어난 데이터는 인접 메모리를 덮어쓰게 되는데 이때, 그곳에 이미 다른 데이터가 포함되어있을 수 있다. 손상을 받을 수 있는 데이터는 프로그램 변수와 프로그램 흐름 제어 데이터도 포함된다. 이로 인해 잘못된 프로그램 거동이 나타날 수 있으며, 메모리 접근 오류, 잘못된 결과, 프로그램 종료, 또는 시스템 보안 누설이 발생할 수 있다. 이를 버퍼 오버플로(buffer overflow)라고 한다.
문자열의 선언
위에서는 정수의 배열을 알아보았다. 물론 float을 이용해 실수로 된 배열도 만들 수 있다.
이번엔 문자열을 선언해보자. 문자열을 선언하는 방법은 아래와 같다. 편한 걸 쓰면 된다.
char name[] = "mamamoo";
char name[8] = "mamamoo";
char name[] = {'m', 'a', 'm', 'a', 'm', 'o', 'o', '\0'};
char name[8] = {'m', 'a', 'm', 'a', 'm', 'o', 'o', '\0'};
문자열을 선언할 때는 선언과 동시에 정의를 해줘야한다.
char mamamoo[8];
name = "mamamoo";
이렇게 분리할 경우 오류가 발생할 수 있기때문이다.
mamamoo는 7글자인데 8개의 자리를 주었다. 왜 그럴까? 위에 힌트가 있다.
일단 7을 대입해서 프린트해보자.
mamamoo는 제대로 출력되었는데 뒤에 이상한 문자들까지 딸려왔다.
문자열이 끝났음을 의미하는 NULL문자(\0)가 들어갈 자리가 없기 때문이다.
즉, mamamoo를 출력하기 위해서는 배열의 크기 +1.
[m][a][m][a][m][o][o][\0] 의 8자리가 필요하다.
배열의 크기를 정하지 않은 상태에서 sizeof로 메모리의 크기를 반환시켜보자.
8바이트라는 걸 확인할 수 있다.
한글로 하면 어떨까?
영어는 한 글자가 1바이트, 한글은 2바이트이다. NULL문자까지 해서 7바이트가 된다.