那到底什么是野指针呢?怎么去理解这个“野”呢?我们先看别的两个关于“野”的词: 野孩子:没人要,没人管的孩子:行为动作不守规矩,调皮捣蛋的孩子.野狗:没有主人的狗,没有链子锁着的狗,喜欢四处咬人. 对付野孩子的最好办法是给他定一套规矩,好好管教.一旦发现没有按规矩办事就好好收拾他. 对付野狗最好的办法就是拿条狗链锁着它,不让它四处乱跑. 对付也指针肯怕比对付野孩子或野狗更困难.我们需要把对付野孩子和野狗的办法都用上. 既需要规矩,也需要链子. 前面我们把内存比作尺子,很轻松的理解了内存.尺子上的…
1.如何使用 malloc 函数 不要莫名其妙,其实上面这段小小的对话,就是malloc的使用过程.malloc是一个函数,专门用来从堆上分配内存.使用malloc函数需要几个要求: 内存分配给谁?分配多大内存?是否还有足够内存分配?内存的将用来存储什么格式的数据,即内存用来做什么?分配好的内存在哪里? 如果这五点都确定,那内存就能分配.下面先看malloc函数的原型: (void *)malloc(int size) 看到了没有,这里的返回类型是(void *),这是多巧妙的一个设计啊. ma…
什么是定义?什么是声明?它们有何区别? 举个例子: A)int i; B)extern int i;(关于extern,后面解释) 哪个是定义?哪个是声明?或者都是定义或者都是声明?我所教过的学生几乎没有一人能回答上这个问题.这个十分重要的概念在大学里从来没有被提起过! 什么是定义:所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名.但注意,这个名字一旦和这块内存匹配起来(可以想象是这个名字嫁给了这块空间,没有要彩礼啊.^_^…
1.const 关键字也许该被替换为 readolny const是constant的缩写,是恒定不变的意思,也翻译为常量.常数等.很不幸,正是因为这一点,很多人都认为被const修饰的值是常量.这是不精确的,精确的说应该是只读的变量,其值在编译时不能被使用,因为编译器在编译时不知道其存储的内容.或许当初这个关键字应该被替换为readonly.那么这个关键字有什么用处和意义呢? const推出的初始目的,正是为了取代预编译指令define,消除它的缺点,同时继承它的优点.我们看看它与define…
1. void a void的字面意思是“空类型”,void *则为“空类型指针”,void *可以指向任何类型的数据. void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,看看下面的例子: void a; Visual C++6.0上,这行语句编译时会出错,提示“illegal use of type 'void'”.不过,即使void a的编译不会出错,它也没有任何实际意义. void真正发挥的作用在于: (1) 对函数返回的限定: (2) 对函数参数的限定. 众…
//野指针与空指针的区别 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> //野指针是指存在一个指针变量,但是这个指针变量指向的内存空间已经被释放,这时候指针的值还是不为空 //再次调用free()函数就会报错:空指针是值为NULL的指针变量 void main(){ int *p = (int *)malloc(sizeof(int)); *p = ; ////不规范写法 //if (p!=…
本文转载自:http://blog.csdn.net/xwdok/article/details/576497 "野指针"不是NULL指针,是指向"垃圾"内存的指针.人们一般不会错用NULL指针,因为用if语句很容易判断.但是"野指针"是很危险的,if语句对它不起作用."野指针"的成因主要有两种:(1)指针变量没有被初始化.任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气.所以,指针变量在创建的…
问题所在 1.局部指针变量没有被初始化 2.使用已经释放过后的指针 3.指针所指向的变量在指针之前被销毁 4.结构体成员指针未初始化, 没有为结构体指针分配足够的内存 ,内存越界(考虑使用柔性数组)和泄露 避免规则 1.用malloc申请了内存之后,应该立即检查指针值是否为NULL,防止使用值为NULL的指针 2.牢记数组的长度,防止数组越界操作,考虑使用柔性数组 3.动态申请操作必须和释放操作匹配,防止内存泄露和多次释放 4.free指针之后必须立即赋值为NULL malloc用于从堆中分配一…
1.内存泄漏 内存泄漏是指我们在堆中申请(new/malloc)了一块内存,但是没有去手动的释放(delete/free)内存,导致指针已经消失,而指针指向的东西还在,已经不能控制这块内存, 所以就是内存泄漏了,看下面的例子. void remodel(std::string &str){    std::string *ps = new std::string(str);  //创建了一个局部指针变量,函数调用结束后,指针变量消失,但堆中内存仍然被占用,没有被释放,导致内存泄漏    //内存…
1.函数指针的定义 顾名思义,函数指针就是函数的指针.它是一个指针,指向一个函数.看例子: A) char * (*fun1)(char * p1,char * p2); B) char * *fun2(char * p1,char * p2); C) char * fun3(char * p1,char * p2); 看看上面三个表达式分别是什么意思? C)这很容易,fun3是函数名,p1,p2是参数,其类型为char *型,函数的返回值为char *类型.B) 也很简单,与C)表达式相比,唯…