您的位置:首页 > 编程语言 > C语言/C++

《c语言深度剖析》学习笔记4

2012-06-22 21:49 176 查看
第五章 内存管理

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));

}

}

第七章 文件结构

~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: