반응형
# 소스코드
#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라고 하며, 따로 예외처리가 되어있지 않다고 한다.
그리고 이런 식으로 사용하는건 데이터 손실을 유발할 수 있으므로 피해야한다.
반응형
'Dev > C, C++' 카테고리의 다른 글
[ C ] 포인터 변수가 가리키는 문자열 또는 배열의 길이 구하기 (2) | 2021.12.26 |
---|---|
[VSCode / C / C++] VSCode에서 Makefile 사용하기 (0) | 2021.12.17 |
[ C, C++ ] malloc 캐스팅 왜 안 해도 되는지 관련 글 링크 (0) | 2021.10.18 |