读书笔记2、内存分配、sizeof、指针

二、内存分配

1、内存分配的形式有哪些?

一个C/C++编译的程序所占用的系统内存一般分为以下几个部分的内容:

a、有符号起始的区块(BBS, Block Started by Symbol)段:存放程序中未初始化的全局数据和静态数据的一块内存区域。BSS段属于静态内存分配,程序结束后静态变量资源由系统自动释放。

b、数据段:存放程序中已初始化的全局变量的一块内存区域。数据段也属于静态内存分配。

c、代码段:也叫文本段,存放程序中执行代码的一块内存区域。

d、堆(heap):用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。它与数据结构中的堆是两回事,分配方式类似于链表。

e、栈(stack):存放程序临时创建的局部变量,一般包括函数括弧{}中定义的变量,但不包括static 声明的变量。

2、什么是内存泄露

堆是动态分配内存的,,并且可以分配使用很大的内存,使用不好会产生内存泄露。频繁地使用malloc 和free 会产生内存碎片(类似磁盘碎片)

所谓内存泄露是指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。

一般常说的内存泄露是指堆内存的泄露,内存泄露其实并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

必须时刻注意malloc free 与 new delete 的成对出现。

3、栈空间的最大值是多少

在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。

栈顶的地址和栈的最大容量是系统预先规定好的,在Windows下,栈的大小是2MB。而申请堆空间的大小一般小于2GB。

Linux 默认栈空间大小是8MB,通过命令ulimit -s 来设置。

4、什么是缓冲区溢出

缓冲区是程序运行的时候机器中的一个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。

缓冲区溢出是指当向缓冲区内填充数据位数超过了缓冲区自身的容量限制时,发生的溢出的数据覆盖在合法数据(数据、下一条指令的指针、函数返回值地址等)上的情况。

三、sizeof

1、sizeof是关键字吗?

是关键字

2、strlen(“\0”) = ? sizeof("\0")= ?

strlen 执行的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,知道碰到第一个字符串结束符’\0‘为止,然后返回计数器的值。

sizeof 是C语言的关键字,它以字节的形式给出了其操作数的存储大小,操作数可以是个表达式或括在括号内的类型名,操作数的存储大小由操作数的类型决定。

两者的主要区别:

a、sizeof 是关键字,而strlen 是函数。sizeof 后如果是类型必须加括弧,如果是变量的话可以不加。

b、sizeof 操作符的结果类型是size_t,它的头文件中typedef 为 unsigned int 类型。该类型保证能够容纳实现所建立的最大对象的字节大小。

c、sizeof 可以用类型作为参数,strlen 只呢个用 char* 作参数,而且必须是以’\0‘结尾的。sizeof 还可以以函数作为参数,如 int g() ,则sizeof(g())的值等于sizeof(int)的值,在32位计算机下,该值为4.

d、当数组名做sizeof 的参数是不退化,传递给strlen 就退化为指针了。

以数组char a[10] 为例,在32位机器下,sizeof (a) = 1*10=10,而传递给strlen 就不一样了。

e、大部分编译程序的sizeof 都是在编译的时候计算的,所以可以通过sizeof(x)来定义数组维数。而strlen 计算则是在运行期计算的,用来计算字符串的实际长度,不是类型占内存的大小。

f、当用于计算一个结构类型或变量的sizeof时,返回实际的大小,当用于计算一个静态变量或数组时,返回整个数组所占用的大小,而sizeof 不能返回动态数组的大小。

g、数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址。

3、对于结构体而言,为什么sizeof 返回的值一般大于期望值

struct 是一种复合数据类型,其构成元素既可以是基本数据类型,也可是复合数据类型。

一般而言,struct 的sizeof 是所有成员对齐后长度相加,而union 的sizeof 是去最大的成员长度。A

4、指针进行强制类型转换后与地址进行加法运算,结果是什么?

有具体实例,可百度。

四、指针

1、使用指针有哪些好处?

a、可以动态分配内存。

b、进行多个相似变量的一般访问。

c、为动态数据结构,尤其是树和链表,提供支持。

d、遍历数组,如解析字符串。

e、高效的按引用“复制”数组与结构,特别是作为函数参数的时候,可以按照引用传递函数参数,提高开发效率。

2、引用还是指针

a、非空区别。在任何情况下都不能使用指向空值的引用。

b、合法性区别。在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试,防止其为空。

c、可修改区别。指针可以被重新赋值以指向另一个不同对象。但引用则总是指向在初始化时被指定的对象,以后也不能改变,但是指定的内容可以改变。

d、应用区别。总的来说,在以下情况应该使用指针:一是考虑到存在不指向任何对象的可能;二是需要能够在不同的时刻指向不同对象。

3、指针和数组是否表示同一概念

指针可以随时指向任何类型的内存块,而数组可以在静态存储区被创建。

不同:修改内容不同;所占字节不同。

4、指针是否可进行> 、<、 >=、 <=、 == 运算

不可以。对于指针而言,只能进行== 和 != 运算。

5、指针与数字相加的结果是什么

具体问题具体分析!

6、野指针?空指针

野指针是指指向不可用内存的指针。

忘掉失败,不过要牢记失败中的教训。

读书笔记2、内存分配、sizeof、指针

相关文章:

你感兴趣的文章:

标签云: