您的位置:首页 > 其它

数组、指针和内存管理

2016-09-16 22:20 204 查看
关于指针:

一维指针保存基本变量的地址

二维指针保存一维指针变量的地址

三维指针保存二维指针变量的地址

详解:【Linux
C】浅谈指针(一)

关于传参:

传一维数组名,用数组元素的指针来接

传二维数组名,用一维数组的指针来接

传三维数组名,用二维数组的指针来接

传指针数组,用指针的指针接

关于数组名:

一维数组名:指针常量,指向数组首元素的地址

二维数组名:首个一维数组的地址(首行的地址)

三维数组名:首个二维数组的地址

如何避免野指针(养成良好的编程习惯):

1、当定义一个指针,且该指针没有指向时,将其置为空。

2、当要往指针指向的空间赋值时,先看是否给它分配了合法的空间。

取值和取地址:

   &a;

   *(&a)
== a;

1、对一维数组的数组名取地址等于数组的地址。

对一维数组的地址取值等于数组首元素的地址。

2、对二维数组的数组名取地址等于二维数组的地址。

对二维数组的地址取值等于首个一维数组的地址。

3、对三维数组的数组名取地址等于三维数组的地址。

对三维数组的地址取值等于首个二维数组的地址。

数组与指针的区别(主要):
数组
指针
空间分配
静态分配
动态分配
访问效率
直接访问,效率高
间接访问,效率低
安全性
数据越界
内存泄漏
函数形参
都转化成相应的指针
你的数据放在哪里:

栈(stack):局部变量、函数形参、自动变量

堆(heap):malloc、realloc、calloc分配的空间

数据区(.bss段):未初始化的全局变量

数据区(.data段)(静态数据区):初始化过的全局变量、静态static修饰的变量

数据区(.rodata段):常量数据

代码段(.text段):代码

常见的内存错误及应对:

1、内存分配未成功,却使用了它。

 应对:在使用之前检查内存是否分配成功。可以在使用内存之前检查指针是否为NULL,若分配成功便可以使用,否则打印错误信息并退出程序。

2、内存虽然分配成功,但是尚未初始化就引用它。

 应对:

  ①注意赋初值

  ②在检查内存分配成功之后,先用memset或bzero函数清空分配好的内存空间原来的数据。

3、内存分配成功并且已经初始化,但操作越过了内存边界。

 应对:在使用数组时,注意是否操作越界。有没有下标“多1”或“少1”的操作,特别要注意循环。

4、忘记了释放内存,造成内存泄漏。

  应对:用完了动态内存之后一定要释放。动态内存的申请与释放必须配对,程序中malloc与free的使用次数一定要相同,new/delete同理。

5、释放了内存却继续使用它。

  应对:释放完内存之后要及时将指针置空。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: