#include <stdlib.h>
#include <stdio.h>
#include <unistd.h> /*Unix Standard 用于系统调试*/
/* P是一个指针变量的名字表示指针变量指向的内存地址,*p是所指对象的内容,&p指针p的地址*/
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);
/* %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); /* 256MB */
p2 = malloc(1L << 8);
//p3 = malloc(1L << 32); /* 4GB */
p3 = malloc(1L << 16); /* 64KB */
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;
}
/*
第二个数据是该指针所指数据地址的十六进制表示
第三个数据是该指针的无符号长整型表示
(因运行的机器不同结果也不一样)
gec@ubuntu:/mnt/hgfs/share/csapp_code$ gcc locate.c
gec@ubuntu:/mnt/hgfs/share/csapp_code$ ./a.out
big array 0x4804a060 1208262752
huge array 0x804a060 134520928
local 0xbfcc9fdc 3217858524
global 0x804a044 134520900
p1 0xa7545008 2807320584
p2 0x49a67008 1235644424
p3 0x49a67110 1235644688
p4 0x49a77118 1235710232
useless 0x80484b6 134513846
exit 0x8048370 134513520
malloc 0x8048350 134513488
*/
Pointer Locate
最新推荐文章于 2019-12-08 14:23:58 发布