-
int (*pquadrate)(int a)=&quadrate;
int s=quadrate(a);
c语言不允许直接操作代码段
代码在代码段
数据在数据段
程序编译运行的状态在栈
变量:在数据段内存中某个地址处存放某个类型的数值
指针:在数据段内存中某个地址处存放某个地址&a,该地址处存放某个变量
查看全部 -
32位4G
2的32次方=1K*1K*1K*4
4G个字节
64位
查看全部 -
a地址
*a a指向的地址处的值
查看全部 -
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 退出调试
查看全部 -
函数把实参的值赋给形参,形参是个新变量,改变形参,改变不了实参
int *a=&b; a是指针,把b的地址赋给a,a指向b
int *a int* a int * a
&取地址符
指针变量不赋初值会出错,temp
查看全部 -
栈越往后调用的函数,所占的内存越小,从上往下调用,而数据段和代码段则是从下往上占用内存。全局变量,常量,静态变量都是存在内存的数据段中。
查看全部 -
计算机是由逻辑电路元件来组成的
计算用二进制
显示为十进制
编程用十六进制
查看全部 -
内存分配查看全部
-
系统内存分配查看全部
-
写写心得体会。
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)。
查看全部 -
数组与指针的不同在于数组是地址常量,而指针是地址变量
查看全部 -
gdb命令:x(打印内存值)/3(输出3个值)d(十进制显示) 0xffffff(开始地址)
查看全部 -
1. int quadraate(int a);是一个函数 int (*pquadrate)(int a)=&quadrate;将指针pquadtate指向函数quadrate! int s=(*pquadrate)(a)可以调用quadtate函数,这种操作常用于回调函数
查看全部 -
计算机内部
查看全部 -
使用调试功能 gcc -g
gdb ./ //开始进行gdb调试
list //列出程序
start //单步开始
p //打印变量值
n //继续执行
s //step 跳入函数
bt //查看函数堆
f //切换函数堆
查看全部
举报