2017-01-30 7 views
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); 
} 
+0

정의되지 않은 동작으로 인해 충돌 또는 세그먼트 오류가 발생하지 않아도됩니다. 프로그램이 _any_ 문제없이 예상대로 작동 할 수도 있습니다. 그러나 매번 이것에 의지하지 마십시오. 한 번, 당신의 프로그램은 제대로 작동 할 수 있지만 다음에, 그렇지 않을 수도 있습니다! UB를 어떤 대가를 치르더라도 피하십시오! –

+1

"명백하게 작동하는 지느러미"는 "undefined hebaviour"의 일부입니다. –

답변

6

strcpy은 버퍼가 너무 짧음을 인식하지 못합니다. 그것은 방금 1을 경계로 4 바이트를 썼습니다.

수 있다는 점에서 충돌 (당신이 페이지 경계에 충돌하는 경우, 예를 들어 실행 해 그 전기 울타리 리눅스에 (-lefence 링크 옵션)을 사용하여), 또는 다른 부분에 불쾌한 부작용을 귀하의 프로그램.

그래서 printf이 제대로 작동하지만 허락되지 않은 곳에서 글을 쓸 수도 있습니다.