第6/7章预习

本文深入探讨了程序中数据存储的不同区域,包括bss段、data段、rodata段、text段、栈和堆的特点与用途,并解析了内存分配方式、野指针成因及段错误的调试方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.  数据存放在哪?

A. bss段存放没有初始化和初始化为0的全局变量;

B. data段存放初始化为非0的全局变量;

C. rodata存放常量数据;

D. text段存放代码和部分整数常量;

E. 栈(stack)存放临时变量和函数参数;

F. 堆(heap)最灵活的内存,生命周期由使用者控制。

2. bss段和data段区别

bss的全局变量只占运行时的内存空间,而不占用文件空间;

data的全局变量即占文件空间,又占运行时的内存空间。

两者作为全局变量,在整个程序的运行周期内,数据一直存在。

3. 内存分配方式?

A. 从静态存储区分配:内存在程序编译时就已分配好,这个内存在程序的整个运行期 间都存在;

B. 在栈上创建:执行函数时,函数内局部变量的存储单元都可在栈上创建,函数执行 结束时,这些存储单元自动被释放;

C. 从堆上分配(动态内存分配):程序运行时申请的内存,程序员负责在何时释放。

4. 野指针成因?

A. 指针变量没有被初始化。指针变量刚被创建时不会自动成为NULL指针,默认值随 机;

B. 指针被freedelete后,没有置为NULL

5. 段错误及调试方法

段错误:访问了不能访问的内存。

调试方法:a.利用gdb逐步查找段错误;

  b.分析core文件;

  c.段错误时启动调试;

  d.利用backtraceobjdump进行分析。

6. 宏定义

宏定义:由源程序中的宏定义完成;宏替换:由预处理程序自动完成。

无参宏定义:无参的宏名后不带参数。形式:#define 标识符 字符串,以“#”开头的 均为预处理命令。

带参宏定义:在宏定义中的参数称为形参,在宏调用中的参数称为实参。在调用中不仅 要宏展开,还要用实参代换形参。定义形式:#define 宏名(形参表) 字符串,字符 串中含有各形参;调用形式:宏名(实参表);。

7.文件包含

形式:#include “文件名”。功能:把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。

注:a.包含命令中的文件名可以用双引号或尖括号,尖括号:在包含文件目录中查找;

双引号:在当前的源文件目录查找;

b.一个include命令只能指定一个被包含文件;

c.文件包含允许嵌套。

8. 结构体

要传送的不是简单的字节流(char型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。

结构体和数组的比较:都由多个元素组成;各个元素在内存中的存储空间是连续的;数组中各个元素的数据类型相同,而结构体中各元素的数据类型可以不相同。

9. 常量数据

A. 常量不一定放在rodata,有的立即数直接和指令编码在一起,存放在代码段(test)中;

B. 对于字符串常量,编译器会自动去除重复的字符串,保证一个字符串在一个可执行文件中只存在一份复制;

C. rodata在多个进程间是共享的;

D. 常量不可修改;

E. 可通过XIP技术直接读取。

10. 堆和栈

栈:高地址向低地址扩展,同时有esp指针一直指向栈顶(低地址),另外栈的原则是先入后出

堆:malloc用来分配一块指定大小的内存;realloc用来调整/重分配一块存在的内存;free用来释放不再使用的内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值