linux c语言 指针修改 某个结构的值,Linux C语言指针与内存

1.GCC会对内存变量分配进行优化:同一种变量类型会放到一块儿!

2.静态变量、常量、全局变量存于内存的数据段(数据段位置高于代码段)。

3.64位计算机中:地址都是用64bit表示的,所以指针(存储地址)占64bit,即8字节。

注意图中:&pa -> &pb的确是增加了8个字节(16进制中满16进1);

同理:从de18 -> de20也是增加了8个字节。

4.栈区域(最接近系统控制的内存空间)保存的是函数的运行状态:函数执行到哪一个命令?每一个变量保存的什么值?等等

5.在代码段和数据段(区),内存是从低地址向高地址转移的,即:先声明的函数地址小,后声明的函数地址大;而在栈中,刚好相反。

查看全部

1.编译命令:gcc -g main.c -o main.out;

2.调试命令:gdb ./main.out;

3.调试器:(gdb)list:列出源代码;(gdb)break line-number:在指定行数打断点;(gdb)start:开启单步调试;

(gdb)p a:打印a变量在内存中的情况;(gdb)n:执行到下一句;(gdb)s:进入函数内部;(gdb)bt:查看函数堆栈;

(gdb)f 1:切换到编号为1的函数中;(gdb)q:退出调试;

查看全部

5

采集

收起

2015-06-29

变量名只是代号

变量的本质是内存

在标准的C语言中,不允许直接对内存地址进行操作,只能是对操作系统已经分配给的内存空间进行操作。(防止用户自己操作内存地址时侵吞系统内存或者其他程序的内存)

p 指针指向的变量地址

*p 指针指向的变量值

&p 指针自己所在的地址

既然一个指针保存的是变量的地址,对32位CPU,地址有4个字节,就需要4个内存单元来存储,所以每次++p在内存里都是跳4格。

函数调用信息保存在栈(stack)中。

int *pa=&a指将a的地址传给pa。因此p pa看到的是a的地址(&a)。

而p &pa才能看到pa本身的地址。

查看全部

5

采集

收起

2018-03-22

20161011 C语言指针和内存4-1 数据表示方法

内存:一个字节8个2进制

32位操作系统(32个地址总线,2的32次幂 2的30次方1024的3次方,就是1G)做多使用4G内存

64位操作系统(2的30次方 =G,2的40次方=T)0xffffffffffffffff - 0x0

内存的管理由操作系统管理,给内存编号,给内存进行规划

1)0x7fffffffffffffff - 0x0为用户使用的内存。

2)其他~0xffffffffffffffff为操作系统内核使用)

例子

p pa

0xffffffffffffddfc//pa里保存的内容(内容的内存地址)

p &pa

0xffffffffffffde08// 指针 pa的内存地址

指针8个字节 本质上保存的是内存的地址:

变量:a=第五个柜子第二个抽屉

指针 b:第一个柜子第一个抽屉 内容 :第五个柜子第二个抽屉)

系统内核

(高地址段 先进后出 记录程序已经执行的信息,P &a ,"& '取地址'运算符 " &a表示显示变量a的内存地址空间,)

自由可分配内存

堆()

数据段(全局变量,常量,静态变量)

代码段(低地址段 编译后的程序的机器码保存位置)

C语言不允许直接操作代码段

为static变量也就是静态变量,在程序运行过程中被声明后就会一直保存在内存里,所以只能声明一次,第二次再访问那个函数时,给静态变量声明同时赋值的语句就不再执行了,而静态变量的值始终保存在内存里,也就是上次改变以后的值。

没有static修饰的函数中的变量,只在函数被执行时占用内存,函数执行完毕后就被销毁,数据也就不存在了,所以每次都要声明,值也就不会变。

查看全部

静态变量 static关键字。函数调用结束后,静态变量的值不消失。对一个C文件里的全局变量和函数加入static的申明 可以防止被其他C文件误调用,即限定作用域只是当前文件,其他文件中即使有同名变量和函数也不影响。

查看全部

若“p”是一个地址,则“*p”是到这个地址去取里面的值,“(*p)”把表示为一个整体,“(*p)(数据)”若p为代码段,则调用这个函数,传参数"数据"进去。

若地址指向的是栈和堆,操作系统会把栈或者堆的具体数据取出来,若地址指向的不是一个栈或者堆,而是代码段的话,操作系统会认为是指向某一个函数

查看全部

C语言在内存中数据的存储位置

char a[] = “linux”

占6个字节,a存储的是首地址,“linux”可以在栈,也可以在堆中

char *p = “linux”

占10个字节,p指针变量占4字节,里面保存的是后面字符串的地址,“linux”占6个字节,存储在代码段。

