自己在实际编码中,犯了一些很低级的错误,发现还是基础知识掌握不牢,没有真正地理解。在这里把自己从书上看到的,从网上看到的,罗列了一下,以此警戒自己。
指针的定义
指针是能够存放一个地址的一组存储单元。
内存分配方式有三种:
(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 是个合法的指针。
(1) C程序设计语言
(2) 高质量C++编程
(3) http://blog.csdn.net/bizhu12/article/details/6532235
指针的定义
指针是能够存放一个地址的一组存储单元。
内存分配方式有三种:
(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