为什么我会在sbrk之后点击无效内存?

1 c memory sbrk

我正在尝试使用sbrk系统调用来请求一个内存页面并将该页面分成小块,但我的代码总是会遇到一些无效的内存:

void sbrkBlocks() {
    int *b = sbrk(0);
    if(sbrk(sysconf(_SC_PAGESIZE)) == (void *)-1) {
        printf("sbrk failed\n");
        return NULL;
    }
    void *bound =b + sysconf(_SC_PAGESIZE);
    while (b + 16 <=bound) {
       *b = 1;
        b+= 16;
    }
}
Run Code Online (Sandbox Code Playgroud)

就像我得到sbrk(0)的那样0x804d000,绑定之后sbrk(one_page_size)会是0x8055000,但是代码将会出现分段错误0x804e000.

bna*_*ker 5

你的指针运算不正确.sysconf(_SC_PAGESIZE)返回页面的大小(以字节单位).添加b指针到int的指针会增加sizeof(int) * _SC_PAGESIZE它.

运行这个:

int *b = sbrk(0);
printf("b = %p\n", b);
printf("PAGESIZE = %d\n", sysconf(_SC_PAGESIZE));
void *bound = b + sysconf(_SC_PAGESIZE);
printf("bound = %p\n", bound);
printf("bound - b = %d\n", (char *) bound - (char *) b);
Run Code Online (Sandbox Code Playgroud)

你应该得到类似的东西:

b = 0x10c37d000
PAGESIZE = 4096
bound = 0x10c37e000
bound - b = 16384
Run Code Online (Sandbox Code Playgroud)

你只是写过你实际分配的边界的末尾.

  • 别客气.您应该将答案标记为已接受. (2认同)