如果没有无效的写入,我怎么能Segfault?

时间:2016-01-29 09:22:59

标签: c memory

我正在尝试实现我自己的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测试这段代码时,一切正常,我没有任何错误。 但是当我运行这段代码时,我会在第一个循环中发生段错误。

知道为什么吗?你知道我怎么能在我的过程中得到第一个免费地址?

2 个答案:

答案 0 :(得分:4)

“统一数据段”的大小是多少?我猜它很小,所以你将在数据段开始之前写。你可以尝试先把它作为支票来增加它:

 ...
 sbrk(1000);
 ^^^^^^^^^^^
 i = 0;
 maxSize = sbrk(0);
 ...

答案 1 :(得分:0)

sbrk返回指向未正版化数据段之后的内存块开头的指针。由于您将指针减少到500字节,因此很可能会破坏while循环中未实现的数据段。