1、 三种内存分配方式
这是最基本的知识。
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的
整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函
数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用 malloc 或 new 申请任意多
少的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
2、易错点
(1) 内存分配未成功,却使用了它。
应在使用前先检查是否为NULL, 如果在函数中则可用assert来判断:assert(p != NULL);
(2) 内存分配虽然成功,但是尚未初始化就引用它。
(3) 内存分配成功并且已经初始化,但操作越过了内存的边界。最常见的就是数组。
(4) 忘记了释放内存,造成内存泄露。
动态内存的申请与释放必须配对, malloc后记得 free,new后记得delete。
(5) 释放了内存却继续使用它。比较难发现的一个错误是用return返回指向“栈内存”的“指针”或者“引用” ,但该内存在函数体结束时就被自动销毁了。
(6)使用 free 或 delete 释放了内存后,要将指针设置为 NULL,否则会导致产生“野指针”
(7)不要忘记为数组和动态内存赋初值,防止将未被初始化的内存作为右值使用。
3、指针与数组
很多人都认为指针和数组是等价的,其实不然。
数组 要么在静态存储区被创建 (如全局数组) , 要么在栈上被创建。 数组名对应着 (而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。
指针 可以随时指向任意类型的内存块,它的特征是“可变” ,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险。
char a[] = “hello”;
a[0] = ‘X’;
cout << a << endl;
char *p = “world”; // 注意 p 指向常量字符串
p[0] = ‘X’; // 编译器不能发现该错误
cout << p << endl;
从上面这个例子可以看出, 指针 p 指向常量字符串“world” (位于静态存储区,内容为 world\0) ,常量字符串的内容是不可以被修改的。
注意,不能把数组a的内容用b=a的方式赋值给数组b,因为这会产生编译错误。应该用strcpy 进行复制。
而if(p==a) 比较的不是内容而是地址,应该用库函数 strcmp来进行比较。
下面是它与指针在这些方面的差别。
// 数组…
char a[] = "hello";
char b[10];
strcpy(b, a); // 不能用 b = a;
if(strcmp(b, a) == 0) // 不能用 if (b == a)
…
// 指针…
int len = strlen(a);
char *p = (char *)malloc(sizeof(char)*(len+1));
strcpy(p,a); // 不要用 p = a;
if(strcmp(p, a) == 0) // 不要用 if (p == a)
…
4、计算内存容量。
这一点在面试时可以考倒一大堆人。
sizeof 可以计算出数组的容量(字节数),包括'\0'。如果参数是一个指针的话,那么返回的是指针的长度:4 。。 C++/C语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。
还有一点:当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。看几个例子:
char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12 字节
cout<< sizeof(p) << endl; // 4 字节
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4 字节而不是 100 字节
}
分享到:
相关推荐
高质量C++编程学习笔记.doc
自己整理的 觉得比较需要注意的地方记录下来(自己觉得比较重要的)
经典书籍 高清完整版 附带学习笔记 强烈推荐!!!
1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...
对于C++学习很有帮助,特别是笔记,可以仔细看看
可以很好的对于你学习C++,有指导作用
1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...
1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...
1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...
1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...
1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...
1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...
1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数...
2012-06-11 21:16 97,280 C语言 内存管理详解.doc 2012-06-11 21:06 387,499 c语言写的一个多任务内核.rar 2012-06-11 21:15 6,669,174 C语言常用算法集(人手一份).pdf 2012-06-11 21:44 2,279 C语言编一个程序...
Python》(编写高质量Python代码的59个有效方法) 《流畅的python》 源码学习 学习笔记 Python 自用工具代码库 Scheme 学习笔记 Scheme 学习笔记 《计算机程序的构造和解释》 学习笔记及部分例题答案 Verilog DHL 学习...
1. C 语言中的指针和内存泄漏 ............................................................................................................. 5 2. C语言难点分析整理 ..........................................
数据结构教材 我强烈推荐Sartaj Sahni著《数据结构算法与应用 C++语言描述》 这是一部难得的好书 作者循序渐进 娓娓道来 每一种数据结构和算法都给出了详细的实现代码和运行结果 而且代码质量极高 甚至可以直接照搬...
VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...
这三年里我学到了能重根本上了解计算机的运作,能用C/C++编写一些程序和修改一些程序。了解单片的应用等等知识。 三、存在问题及努力方向。 虽说是三年的函授学习,实际上面授只有三个月左右。虽说函授教师备课认真...