标签:
栈、堆、静态区
内存分为3个部分:堆、栈、静态区 堆栈就是栈stack,不是堆heap
堆: 由malloc系列函数 或 new操作符分配的内存。 其生命周期由free或delete决定。 在没有释放之前一直存在,直到程序结束。
栈: 保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁。
静态区: 保存自动全局变量 和 static变量 , 由编译器在编译的时候分配。
常见的内存错误及对策
1、结构体成员指针未初始化
struct student
{
char * name;
int score;
} stu , * pstu;
// name 指针并没有指向一个合法的地址;
//解决的办法是为 name指针 malloc一块空间
int main()
{
strcpy(stu.name , "Jimy");
stu.score = 99;
return 0 ;
}
int main()
{
pstu = (struct student *) malloc(sizeof(struct student));
strcpy(pstu->name , "Jimy" );
pstu -> score = 99;
free(pstu);
return 0 ;
}
2、没有为结构体指针分配足够的内存
int main()
{
pstu = (struct student*) malloc(sizeof(struct student *)); //malloc(sizeof(struct student))
strcpy(pstu->name , "Jimy");
pstu->score = 99;
free(pstu);
return 0;
}
3、函数的入口校验
不管什么时候,我们使用指针之前一定要确保指针是有效的。
对参数进行效验: assert(NULL != p) //在函数入口处 //assert是一个宏,而不是函数,包含在assert.h头文件中。
对非参数的地方: if(NULL != p)
为指针分配的内存太小
char *p1 = "abcdefg";
char *p2 = (char *) malloc(sizeof(char)*strlen(p1));
strcpy(p2,p1);
//
字符串常量的结束标志"\0"
不要因为char类型大小为1个字节就省略sizeof(char)这种写法,这样只会使你的代码可移植性下降。
char * p2 = (char *) malloc(sizeof(char)*strlen(p1) + 1*sizeof(char) );
用malloc函数申请0字节内存???
内存释放 + 内存释放之后
free(p); p = NULL ;
标签:
原文地址:http://www.cnblogs.com/yangjin2010/p/5795853.html