산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

malloc vs calloc: 핵심 차이점과 실전 예제로 완벽 이해

동적 메모리 할당이란?

동적 메모리 할당을 사용하면 프로그램이 런타임에 메모리를 요청하고 해제할 수 있습니다. C언어에서 표준 라이브러리는 이 목적을 위해 네 가지 주요 함수를 제공합니다: malloc(), calloc(), realloc(), free() — 모두 stdlib.h에 선언되어 있습니다.

malloc(): 단일 메모리 블록 할당

malloc()(memory allocation의 줄임말)은 연속된 바이트 블록을 예약하고 첫 번째 바이트에 대한 포인터를 반환합니다. 새로 할당된 블록의 내용은 불확정(indeterminate) 상태로, 해당 메모리 위치에 있던 비트 패턴이 그대로 남아 있습니다.

일반적인 사용법:

int *p = (int *)malloc(n * sizeof(int));
요청이 실패하면 malloc()은 NULL을 반환합니다.

calloc(): 다중 제로 초기화 블록 할당

calloc()(contiguous allocation의 줄임말)은 두 개의 인자를 받습니다: 요소의 개수와 각 요소의 크기. 모든 요소에 대한 메모리를 할당하고 모든 바이트를 자동으로 0으로 설정하므로, 깨끗한 초기 상태가 필요한 배열이나 구조체에 이상적입니다.

일반적인 사용법:

int *p = (int *)calloc(n, sizeof(int));
malloc()과 마찬가지로 할당 실패 시 NULL을 반환합니다.

각 함수 사용 시기

문법 개요

malloc()

void *malloc(size_t size);

calloc()

void *calloc(size_t num, size_t size);

실전 코드 예제

예제 1: malloc()으로 15개 정수 저장

#include <stdlib.h>
#include <stdio.h>
int main(void) {
    int *ptr = malloc(15 * sizeof(*ptr));
    if (!ptr) {
        perror("malloc failed");
        return EXIT_FAILURE;
    }
    ptr[5] = 480; // 6번째 요소 (0-기반 인덱스)
    printf("6번째 정수의 값은 %d\n", ptr[5]);
    free(ptr);
    return EXIT_SUCCESS;
}

출력: 6번째 정수의 값은 480

예제 2: calloc()으로 합계 계산

#include <stdlib.h>
#include <stdio.h>
int main(void) {
    int *ptr = calloc(10, sizeof(int));
    if (!ptr) {
        perror("calloc failed");
        return EXIT_FAILURE;
    }
    int sum = 0;
    for (int i = 0; i < 10; ++i) {
        ptr[i] = i; // 초기화는 중복이지만 명확성을 위해 표시
        sum += ptr[i];
    }
    printf("합계 = %d\n", sum);
    free(ptr);
    return EXIT_SUCCESS;
}

출력: 합계 = 45

한눈에 보는 비교

malloc vs calloc: 핵심 차이점과 실전 예제로 완벽 이해

특징malloc()calloc()
매개변수 개수1개 (크기)2개 (개수, 크기)
할당 후 메모리 상태초기화 안 됨 (가비지 값)제로 초기화됨
일반적 용도단일 블록, 수동 초기화깨끗한 시작이 필요한 배열/구조체
성능더 빠름 (제로화 없음)더 느림 (제로화 오버헤드)
안전성가비지 값 사용 위험 높음자동 제로화로 위험 낮음
실패 시 반환값NULLNULL
표준 헤더stdlib.hstdlib.h

핵심 요약

C 언어

  1. C# 식, 문, 블록: 개념과 실전 예제로 완벽 이해
  2. C++ do-while 루프: 문법, 실전 예제, 중첩 루프
  3. C++ 포인터 완전 정복: 개념, 예제, 실전 활용
  4. C++ char 타입 마스터: 선언, ASCII 코드, 문자열 변환 기법
  5. C++ 연산자 오버로딩 실전 가이드: 문법, 접근법, 코드 예제
  6. C++ 함수 완전 정복: 실전 코드 예제로 이해하기
  7. C# 컬렉션(Collections) 마스터하기: 실전 예제로 배우는 유연한 데이터 관리
  8. While vs Do-While 루프: 실전 예제로 명확히 이해하기
  9. C언어 calloc(): 제로 초기화 메모리 할당과 실전 예제
  10. Python str.count() 마스터하기: 문자 및 부분문자열 개수 세기 예제