本章实验代码是访问数据区、代码区、栈区和堆区的地址以及输出其(unsigned long )类型的地址。代码区即程序编译后执行代码的部分。 其中char big_array[1L<<24]、char huge_array[1L<<30]是全局变量,属于数据区内容;p1、p2、p3、p4四个指针存在于栈中,但是它们的内容都在数据区;而exit、malloc属于堆区。
#include <stdlib.h> #include <stdio.h> #include <unistd.h> static void show_pointer(void *p, char *descr) { // printf("Pointer for %s at %p\n", descr, p); printf("%s\t%p\t%lu\n", descr, p, (unsigned long) p); } char big_array[1L<<24]; /* 16 MB */ //char huge_array[1L<<31]; /* 2 GB */ char huge_array[1L<<30];/* 1 GB */ int global = 0; int useless() { return 0; } int main () { void *p1, *p2, *p3, *p4; int local = 0; p1 = malloc(1L << 28); p2 = malloc(1L << 8); //p3 = malloc(1L << 32); p3 = malloc(1L << 16); p4 = malloc(1L << 8); show_pointer((void *) big_array, "big array"); show_pointer((void *) huge_array, "huge array"); show_pointer((void *) &local, "local"); show_pointer((void *) &global, "global"); show_pointer((void *) p1, "p1"); show_pointer((void *) p2, "p2"); show_pointer((void *) p3, "p3"); show_pointer((void *) p4, "p4"); show_pointer((void *) useless, "useless"); show_pointer((void *) exit, "exit"); show_pointer((void *) malloc, "malloc"); return 0; }以下是结果部分:
big array 0x55aed5d0e040 94209399906368 huge array 0x55ae95d0e040 94208326164544 local 0x7ffe50720304 140730248069892 global 0x55ae95d0e024 94208326164516 p1 0x7f8575c0f010 140211182956560 p2 0x55aed7df7260 94209434415712 p3 0x55aed7df7370 94209434415984 p4 0x55aed7e07380 94209434481536 useless 0x55ae95b0d74d 94208324065101 exit 0x7f8585c53120 140211451670816 malloc 0x7f8585ca7070 140211452014704根据结果其实可以看出,local部分在机器中应该是存在于堆里的,而global在栈中。