C언어 배열 크기 입력받기 - ceon-eo baeyeol keugi iblyeogbadgi

배열(array)

변수들의 집합이며 여러 값을 한 변수의 첫 번째 주소(0번째)를 사용해

메모리에 기억시켜 사용합니다.

배열은 복잡 다양한 정보의 양을 다뤄야 하는 면에서 좋은 기능을 보여줍니다.

C언어 - 배열이란?

#include <stdio.h> int main() { int a, b, c, d, e; printf("다섯개의 정수를 입력하시오 >> "); scanf("%d%d%d%d%d", &a, &b, &c, &d, &e); printf("%d\n%d\n%d\n%d\n%d\n", a, b, c, d, e); return 0; } >>> 다섯개의 정수를 입력하시오 >> 1 2 3 4 5 1 2 3 4 5

만약 다섯개의 int형 값을 받아야 한다고 가정했을 때

하나의 int형 값마다 변수를 하나씩 선언해 개별적으로 값을 받는 과정은

지나치게 비효율적입니다.

위 코드에서 배열은 5개의 값을 한 번에 저장합니다.

또한 배열을 다시 불러낼 때는 배열의 첫 번째 주소(0번째) 값이 호출됩니다.

C언어 - 배열 기초적인 사용법

#include <stdio.h> int main() { int num[5]; for(int i=0; i<5; i++) { printf("정수를 입력하시오 >> "); scanf("%d", &num[i]); } for(int j=0; j<5; j++) { printf("정수의 값 출력 >> %d\n", num[j]); } return 0; } >>> 정수를 입력하시오 >> 1 정수를 입력하시오 >> 2 정수를 입력하시오 >> 3 정수를 입력하시오 >> 4 정수를 입력하시오 >> 5 정수의 값 출력 >> 1 정수의 값 출력 >> 2 정수의 값 출력 >> 3 정수의 값 출력 >> 4 정수의 값 출력 >> 5

위 코드에서 선언된 int num [5]; 는

int형 배열이며

[5]는 배열의 사이즈(크기) 즉 5의 크기를 가진 배열이라는 뜻입니다.

정수형 배열 num은 5개의 변수만큼의 크기를 가집니다.

int 형 변수 하나가 C언어에서는 4 bytes의 크기를 가지니

num [5]은 20 bytes의 크기를 가집니다.

C언어 - 배열의 초기화와 문자 배열

#include <stdio.h> int main() { int num[]={1,2,3,4,5}; char str[20]; for(int i=0; i<5; i++) { printf("%d\n", num[i]); } scanf("%s", str); printf("문자열 출력 : %s", str); return 0; } >>> 1 2 3 4 5 hello 문자열 출력 : hello

배열에 미리 크기(size)를 지정해준 뒤 값을 받을 수도 있지만

별도로 값을 지정하지 않은 상태에서 배열에 값을 초기화해 줄 수도 있습니다.

위 코드에서 num 배열은 5개의 변수를 받았지만

따로 크기가 지정되어 있지 않습니다.

char str [20]; 문자형 배열 str은 20의 크기를 지정받았고

scanf() 입력 함수를 통해 값을 입력받아 hello라는 문자열을 출력했습니다.

C언어 - 배열 사이즈를 알려주는 sizeof 함수

#include <stdio.h> int main() { char str[]="hello world"; int size=0; size=sizeof(str)/sizeof(str[0]); printf("문자열 str의 개수는 %d개입니다.", size); return 0; } >>> 문자열 str의 개수는 12개입니다.

sizeof() 함수는 크기를 () 내의 변수의 크기를 반환합니다.

위 size라는 변수에서는 str이라는 문자형 배열의 크기를 측정 해서

str에 몇 개의 문자가 들어있는지 출력했습니다.

C언어 - 배열 예제 1 // 입력한 단어의 길이 출력하기 + strlen()

#include <stdio.h> #include <string.h> int main() { char str[50]; printf("문자열을 입력하시오 >> "); scanf("%s", str); printf("입력하신 단어는 %s이고 단어의 길이는 %d\n", str,strlen(str)); return 0; } >>> 문자열을 입력하시오 >> hello 입력하신 단어는 hello이고 단어의 길이는 5

