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바이트 이상의 문자열을 입력하니 에러가 아니라 다음과 같이 출력이 되었다.
# 실행 결과
각각 변수가 할당한 크기를 넘어서 NULL이 나올때까지 입력된 모든 문자열을 출력하는데,
이렇게 할당 범위를 넘어서는 크기의 문자열이 저장되는 이유는
malloc 함수는 파라미터로 담은 수만큼 딱 맞춰 메모리를 할당하지 않고 "block" 단위로 메모리를 할당한다.
위 결과에서도 먼저 입력한 p와 pp는 16바이트씩 짤려서 (NULL문자가 같이 잘려나갔으므로) 문자열이 이어지는 것을 볼 수 있다.
이렇게 할당한 메모리 범위를 넘어서게 입력하는 것을 undefined behavior라고 하며, 따로 예외처리가 되어있지 않다고 한다.
그리고 이런 식으로 사용하는건 데이터 손실을 유발할 수 있으므로 피해야한다.
반응형