堆内存:是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时动态地申请某个大小的内存空间。
栈内存:每一块保留一块堆内存地址,存取速度比堆快,仅次于寄存器,栈数据可以共享,但缺乏灵活性。
内存地址
指针变量的实质:是一个概念也是一个变量,整形指针、字符指针、浮点指针是指针的具体浮现,常量由编译器决定。
指针不是地址,是地址加偏移量。
int* a;这里的a就是代表指针变量(int*),而不是一个整型变量(int)所以a存放的是地址,*a才是地址中存放的值(这里的*与第一行的*不同,这个*是取地址的意思)
用于调试的编译问件:gcc -g 文件名.c -o 文件名.out
调试文件:gdb 文件名.out进入调试状态,
列出当前项目软件源代码:l/list,若显示不完整,直接回车键即可继续显示
设置断点:break 行数
单步调试:start
查看变量的值: p/print 变量名
进行下一步:n
进入某一步中查看,在进行到该步时,:s/step
查看函数堆栈:bt
查看函数堆栈是,查看某一堆栈:f 堆栈行
回车:重复执行上个步骤
* 取内容符
只传递地址
谈一些自己的理解,不一定对。
其实这里用 int* a 比用 int *a 好。
int* a 的意思表明这里声明的变量是 a,且变量类型是指针变量,而指针变量不同于普通变量,它可以存放内存地址。所以此处 a 中存放的是地址 &a (&是取址算符,&a 就是变量 a 在内存中的地址)。
而用 int *a 的话,第一感觉像是声明了一个整型变量,变量名为 *a,这个变量的性质跟普通的变量,比如 int b 中的 b,没什么区别,而实际并不是这样的。
a地址
*a a指向的地址处的值
f 1
f 2
切换函数栈
用于调试的编译问件:gcc -g 文件名.c -o 文件名.out
调试文件:gdb 文件名.out
进入调试状态,列出当前项目软件源代码:l/list,若显示不完整,直接回车键即可继续显示
设置断点:break 行数
单步调试:start
查看变量的值: p/print 变量名
进行下一步:n
按N之后,回车即可进行下一步
进入某一步中查看,在进行到该步时,:s/step
插看函数堆栈:bt
查看函数堆栈是,查看某一堆栈:f 堆栈行