C에서 배열을 동적으로 할당
-
malloc
함수를 사용하여 C에서 동적으로 배열 할당 -
realloc
함수를 사용하여 C에서 이미 할당 된 메모리 영역 수정 - 매크로를 사용하여 C에서 주어진 객체 배열에 대한 할당 구현
이 기사에서는 C에서 배열을 동적으로 할당하는 방법에 대한 여러 가지 방법을 보여줍니다.
malloc
함수를 사용하여 C에서 동적으로 배열 할당
malloc
함수는 힙에 동적 메모리를 할당하는 핵심 기능입니다. 주어진 바이트 수를 할당하고 메모리 영역에 대한 포인터를 반환합니다. 따라서 특정 객체 유형의 배열을 동적으로 할당하려면 먼저 유형에 대한 포인터를 선언해야합니다. 다음으로 malloc
은 단일 객체의 크기를 곱한 요소 수를 인수로 전달하여 호출해야합니다.
다음 예에서는 문자열을 저장할 메모리를 할당합니다. errno
는 보안 코딩 표준에서 요구하는대로 0으로 설정되고malloc
호출에서 반환 된 포인터를 검사하여 함수의 성공적인 실행을 확인합니다. 마지막으로memmove
기능을 사용하여 문자열을 할당 된 메모리 위치에 복사합니다.
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
const char *str = "random string to be moved";
int main() {
char *arr = NULL;
errno = 0;
arr = malloc(SIZE * sizeof(char));
if (!arr) {
perror("malloc");
exit(EXIT_FAILURE);
}
memmove(arr, str, strlen(str));
printf("arr: %s\n", arr);
free(arr);
exit(EXIT_SUCCESS);
}
출력:
arr: random string to be moved
realloc
함수를 사용하여 C에서 이미 할당 된 메모리 영역 수정
realloc
함수는malloc
호출에 의해 이전에 할당 된 메모리 영역의 크기를 수정하는 데 사용됩니다. 두 번째 인수로 원래 메모리 주소와 새 크기를 사용합니다. realloc
은 전달 된 것과 동일한 포인터를 반환하거나 요청 된 크기 및 주어진 주소 이후의 사용 가능한 메모리에 따라 다른 포인터를 반환 할 수 있습니다. 한편, 이전 배열의 내용은 새로 지정된 크기까지 변경되지 않습니다.
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
const char *str = "random string to be moved";
int main() {
char *arr = NULL;
errno = 0;
arr = malloc(SIZE);
if (!arr) {
perror("malloc");
exit(EXIT_FAILURE);
}
int num = 102; // User Provided Value
for (int i = 0; i < num; ++i) {
if (i > SIZE) {
arr = realloc(arr, 2 * SIZE);
if (!arr) {
perror("realloc");
exit(EXIT_FAILURE);
}
}
arr[i] = 'a';
}
free(arr);
exit(EXIT_SUCCESS);
}
매크로를 사용하여 C에서 주어진 객체 배열에 대한 할당 구현
일반적으로malloc
은 일부 사용자 정의 구조의 배열을 할당하는 데 사용됩니다. malloc
은void
포인터를 반환하고 암시 적으로 다른 유형으로 캐스트 될 수 있으므로 더 나은 방법은 반환 된 포인터를 해당 유형으로 명시 적으로 캐스트하는 것입니다. 상대적으로 놓치기 쉽고 적절한 표기법을 포함하지 않기 때문에 배열의 요소 수와 객체 유형을 사용하여 올바른 캐스트를 포함하여 올바른malloc
문을 자동으로 구성하는 매크로 표현식을 구현했습니다.
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
typedef enum {
Jan,
Feb,
MAR,
APR,
MAY,
JUN,
JUL,
AUG,
SEP,
OCT,
NOV,
DEC
} month;
typedef struct {
unsigned char dd;
month mm;
unsigned yy;
} date;
#define MALLOC_ARRAY(number, type) ((type *)malloc((number) * sizeof(type)))
int main() {
date *d = NULL;
errno = 0;
d = MALLOC_ARRAY(SIZE, date);
if (!d) {
perror("malloc");
exit(EXIT_FAILURE);
}
free(d);
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook