1.首先我们针对堆和栈中的分析进行gdb调试。
int b; //栈
char s[] = "abc"; //栈 ,在常量区也会有一份,在知道这里的时候会从常量区拷贝一份出来,填充到栈上。
char *p2; //栈
char *p3 = "123456"; //123456\0在常量区,p3在栈上。
static int c =0; //全局(静态)初始化区
p1 = (char *)malloc(10); //堆
p2 = (char *)malloc(20); //堆
(gdb) p &b
$18 = (int *) 0x7fb95db0
(gdb) p &s
$17 = (char (*)[4]) 0x7fb95db4
(gdb) p &p2
$20 = (char **) 0x7fb95dac
(gdb) p &p3
$19 = (char **) 0x7fb95da8
(gdb) p &c
$27 = (int *) 0x410a54
执行到p2 = (char *)malloc(20)的时候,内存堆栈分布情况为:
在调用函数中执行
--参数n
....
参数2
参数1
返回地址
--
在被调用函数中执行
临时变量
c --
b -- 这是一个从静态变量区拷贝过来的数组,放在栈中。
s = a --
b
p2
p3
在mipsel上面反汇编看看,多么整齐的4字节指令啊
(gdb) disassemble main
Dump of assembler code for function main:
0x004006c0 : lui gp,0x2
0x004006c4 : addiu gp,gp,-31936
0x004006c8 : addu gp,gp,t9
0x004006cc : addiu sp,sp,-56
0x004006d0 : sw ra,52(sp)
0x004006d4 : sw s8,48(sp)
0x004006d8 : move s8,sp
0x004006dc : sw gp,16(sp)
0x004006e0 : lw v1,-32740(gp)
0x004006e4 : addu zero,zero,v0
0x004006e8 : lw a0,2472(v1)
0x004006ec : addiu v0,v1,2472
0x004006f0 : lw v0,4(v0)
0x004006f4 : sw a0,36(s8)
0x004006f8 : sw v0,40(s8)
0x004006fc : addiu v0,v1,2472
阅读(1011) | 评论(0) | 转发(0) |