-
不用指针时传递的是值,而使用指针时传递的是地址。使用&是传地址的,*是指针找到地址块查看全部
-
CPU用地址总线寻址,有多少地址总线,就有多少种状态,就能寻找和使用多大的内存 32bit CPU: 2^32 bit== 4GB 64bit CPU: 2^64 bit 内存分配 系统内核(48位以上) ------------------------------------------- 栈(暂时存储首先执行的程序状态) ------------------------------------------ 自由可分配内存(可动态分配内存) ----------------------------------------- 堆 ---------------------------------------- 数据段(声明一些全局变量或者声明一些常量) ---------------------------------------- 代码段(程序源代码编译后存放在此)查看全部
-
1.编译命令:gcc -g main.c -o main.out; 2.调试命令:gdb ./main.out; 3.调试器: (gdb)list:列出源代码,可以输入l或回车以继续显示; (gdb)break line-number:在指定行数打断点; (gdb)start:开启单步调试; (gdb)p a:打印a变量在内存中的情况; (gdb)n:执行到下一句; (gdb)bt:查看函数堆栈; (gdb)s:进入函数内部; (gdb)f 1:切换到编号为1的函数中; (gdb)q:退出调试;查看全部
-
变量前加*,为指针 &为取地址符查看全部
-
p;指针指向的变量地址 *p;指针指向的变量值 &p;指针自己所在的地址 既然一个指针保存的是变量的地址,对32位CPU,地址有4个字节,就需要4个内存单元来存储,所以每次++p在内存里都是跳4格。查看全部
-
使用gdb调试步骤: 1、使用带-g选项的gcc命令编译源文件:gcc -g main.c -o main.out 2、使用gdb工具调试:gdb ./main2.out 3、调试过程中:(gdb): l 列出当前项目源代码(list)→再按l或直接按回车:继续执行上一命令 break 12 将断点打在第12行 start 单步调试 p a 显示当前a的值(print)(当前行的命令未完全执行) n 进入下一行(next) s 进入当前函数内部(step) bt 查看函数堆栈(在上方的函数先执行) f 1 切换到1号栈 q 退出调试查看全部
-
1. int quadraate(int a);是一个函数 int (*pquadrate)(int a)=&quadrate;则是指向这个函数的指针! int s=(*pquadrate)(a)可以调用函数! 2.一个指针变量*q 不加*号:P q 取出自己地址中存储的值(一个地址)。 加*号:P *q 取出指向地址中存储的值。查看全部
-
自己的程序和老师完全一样但是输出结果不一样,原因是因为自己的系统和老师的系统不一样,我系统分配的顺序是array[0] array[1] array[2] a b i.如果想结果输出正确只需要改 p=array即可。每个人的系统不一样,输出结果不一样是很正常的,如果输出一些不可控的数据,可是因为你指针指向了为初始化的地址。查看全部
-
void change(int *a,int b) 其中a为指针参数,*+任意参数或者变量均为指针参数或者变量 在调用该函数时需要在参数前+& 即: change(&a,&b);
变量前加*号表示加入指针。 在main函数中引用指针时是变量前加&号
int *a=&b; a是指针,把b的地址赋给a,a指向b
&取地址符
指针变量不赋初值会出错,temp
查看全部 -
gdb 断点调试,单点调试
gcc -g main.out -o -g使用gdb编译
gbd ./main.out 执行
(gdb) l 或list 显示源代码
回车继续执行刚刚的命令
start开始执行
print或p a 打印输出a
n 跳到下一行
s 进入函数
bt 查看函数堆栈
f 1 跳转到函数1
q 退出调试
查看全部 -
写写心得体会。
char *str2 = "world";
定义一个字符指针变量str2,
在gdb中用「p str2」查询到str2所指向的值,在内存中的位置是在低地址位的代码段,
而不是在高地址位的栈里面,结果是这样的:「$1 = 0x400774 "world"」。
str2本身是指针,它本身的所在是在栈里面的,用「p &str2」来查询,得到「$2 = (char **) 0x7fffffffda98」。
所以,如果用输入语句来试图对str2指向的地址赋值的话,是会出现「内存段错误的」!
比如:「scanf("%s",str2);」,这样的语句运行时是会出现内存段错误的。
原因就在于C语言不运行程序在运行中对内存中的代码段进行修改。
再对输入语句进行深入剖析,比如有「int a; scanf("%d",a);」这样的语句,当输入整型数值时,数值被传入内存,保存到了变量a所在的地址,实际上就是变量a本身所代表的含义就是它自身所在的内存地址,所以数值传入给a,实际上是传入给a指向的地址,而a作为一个整型变量,它指向的地址就是它本身所在的地址,它是在内存中的栈里的,所以输入值、传入值,没有问题,不会出现内存段错误。
但是,如果是像上面的把输入的字符串传入给字符指针str2的话,实际要执行的传入过程是把字符串传入到str2指向的地址,而这个地址是在内存的代码段里,这是不允许的,所以就会出现内存段错误!
++++++++++++++
所以,对于指针变量,它在定义或初始化的时候,它的默认指向地址是在内存的「代码段」里的,也就是说,在这种情况下,对指针变量取值的话,得到的值实际上是从内存的「代码段」里取出来的,根据C语言的规定,当然就无法对这个值进行重新赋值了!
所以,要改变指针变量所指向的内存的值,不能直接去对指针变量指向的值进行赋值,而是要改变指针的指向,也就是说,「要把地址赋值给指针变量」,而不是把值赋值给指针变量最初所指向的值。
++++++++++++++
再贴一段助于理解指针的试验代码:
#include <stdio.h> int main() { char a[10]="hello"; char b[10]="world"; char *c="81"; printf("char *c=81, c is %s\n",c); c=&a; printf("c = &a,c is %s\n",c); printf("address of a is %d\n",a); printf("address of value pointed by c is %d\n",&(*c)); printf("address of c itself is %d\n",&c); return 0; }
输出结果如下:
char *c=81, c is 81 c = &a,c is hello address of a is -358473008 address of value pointed by c is -358473008 address of c itself is -358473016
指针c本身也是在栈里面的,对c取地址的话取到的是c本身的地址,而要想取到c所指向的值的地址的话,要先对c取值,再对值取地址:&(*c)。
查看全部 -
使用调试功能 gcc -g
gdb ./ //开始进行gdb调试
list //列出程序
start //单步开始
p //打印变量值
n //继续执行
s //step 跳入函数
bt //查看函数堆
f //切换函数堆
查看全部 -
gdb 终端调试工具
gcc -g main.c -o main.out 生成可调式的执行文件
注意,此时源代码.c文件仍不可删除。否则仍然不支持调试。
调制过程:
1、 gdb main2.c 进入调试模式;
2、调试模式 输入 “list” 或者 “l” 列出当前项目的软件源代码;
3、“start” 开始调试,默认断点在main函数的第一行代码;
4、"p" 表示print , 输出变量值;
5、“n" 表示执行一行代码挑到下一行;
6、 “s” 表示按步骤执行代码, 可进入调用函数内部;
7、“bt” 表示显示函数堆栈, 可显示有哪些函数在运行;此时使用"p"打印的是当前函数中的变量值, 即标号为#0的函数;
8、"f" 切换当前跟踪的堆栈内函数; eg: f 1(1 为“bt”中的函数编号);
9、“q”跳出调试模式;
查看全部 -
P[4]不是p往下面移动了4个位置,而是从p开始的地址往后移动4个位置取值,p指向的地址还是不变的查看全部
-
gdb: x/6cb,c:字符形式 :b byte为单位 堆和栈内存里才可以写入(预留空间才可写入)查看全部
举报