今天一边学习C语言的指针和数组名关系,了解到了程序中的内存分配区域,随后写了这段代码,看一下申请内存的地址。顺便发现指针的运算还有这些方法(不再 是课本中的指针之间运算无意义)。也可以利用把指针归零,再指向一定的偏移量,这样你就可以查看进程的内存空间了。 这段代码还没有办法查看栈的地址。看以后有什么办法做到。
//=======================================
/*
* author: Vangelee
* http://hi.baidu.com/romeroad/blog/item/d1cd418d6ebfc819b21bbac7.html
*
*
-------------------
| 程序栈 |----------高地址--〉低地址(向下增长)
-------------------
| 堆 |----------向上增长
-------------------
| BSS |----------数据段
| 全局和静态变量 |
-----------------------------低地址
| 可执行代码 |----------代码段
-------------------
*/
#include <stdio.h>
static int sint = 1;
int gint = 2;
int gint2 = 4;
void printAddr(void *add) {
printf("%x /n" , add);
}
void fun1(void) {
printf("fun1 is ");
printAddr(&fun1);
}
void fun2(void) { }
main() {
void (*fun)(void);
char * buf1,*buf2;
char *gp = NULL;
printAddr(&sint);
printAddr(&gint);
printAddr(&gint2);
printf("=========function address ==========/n");
printAddr(fun);
fun = &fun1;
printAddr(fun);
fun = &fun2;
printAddr(fun);
printf("=========Heap address ==========/n");
buf1 = (char *) malloc(16);
buf2 = (char *) malloc(16);
printAddr(buf1);
printAddr(buf2);
free(buf1);
free(buf2);
printf("=========invoke function ==========/n");
printf("main is ");
printAddr(&main);
fun1();
printf("=========move pointer ==========/n");
gp = NULL; //利用这个把指针归零
gp += (int)&sint; //看到指针跟指针的运算了吧,呵呵 其实是地址的运算 。
//所以指针之间的运算还是有价值的!
printf("%d /n",sint);
printf("%d /n",*gp);
printAddr(gp);
printAddr(&sint);
}
//====================================