《c语言深度剖析》学习笔记4
2012-06-22 21:49
176 查看
第五章 内存管理
5.1 野指针
> 定义指针变量的同时,最好初始化为NULL,用完指针之后,也将指针变量的值设置为NULL.
5.2 栈、堆和静态区
>静态区:保存自动全局变量和static变量。静态区的内容在整个程序的生命周期内都存在,有编译器编译时分配。
>栈:保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束的时候,这些内容也自动被销毁。其特点是效率高,但空间大小有限。
>堆:由malloc系列函数或new操作符分配的内存。其生命周期由free或delete决定。其特点是使用灵活,空间比较大,但容易出错。
5.3 常见的内存错误
>指针没有指向一块合法的内存:
>>1.
>>2. assert宏在调试时的使用。
>>3. 在定义变量的时候,尽可能地去初始化。
>>4. 内存越界:int a[3]; a[3] = 4;
>>5. 内存泄露:会产生内存泄露的内存就是堆上的内存,即由malloc / new分配的内存。如果用完之后没有即使free/delete,这快内存就无法释放,直到整个程序终止。
>>6. malloc函数
函数原型:(void *)malloc(int size);
函数返回的是void *型,所以必须将其转换成你所接收的类型。
char *p = (char *)malloc(100);在堆上分配了100个字节内存,返回这块内存的首地址,并强制转换成char *型后赋值给p。这块内存本身没有名字,对它的访问只能通过p来匿名访问。
如果所申请的内存块大于目前堆上剩余的内存块,则内存分配失败,返回NULL。需要用if(NULL != p)来验证。
char *p = (char *) malloc(0); 可以申请0字节的内存,但p != NULL; (p 怎样使用呢?)
free函数,斩断指针变量和这块内存的关系。因为malloc函数分配的内存块都要通过p来访问,free就是把他们俩的关系斩断。
free后,指针变量p保存的地址没有改变,但它对这块地址处的内存已经没有所有权了。这块被释放的内存里面保存的指也没有变,只是再没有办法访问它了。(????)free完之后,如果没有把p指向NULL,p就成为了野指针。
>>对NULL指针的free是什么情况?
第六章 函数
6.1 函数声明的时候,可以省略参数的名字,但定义的时候不能省略。
6.3 getchar()函数的原型:int getchar(void);
6.4 不用全局变量/局部变量编写strlen函数:
int my_strlen(const char *strDest)
{
assert(NULL != strDest);
if ('\0' != *strDest)
{
return 0;
}
else
{
return (1 + my_strlen(++strDest));
}
}
第七章 文件结构
~
5.1 野指针
> 定义指针变量的同时,最好初始化为NULL,用完指针之后,也将指针变量的值设置为NULL.
5.2 栈、堆和静态区
>静态区:保存自动全局变量和static变量。静态区的内容在整个程序的生命周期内都存在,有编译器编译时分配。
>栈:保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束的时候,这些内容也自动被销毁。其特点是效率高,但空间大小有限。
>堆:由malloc系列函数或new操作符分配的内存。其生命周期由free或delete决定。其特点是使用灵活,空间比较大,但容易出错。
5.3 常见的内存错误
>指针没有指向一块合法的内存:
>>1.
struct student { char *name; int score; }stu,*pstu; int main() { pstu = (struct student*)malloc(sizeof(struct student)); strcpy(pstu->name,"Jimy"); pstu->score = 99; free(pstu); return 0; }为指针变量pstu分配了内存,但是没有给pstu的成员name分配内存!
>>2. assert宏在调试时的使用。
>>3. 在定义变量的时候,尽可能地去初始化。
>>4. 内存越界:int a[3]; a[3] = 4;
>>5. 内存泄露:会产生内存泄露的内存就是堆上的内存,即由malloc / new分配的内存。如果用完之后没有即使free/delete,这快内存就无法释放,直到整个程序终止。
>>6. malloc函数
函数原型:(void *)malloc(int size);
函数返回的是void *型,所以必须将其转换成你所接收的类型。
char *p = (char *)malloc(100);在堆上分配了100个字节内存,返回这块内存的首地址,并强制转换成char *型后赋值给p。这块内存本身没有名字,对它的访问只能通过p来匿名访问。
如果所申请的内存块大于目前堆上剩余的内存块,则内存分配失败,返回NULL。需要用if(NULL != p)来验证。
char *p = (char *) malloc(0); 可以申请0字节的内存,但p != NULL; (p 怎样使用呢?)
#include <stdio.h> #include <stdlib.h> int main() { char *p = (char *)malloc(0); printf("%p\n", p); *p = 'a'; printf("%c\n", *p); //output:a return 0; }>>7. free函数
free函数,斩断指针变量和这块内存的关系。因为malloc函数分配的内存块都要通过p来访问,free就是把他们俩的关系斩断。
free后,指针变量p保存的地址没有改变,但它对这块地址处的内存已经没有所有权了。这块被释放的内存里面保存的指也没有变,只是再没有办法访问它了。(????)free完之后,如果没有把p指向NULL,p就成为了野指针。
>>对NULL指针的free是什么情况?
第六章 函数
6.1 函数声明的时候,可以省略参数的名字,但定义的时候不能省略。
6.3 getchar()函数的原型:int getchar(void);
6.4 不用全局变量/局部变量编写strlen函数:
int my_strlen(const char *strDest)
{
assert(NULL != strDest);
if ('\0' != *strDest)
{
return 0;
}
else
{
return (1 + my_strlen(++strDest));
}
}
第七章 文件结构
~
相关文章推荐
- 《C语言深度剖析》学习笔记四--指针
- 《C语言深度剖析》学习笔记--------第一章-----关键字
- 《C语言深度剖析》学习笔记五--内存管理
- 《C语言深度剖析》学习笔记六--函数及编码规范
- 《C语言深度剖析》学习笔记----内存管理(1)----内存对齐
- 《C语言深度剖析》学习笔记1
- 《C语言深度剖析》学习笔记----C语言关键字
- 《c语言深度剖析》学习笔记2
- 《C语言深度剖析》学习笔记----内存管理(2)
- 《C语言深度剖析》学习笔记----C语言中的符号
- 《C语言深度剖析》学习笔记
- 《C语言深度剖析》学习笔记二
- 学习笔记——PHP数据的相关处理
- 《Python学习手册》学习笔记(26)之第26章类代码编写基础(关键词:编程语言/Python/OOP/面向对象/类)
- 《Head First 设计模式》学习笔记——适配器模式 + 外观模式
- MongoDB学习笔记(查询)
- 《C专家编程》学习笔记(这不是BUG,而是语言特性)
- 《WebGL编程指南》学习笔记——1.WebGL概述
- 学习笔记——3D坐标系统
- 《大话数据结构》——学习笔记(图)