Dev/C, C++

[ C ] char 포인터가 malloc으로 할당된 메모리보다 더 많은 데이터를 저장하는 이유

surimi🍥 2021. 10. 18. 18:45
반응형

# 소스코드

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    char *p, *pp, *ppp;

    p = (char *)malloc(3);
    pp = (char *)malloc(3);
    ppp = (char *)malloc(3);

    printf("in p : ");
    scanf("%s", p);

    printf("\nin pp : ");
    scanf("%s", pp);

    printf("\nin ppp : ");
    scanf("%s", ppp);

    printf("\np : %s", p);
    printf("\npp : %s", pp);
    printf("\nppp : %s", ppp);
    return 0;
}

 

char 포인터 변수 p, pp, ppp에 malloc으로 각각 3씩 메모리를 할당해주었다.

원래라면 할당한 메모리 크기를 넘는 문자열을 삽입하면 안되지만

실험삼아 20바이트 이상의 문자열을 입력하니 에러가 아니라 다음과 같이 출력이 되었다.

 

# 실행 결과

맨 아랫줄 pp -> ppp

각각 변수가 할당한 크기를 넘어서 NULL이 나올때까지 입력된 모든 문자열을 출력하는데,

 

이렇게 할당 범위를 넘어서는 크기의 문자열이 저장되는 이유는

 

malloc 함수는 파라미터로 담은 수만큼 딱 맞춰 메모리를 할당하지 않고 "block" 단위로 메모리를 할당한다.

 

위 결과에서도 먼저 입력한 p와 pp는 16바이트씩 짤려서 (NULL문자가 같이 잘려나갔으므로) 문자열이 이어지는 것을 볼 수 있다.

 

이렇게 할당한 메모리 범위를 넘어서게 입력하는 것을 undefined behavior라고 하며, 따로 예외처리가 되어있지 않다고 한다.

 

그리고 이런 식으로 사용하는건 데이터 손실을 유발할 수 있으므로 피해야한다.

 

ref_link1

ref_link2

반응형