1. 使用未初始化内存
char *p = malloc(10);
//未初始化之前10个字节可能包含垃圾数据,若被访问可能获得垃圾值,导致程序的不可预测的行为。
良好的实践是通过memset与malloc结合,如下:
char *p = malloc(10);
memset(p,'/0',10);
2. 内存覆盖
对于1中的p分配了10个字节,如果某个代码片段尝试向p写入一个11个字节的值,则该操作将在不告诉的情况下自动从其他某个位置
“吃掉”一个字节。
char *p = malloc(10);
char *q = malloc(11);
memcpy(p,q,11);
memcpy操作尝试将11个字节写到p,而后者只分配了10个字节。
3. 内存读取越界
内存读取越界是指所读取的字节数多于它应有的字节数。
char *ptr = (char*) malloc(10);
char name[20];
memcpy(name,ptr,20);
memcpy尝试从ptr中读取20个字节,但是只分配了10个字节。
4. 内存泄露
a.重新赋值
char *memoryArea = malloc(10);
char *newArea = malloc(10);
memoryArea = newArea;
memoryArea之前指向的内容丢失。
b.首先释放父指针,而子指针的分配的内存并未释放。
c.返回值未处理
char *fun()
{
return malloc(20);
}
void callfun()
{
fun();
}
C语言中容易导致指针和内存泄露的几种出错
最新推荐文章于 2023-11-03 21:16:43 发布