标签:
这里主要是以 C 语言为例,其他语言开发的程序,每个进程都会有一个类似的空间。下面是一段 C 代码:
#include <stdlib.h> #include <stdio.h> double t[0x02000000]; void segments() { static int s = 42; void *p = malloc(2); printf("stack\t%010p\nbrk\t%010p\nheap\t%010p\n" "static\t%010p\nstatic\t%010p\ntext\t%010p\n", &p, sbrk(0),p,t,&s,segments); } void writeFreeSpace() { char *p = sbrk(0) - 1; *p = 1; printf("assign to sbrk(0)-1 is succed! \n"); p = sbrk(0) + 1; *p = 1; printf("assign to sbrk(0)+1 is succed! \n"); } int main(int argc, char *argv[]) { segments(); writeFreeSpace(); exit(0); }
这里主要打印了:指针 p 的地址(stack),进程当前的 break 的位置( heap 的边界),指针 p 指向的地址(heap),全局变量 t 的地址,局部 static 变量的地址,还有函数 segments() 的地址。
使用 gcc 便以后,这段代码的运行结果如下:
stack 0xbfaa9edc brk 0x18856000 heap 0x18835008 static 0x0804a060 static 0x0804a024 text 0x08048494 Size of heap: 20ff8 assign to sbrk(0)-1 is succed! Segmentation fault
这很好的证明了下图中的分布关系:
其中,可能不常见的是 sbrk() 函数。一般情况下,应用编程的时候不推荐使用 sbrk(),所以我们见得少。通过 man 得知,sbrk( int ) 是用来增加 Heap 的大小的,当给它喂参数 0 ,它返回 Heap 的边界( sbrk(0) 返回的地址已经在 heap() 之外了,可以改动 writeFreeSpace() 中的地址尝试;从上面可以看出,这里 heap 的最小值默认是 132k Bytes(20ff8+8=21000),前面8 个 byte 是保留的,具体作用需要再作了解)。
标签:
原文地址:http://www.cnblogs.com/pied/p/4613463.html