指针与内存分配

自己在实际编码中,犯了一些很低级的错误,发现还是基础知识掌握不牢,没有真正地理解。在这里把自己从书上看到的,从网上看到的,罗列了一下,以此警戒自己。

指针的定义
指针是能够存放一个地址的一组存储单元。

内存分配方式有三种:
(1)    从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
(2)    在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3)    从堆上分配,亦称动态内存分配。程序在运行的时候用malloc申请任意多少的内存,程序员自己负责在何时用free释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

指针与内存分配

(1)    在定义指针时,将在栈中开辟一块内存存放指针的地址(栈内的内存由系统分配和释放), 指针的地址内存只是存放指针的地址,不存放指针指向的数据。值得注意的是,定义指针时, 指针会随机指向一块内存,如int *p; p会指向一块不为空的内存,p只是一个指针,指针指向的内存还没有分配。相当危险,例如执行判断if(!p){ printf("p为空");};这里不会输出"p为空";所以在定义时想让指针p为空,则要int *p = NULL;如果程序大的话,执行的结果出错都不知道在哪里。
(2)    给指针赋值,一种是在堆上分配一块内存(动态分配内存),让指针指向这块内存.第二种是指针指向栈上的一块内存(一般是定义一个非指针变量,让指针指向这个变量)。
(3)    用调试器跟踪下面的代码,发现指针p 被free 以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p 成了“野指针”。如果此时不把p 设置为NULL,会让人误以为p 是个合法的指针。

 

通过以下代码实现:

#include <stdio.h>
#include <malloc.h>

 
int main()
{
   /* 第一种 */
   /* 动态的在堆上分配一块内存(手动分配) */
   int *p = (int*)malloc(sizeof(int));
   *p = 2;
   printf("%d\n", *p);

   /* 释放内存 */
   free(p);
    p= NULL;

   /* 第二种 */
   /* 由系统自动在栈上分配一块内存 */
   int i = 5;
   int *p2 = NULL;
   /*将p2指向栈上i的内存 */
   p2 = &i;
   printf("%d\n", *p2);

   return 0;
}
 

参考:
(1)    C程序设计语言
(2)    高质量C++编程
(3)    http://blog.csdn.net/bizhu12/article/details/6532235


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值