我正在尝试实现我自己的malloc,并尝试了解内存是如何工作的。
我写了这个,但我不明白我为什么会遇到分段错误:
#include <unistd.h>
#include <stdio.h>
int main()
{
int i;
char *mem;
void *maxSize;
i = 0;
maxSize = sbrk(0);
printf("%p\n", maxSize);
mem = maxSize - 500;
printf("%p\n", mem);
while (i != 100)
{
mem[i] = 1;
i++;
printf("%p\n", &mem[i]);
}
}
当我用valgrind测试这段代码时,一切正常,我没有任何错误。 但是当我运行这段代码时,我会在第一个循环中发生段错误。
知道为什么吗?你知道我怎么能在我的过程中得到第一个免费地址?
答案 0 :(得分:4)
“统一数据段”的大小是多少?我猜它很小,所以你将在数据段开始之前写。你可以尝试先把它作为支票来增加它:
...
sbrk(1000);
^^^^^^^^^^^
i = 0;
maxSize = sbrk(0);
...
答案 1 :(得分:0)
sbrk
返回指向未正版化数据段之后的内存块开头的指针。由于您将指针减少到500字节,因此很可能会破坏while循环中未实现的数据段。