函数栈以及数据内存段

来源:互联网 发布:dw软件怎么使用 编辑:程序博客网 时间:2024/06/04 19:32

这里写图片描述

内存地址自下而上由低到高,数据和代码都从低地址存放,而函数压栈是从高地址压栈,后进来的地址低,先出

(gdb) list13#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{1617  static int count=0;18  count++;19  global++;20  int s=rect(a,a);21  return s;22}(gdb) 232425int main()2627{2829    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 3637    int s=quadrate(a);38    printf("%d\n",s);3940}4142(gdb) startTemporary 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:2727{(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:1818  count++;(gdb) bt //查看栈#0  quadrate (a=3) at main.c:18#1  0x00005555555547dc in main () at main.c:37(gdb) n19  global++;(gdb) 20  int s=rect(a,a);(gdb) p &s$1 = (int *) 0x7fffffffddfc(gdb) s rect (a=3, b=3) at main.c:77    count++;(gdb) n8    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:2020  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:2020  int s=rect(a,a);(gdb) p &global$6 = (int *) 0x555555755014 <global>(gdb) 
阅读全文
0 0
原创粉丝点击