strlen() 함수는 문자열의 길이을 측정해 반환합니다.

str배열은 50의 크기가 선언되어있지만

scanf()를 통해 실제 입력받은 값은 hello=5 이므로

strlen()은 5를 반환합니다.

strlen()함수는 string.h 헤더에 포함되어있기에

사용을 위해서는 string.h를 선언해주어야 합니다.

string.h -> 문자열 헤더

동적 배열이란?

동적 배열은 heap을 이용하여 배열의 크기를 컴파일 단계가 아닌 실행시간에 가변적으로 바꿀 수 있는 배열을 말합니다

위 코드는 자바에서 동적배열을 생성하는 코드입니다. 하지만 이 코드를 그대로 C언어에서 생성해본다면 "식에 상수값이 있어야 합니다."라는 문구와 함께 에러가 나게 되는데요. 이렇듯 C언어에서는 Java와는 달리 변수를 배열의 길이에 오지 못하게 제한되어 있습니다. 그렇기 때문에 C언어에서는 동적 배열을 생성할때는 malloc함수를 활용하여 동적 메모리를 할당하는 방법을 써야 합니다. malloc함수에 대해 알고싶다면 아래 링크를 클릭해주세요.

[C언어] 메모리 동적할당 (malloc, free) 함수 사용법 & 예제

1차원 동적 배열 생성하기

#include <stdio.h> #include <stdlib.h> int main() { int size; printf("배열의 사이즈 : "); scanf_s("%d", &size); int* arr = (int*)malloc(sizeof(int) * size); //동적할당 for (int i = 0; i < size; i++) arr[i] = i; for (int i = 0; i < size; i++) printf("arr[%d] : %d\n", i,arr[i]); free(arr); //메모리 해제 return 0; }

동적배열을 생성하는 방법은 위와 같습니다. malloc함수를 사용하여 Heap에 원하는 크기만큼의 동적 메모리를 생성하고 사용하면 됩니다. 배열은 연속된 메모리의 공간을 말합니다. 그렇기에 메모리의 포인터에 동적으로 생성하고싶은 사이즈만큼의 공간을 할당하면 됩니다.

그림으로 표현하면 위와 같습니다. 먼저 포인터변수를 선언하고 Heap에 동적으로 만들어놓은 배열의 시작주소를 저장해주면 우리는 포인터 변수를 통해 동적할당된 메모리에 접근이 가능하며 동적으로 할당받은 메모리도 배열처럼 [index]로 접근이 가능합니다.

만약 NULL포인터를 역참조하고 있습니다. 버퍼 오버런이 발생하였습니다. 같은 경고가 뜬다면 해당 파일이 C로 되어있는지 확인해주세요. C++에서는 malloc함수를 사용하는것에서 new라는 연산자를 사용하는것으로 바뀌었기 때문에 경고가 뜹니다.

2차원 동적 배열 생성하기

#include <stdio.h> #include <stdlib.h> int main() { int size; printf("배열의 사이즈 : "); scanf_s("%d", &size); //size만큼 배열의 세로 동적할당 int** arr = (int**)malloc(sizeof(int*) * size); //size만큼 배열의 가로 동적할당 for (int i = 0; i < size; i++) { arr[i] = (int*)malloc(sizeof(int) * size); } for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { arr[i][j] = i + j; } } //배열의 값 출력 for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { printf("arr[%d][%d] : %d ", i, j, arr[i][j]); } printf("\n"); } //메모리 해제 for (int i = 0; i < size; i++) { free(arr[i]); } free(arr); return 0; }

1차원 배열을 동적 생성할때의 모습을 잘 보면 포인터 하나를 가지고 동적 할당한 메모리의 주소의 첫번째 위치를 참조하는 식으로 동적 배열을 생성하였습니다. 2차원 배열도 원리는 같습니다. 다만 2차원 배열이기에 2차원 포인터를 사용하여 두번 참조해주어야 합니다.

2차원 배열을 생성한다면 위와 같은 형식으로 메모리를 참조하게 됩니다.

Toplist

최신 우편물

태그