为了账号安全,请及时绑定邮箱和手机立即绑定
慕课网数字资源数据库体验端
Linux C语言指针与内存_学习笔记_慕课网
为了账号安全,请及时绑定邮箱和手机立即绑定

Linux C语言指针与内存

DavidChin
难度初级
时长 2小时 5分
  • vi main.c调出主程序
    查看全部
  • \0字符串结束;gcc main.c编译程序;gcc -g main.c调试程序
    查看全部
  • gdb./a.out
    查看全部
  • p=&a,/a.out,start,list,:wq,vi main.c,gcc main.c,gcc -g main.c,./a.out
    查看全部
    0 采集 收起 来源:指针运算

    2018-03-22

  • n,p,bt,x/1d,gdb,gcc -g main.c,.a/out,
    查看全部
  • 变量的本质是内存空间,用来指示内存地址位置 指针的本质就是地址,指针(数据类型)所表示的内存空间里存储的是另一个内存地址
    查看全部
  • p;指针指向的变量地址 *p;指针指向的变量值 &p;指针自己所在的地址 既然一个指针保存的是变量的地址,对32位CPU,地址有4个字节,就需要4个内存单元来存储,所以每次++p在内存里都是跳4格。
    查看全部
  • 静态变量、常量、全局变量都是存在于数据段中 静态变量每个函数特有的,是不同的变量 全局变量指向同一个变量
    查看全部
  • 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:退出调试;
    查看全部
    0 采集 收起 来源:gdb工具的使用

    2015-08-12

  • 内存分析的很牛逼啊。
    查看全部
  • 因为其存放在代码段里所有是不能被修改的
    查看全部
  • 以初始话的字符数组不能再写入字符
    查看全部
  • 栈内存中,gcc编译会作内存优化:1)使同一数据结构的变量在一起;2)先定义的变量内存地址会小于后定义的;3) 只有堆内存和栈内存可以写入数据,代码段的内存编译以后无法修改。
    查看全部
  • 内存对齐之二篇 cpu对内存的操作有对并的概念: 如果操作1字节的数据,可以是任意地址,如果是操作2字节的数据,如果开始地址在偶数地址,一次就可以取2字节,如果开始地址在奇数,就要2次内存操作才能完成;如果操作4字节的数据,最好开始地址在能被4整除的数值上,这样用一条32位的内存操作指令完成。8字节的开始位置最好的能被8整除的数值上,这样用一条64位的内存操作指令完成。就是说,如果对齐了,一次就可以完成,不对齐,就可能多次才能完成。编译程序处理时也有对齐处理,一般的结构体和对象等估计都有对齐的处理(把结构体或对象的开始位置定在边界上),这样,只要你在结构体里对象之间能处理好对齐,你的数据就能操作得很快。 有时你定义了一个结构体,用了若干字节,但不是8或4的倍数,但你查内存时能发现它们占用的是8或4的倍数(多用了几个字节),就是这个原因。 比如32位机,32根地址线,32根数据线,取数时,cpu的32根据地址线与内存的0-3号地址对齐,cpu的32位的数据线也同样,一个读取周期只能取这0-3地址的3个字节。如果你是取3-4地址的数据,CPU会自动把它分解成2次取数据操作,一次取8位的3单元和一次取8位4单元数据。 只有开始地址是0、4、8...的32位的数据操作才能一次操作完成,内存不支持从1号单元开始的4字节读,CPU和内存的数据线必须相应数据线对齐才行。 如果要没有这个限制,CPU和内存的制作成本就会高一些。况且,CPU和内存的控制总线标准是早就规定好了的,造CPU的生产出了有你这种功能的CPU,但内存不支持,必须某年某月国际上协商出了新的标准,你的这种想法才可能实现。
    查看全部
  • 内存对齐之一篇: 为了加快计算机的取数速度,编译器默认对内存进行字节对齐。对结构体(包括类)进行字节对齐的原则是:1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。 struct SByte1 { double d; // 偏移量 0~7 char j; // 偏移量8 int a; // 偏移量12~15,由于9不能整除4,故先填充9~11 }; sizeof(SByte1); // = 16 struct SByte2 { char j; // 偏移量0 double d; // 偏移量8~15,由于1不能整除8,故先填充1~7 int a; // 偏移量16~19 }; sizeof(SByte2); // = 24,为了凑成8的倍数,填充20~23
    查看全部

举报

0/150
提交
取消
课程须知
本课程是C语言中级课程,为了更好的学习效果: 1、需要有一定的C语言基础,如果没有基础的同学可以看《C语言入门》这门课。 2、本课程是在Linux环境下讲解,需要熟悉一些Linux命令。如果不了解的话可以在《Linux C语言编程基本原理与实践》这门课程中补充
老师告诉你能学到什么?
1、C语言中的指针是怎么回事 2、Linux下gdb调试工具是怎样使用的 3、指针与内存有着怎样的关系 4、数组与字符串之间的联系
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!