다음은 정의되지 않은 동작을 이해하는 프로그램입니다. 10 * 4 = 40 바이트의 메모리로 ptr을 할당하려고하는데 액세스하려고하므로 40 바이트를 초과하면 * (ptr + 0x100) 일 때 seg 오류가 발생합니다. 코드에서 관찰되는 것은 * (ptr + 0xc000)에 seg fault를 준다. 그것이 힙의 크기를 초과 할 때 seg fault를 주는가? ptr이 할당 된 40 바이트의 경계를 벗어난 ptr + 100에 액세스하려고 시도 할 때 seg fault가 발생하지 않는 이유는 무엇입니까?힙 영역을 넘어서 액세스하려고하는 포인터
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main()
{
int * ptr = malloc(10 * sizeof(int));
*ptr = 0x100;
printf(" Done 1\n");
*(ptr+0x9) = 0x90;
printf(" Done 2\n");
*(ptr+0x100) = 0x400;
printf(" Done 3\n");
*(ptr + 0x1000) = 0x4000;
printf(" Done 4\n");
*(ptr + 0x4000) = 0x4000;
printf(" Done 5\n");
*(ptr + 0x8000) = 0x8000;
printf(" Done 6\n");
*(ptr + 0xc000) = 0xc000;
printf(" Done 7\n");
}
* "정의되지 않은 동작과 손상을 이해하려고 시도합니다."* 그런 다음 ""그러면 다음과 같은 오류가 발생합니다. "*. "정의되지 않은"이란 의미가 무엇인지 이해하지 못했습니다. 여기에는 거의 이해할 수 없습니다. UB를 호출합니다. 즉, 프로그램이 정의되지 않은 상태로 남아있게됩니다. 물론 이것을 테스트하여 특정 컴파일러가하는 것을 확인할 수는 있지만 그게 전부입니다. 게다가, 귀하의 게시물에 하나의 물음표가 없습니다. 여기에는 의문의 여지가 없습니다. 그러나 수천 개의 질문이 이것에 이미 정신이 일치합니다. –
'int * ptr'을 얻기 전에 이미 오류가 발생했습니다 ... –
다른 것들은 제쳐두고 (많은 사람들이 이미 정의되지 않은 것을 말했습니다) - 당신이 아닌 메모리 페이지에 액세스 할 때 segfault를 얻게됩니다. 페이지가 malloc에 할당 된 것이 아닙니다. 비록 mmap()되어 있어도 (다른 곳에서 할당 될 수 있음을 보장하지는 않지만) 각 페이지는 요청한 40b가 아닌 4kb입니다. – keltar