但字符串要更加灵活:

linux栈中:

char a[] = “linux”

char *p = a;

在代码段:

char *p = “linux”

在数据段:

全局的char a[] = “linux”

void main()

{

char *p = a;

}

在堆中:

就使用malloc

查看全部

gdb 是gcc自带的一种调试工具

gdb -help查看gdb用法

gcc -g +源代码文件 的文件才可以调试

调试的文件 必需要能找到源文件

gdb +文件名 表示调试该文件

l(list)可以列出当前调试文件的源代码

按回车表示继续执行刚才的命令

break 12 打断点在12行

start 查看默认断点

p +变量名 可以查看该变量当前的值

n表示执行当前行数 然后跳到下一行(并没有执行)

s进入函数里面

bt 查看函数堆栈()

f +函数编号 表示切换函数栈

q 表示退出调试

查看全部

5

采集

收起

2017-12-07

int (*pquadrate)(int a) = &quadrate;是啥意思?

这是将pquadrate声明为函数指针,它指向的是有一个int型参数,返回值为int的函数。这语句同时将pquadrate初始化为quadrate的地址(显然quadrate应该是个函数名)。

一步一步讲这个声明:

这语句声明的是pquadrate变量,前面有个*,而且是用小括号和变量名括起来的(*pquadrate),表明这个变量名优先和*结合。声明变量时前面有*就代表这个变量是指针,所以pquadrate是个指针。那它指向什么呢?

接着看,后面有小括号,前面有类型,表明是个函数。参数就是int a,返回值是int型。所以pquadrate是指向这样的函数的指针。

查看全部

Array数组其实是一种指针常量,而p则是一种指针变量(数组和指针有一定的通用性,又有一定的差别,指针可以表达数组,而数组不可以表达指针)

查看全部

4

采集

收起

2016-07-28

栈内存中,gcc编译会作内存优化:1)使同一数据结构的变量在一起;2)先定义的变量内存地址会小于后定义的;3)

只有堆内存和栈内存可以写入数据,代码段的内存编译以后无法修改。

查看全部

指针变量char *str2 = "hello",用scanf 向str2中输入字符串出错,其实也可以这么理解,指针str2只是指向一个地址,从这个地址开始写入"hello",没有指定内存长度,没有空间去容纳字符串。内存溢出!这个与char str[] = "hello"不同,str已经有了6个字节的内存空间,

查看全部

1.论视频中出现的*p=&a和p=&a

请注意第一次时 int *p 是指针声明 =&a 这是赋值。第二次的 p=&a也是赋值 但是p前面没有加* 因为已经声明过了 除了声明地方之外的*p 意义为:取p这个指针变量所指向的地址中的值

2.p++:指针偏移,运行效率高

3.p+3与*p+3区别:前者是把现指针向下移动三格,后者是对指针所指地址的变量进行操作(数学运算加3)

(Plus:p+=3与p=p+3等同,加的是步数,原理跟p[3]一样)

4.为什么p+4;*p=101 与p[4]=101等价???p[4]=101代表从初始位置(a的地址就始)以四个字节为一步,向前走4步,到达某个位置,然后对这个位置进行初始化赋值,即把101赋给这个地址所代表的内存空间。p[4]代表从初始位置(a的地址就始)以四个字节为一步,向前走4步,到达某个位置。*p=101,代表此时指针指向的地址(即走了四步后所在位置)并对这个地址所在的内存空间进行初始化,赋值为101。

5.i为什么1? GCC的优化,i是整形,在地址a之后。i初始0,循环一次后指针指向i,此时i+1=1(i++)

6. 指针如何指向数组?e.g: ①int a[3]={1,2,3};  int(*p)[3]=&a

②int *pa=array; pa[0]=1; pa[2]=2; pa[2]=3;

查看全部

3

采集

收起

2019-01-01

gdb调试:

1、gcc -g main.c -o main.out 编程可以单步调试的程序;

2、l 查看代码;

3、start 从main函数开始执行;

4、n  下一行

5、p 打印

6、s 单步,进入函数等

7、bt  查看堆栈信息

8、f *  切换堆栈

查看全部

3

采集

收起

2018-04-01

函数指针格式:

返回值类型 (*变量名)(形参列表);

p pa指找到数据的内存地址(a的地址);

p *pa指找到pa中的数据;

p &pa指找到pa本身的地址。

quadrate在代码段时,

p quadrate 函数的内存地址(quadrate )

p *quadrate 在地址前加*,表示通过地址取值

int quadrate(int a);是一个函数

int (*pquadrate)(int a)=&quadrate;则是指向这个函数的指针

int s=(*pquadrate)(a)可以调用函数

查看全部

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值