【Linux C】总结——数组、指针and内存管理

来源:互联网 发布:逆战射源码 编辑:程序博客网 时间:2024/04/29 08:32

关于指针:

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

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

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

详解:【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、释放了内存却继续使用它。

  应对:释放完内存之后要及时将指针置空。

1 0
原创粉丝点击