前不久在幕客网上面学习Linux C语言的基础,老师使用的是vim编辑器,所用的调试工具为gdb,而我发现我的Mac上面却找不到它,后来百度了一下,原来Mac中现在使用的是gdb的升级版lldb
废话不多说,直接上干货!代码如下:
#include<stdio.h>
int main(){
int a=4;
int b=6;
int array[3];
array[0]=1;
array[1]=10;
array[2]=100;
int *p;
p=&a;
int i=0;
while(i<6){
printf("*p=%d\n",*p);
p++;
i++;
}
return 0;
}
由于代码之前已经写好,即main.c文件,所以直接输入lldb ./main进行调试
1.设置断点,并开始调试
2.进行单步调试,输入next,或缩写n,我这里一直按n,直到进入while循环
3.查看内存里面的值,利用print 变量(或缩写为p) 如:p a
由于代码中有:p = &a;于是指针p的值为:0x00007fff5fbffb74,与变量a的地址一样;
其实变量的本质就是内存,而指针的本质就是地址。 这个命令:p &p,其实就是显示指针p的地址,即指针p的值存放的内存地址,&p也就是二级指针。
4.批量显示内存的值,使用x命令:
此处查看的是变量i的地址,由于之前已经探索过,直接写出来了,一直进行单步调试,进入第二次循环
此时,i的值变从0变为1
C语言在内存中分为代码段,数据段,堆,栈,代码中的所有局部变量都会存放在栈中,即在内存的高地址处,我们显示从0x00007fff5fbffb64地址开始的一连串地址的值,就会发现这些值基本上是存放在一起的:
其中9表示显示9个地址值,d表示以十进制显示值,w表示4个字节为一个单位,下面显示了所有变量的值,包括a,b,i,array[0],array[1],array[2],当然程序中循环输出的六个值并不完全包括上面的这6个变量,我们可以看到,它们在内存中的位置并不是按照声明的顺序连续的,有编译器处理过的原因
0x7fff5fbffb64: 0 (i)
0x7fff5fbffb68: 1606417268
0x7fff5fbffb6c: 32767
0x7fff5fbffb70: 6 (b)
0x7fff5fbffb74: 4 (a)
0x7fff5fbffb78: 0 0x7fff5fbffb7c: 1 (array[0]) 0x7fff5fbffb80: 10 (array[1]) 0x7fff5fbffb84: 100 (array[2])