C언어

[C언어] 배열(array)[1] 선언, 초기화

자랄수있다 2022. 4. 15. 12:59

배열(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를 이용하자

 

배열 속 모든 변수들의 평균값 구하기

avr를 int값으로 주면 평균값은 43이 나온다.(정확도↓), 또한 처음에 avr값을 0으로 설정해주는 것도 포인트

수를 입력받아 배열 만들기

최대값 구하기

짝수의 개수 구하기

주의할 점 

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바이트가 된다.