目录
前言
这篇博客讲一下我们进行动态内存开辟会搞出的一些问题!
一、对空指针的解引用操作
我们看一个代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p = (int*)malloc(20);
*p = 5;
return 0;
}
这个代码乍一看会觉得没有问题啊,可是我们想一下,如果没能找到一块空间给予p,那就会给到一个空指针,而我们下面对这个空指针进行解引用操作后就会有问题。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p = (int*)malloc(20);
if (p == NULL)
{
}
else
{
*p = 5;
}
return 0;
}
如上代码改一下就可以解决这个问题了。
二、对动态开辟空间的越界访问
int main()
{
int*p = (int*)malloc(20);
if (p == NULL)
return 1;
int i = 0;
for (i = 0; i < 20; i++)
{
*(p + i) = i;
}
for (i = 0; i < 20; i++)
{
printf("%d ", p[i]);
}
free(p);
p = NULL;
return 0;
}
上面这个代码就是一个越界访问。你运行就会出现警告。
三、对非动态开辟内存使用free释放
int main()
{
int num = 10;
int*p = #
free(p);
p = NULL;
return 0;
}
上面这个代码,num并不是我们动态开辟的内存,但是我们用了free去释放它,这样就会出现问题,编译器也会“不知所措”的。
四、使用free释放一块动态开辟内存的一部分
int main()
{
int* p = (int*)malloc(40);
if (p == NULL)
return 1;
int i = 0;
for (i = 0; i < 5; i++)
{
*p = i;
p++;
}
free(p);
p = NULL;
return 0;
}
这个代码里我们可以看到有一个p++,这个操作直接就给我们把开辟的空间的指针改变了指向位置,当我们在后面free这个p时就会出问题,我们的程序就会直接崩掉!
五、对同一块动态内存多次释放
int main()
{
int* p = (int*)malloc(40);
if (p == NULL)
return 1;
int i = 0;
for (i = 0; i < 5; i++)
{
*(p + i) = i;
}
free(p);
free(p);
return 0;
}
上面代码就对p进行了多次释放,这样干的话,我们的代码在编译器上跑的时候就会崩!
六、动态开辟内存忘记释放(内存泄漏)
int* get_memory()
{
int* p = (int*)malloc(40);
return p;
}
int main()
{
int *ptr = get_memory();
return 0;
}
上面的代码就是一个内存泄漏,我们只顾着申请了,而没有去对它释放,那我们申请的内存一旦越来越多,电脑就会变慢啊,变卡啊,所以这是很糟糕的!
总结
好了,以上就是我要介绍的所有动态开辟内存会产生的问题,欢迎指正!
感谢支持!