0
다음은 제 코드입니다. malloc()에 의해 3 바이트의 예약 메모리가있는 위치에 4 바이트 복사. 여기 메모리가 충분하지 않기 때문에 내 지식에 따라 문자열이 null로 끝나지 않습니다. 즉 ABC는 힙 영역에서 3 바이트입니다. 여기에 null이 없으므로 printf는 q.ptr을 출력하지 말아야하지만 "ABC"
이라는 결과를 출력합니다. 어떻게 이런 일이 가능할까요 ??Printf()는 null로 끝나지 않는 문자열로 정의되지 않은 동작을 표시하지 않습니다.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct p
{
char *ptr;
};
void main()
{
struct p p,q;
p.ptr="ABC";
q.ptr=(char *)malloc(3*sizeof(char));
strcpy(q.ptr,p.ptr);
printf("%s\n",q.ptr);
}
정의되지 않은 동작으로 인해 충돌 또는 세그먼트 오류가 발생하지 않아도됩니다. 프로그램이 _any_ 문제없이 예상대로 작동 할 수도 있습니다. 그러나 매번 이것에 의지하지 마십시오. 한 번, 당신의 프로그램은 제대로 작동 할 수 있지만 다음에, 그렇지 않을 수도 있습니다! UB를 어떤 대가를 치르더라도 피하십시오! –
"명백하게 작동하는 지느러미"는 "undefined hebaviour"의 일부입니다. –