内存地址自下而上由低到高,数据和代码都从低地址存放,而函数压栈是从高地址压栈,后进来的地址低,先出
(gdb) list
13#include<stdio.h>
int global=0;
int rect (int a,int b)
{
static int count=0;
count++;
global++;
int s=a*b;
return s;
}
14int quadrate(int a)
15{
16
17 static int count=0;
18 count++;
19 global++;
20 int s=rect(a,a);
21 return s;
22}
(gdb)
23
24
25int main()
26
27{
28
29 int a=3;
30 int b=4;
31 int *pa=&a;
32 int *pb=&b;
(gdb)
33 int *pglobal=&global;
34 int (*pquadrate)(int a)=&quadrate;
35
36
37 int s=quadrate(a);
38 printf("%d\n",s);
39
40}
41
42
(gdb) start
Temporary breakpoint 1 at 0x78f: file main.c, line 27.
Starting program: /home/yd/workplace/pointer/les2/a.out
Temporary breakpoint 1, main () at main.c:27
27{
(gdb) n //单条执行语句
29 int a=3;
(gdb)
30 int b=4;
(gdb)
31 int *pa=&a;
(gdb)
32 int *pb=&b;
(gdb)
33 int *pglobal=&global;
(gdb)
34 int (*pquadrate)(int a)=&quadrate;
(gdb)
37 int s=quadrate(a);
(gdb) s//单条执行语句,若遇到函数则进入函数内部
quadrate (a=3) at main.c:18
18 count++;
(gdb) bt //查看栈
#0 quadrate (a=3) at main.c:18
#1 0x00005555555547dc in main () at main.c:37
(gdb) n
19 global++;
(gdb)
20 int s=rect(a,a);
(gdb) p &s
$1 = (int *) 0x7fffffffddfc
(gdb) s
rect (a=3, b=3) at main.c:7
7 count++;
(gdb) n
8 global++;
(gdb)
9 int s=a*b;
(gdb) bt
#0 rect (a=3, b=3) at main.c:9
#1 0x000055555555477f in quadrate (a=3) at main.c:20
#2 0x00005555555547dc in main () at main.c:37
(gdb) p &s
$2 = (int *) 0x7fffffffddd4
(gdb) p &count
$3 = (int *) 0x555555755018 <count>
(gdb) f 1
#1 0x000055555555477f in quadrate (a=3) at main.c:20
20 int s=rect(a,a);
(gdb) p &count
$4 = (int *) 0x55555575501c <count>
(gdb) p &global
$5 = (int *) 0x555555755014 <global>
(gdb) f 1
#1 0x000055555555477f in quadrate (a=3) at main.c:20
20 int s=rect(a,a);
(gdb) p &global
$6 = (int *) 0x555555755014 <global>
(gdb)