动态内存错误
动态内存错误
对NULL指针的解引用操作
#include<stdio.h>
#include<errno.h>//perror的头文件
#include<limits.h>//INT_MAX的头文件
int main()
{
int* p = (int*)malloc(INT_MAX);//INT_MAX是21亿多
if (p == NULL)//太大没有开辟成功,导致返回值为空指针,所以判断一下
{
perror("malloc");
return 1;
}
//释放
free(p);
p = NULL;
return 0;
}
结果就是没有足够的空间
#include<stdio.h>
#include<limits.h>//INT_MAX的头文件
void test()
{
int* p = (int*)malloc(INT_MAX);
*p = 20;//如果p的值是NULL,就会有问题
free(p);
}
int main()
{
test();
return 0;
}
结果
对动态开辟空间的越界访问
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p = (int*)malloc(20);//20个字节-5个整形
if (p == NULL)//判断
{
return 1;
}
int i = 0;
for (i = 0; i < 20; i++)
{
*(p + i) = i;//20个整形
}
for(i = 0; i < 5; i++)
{
printf("%d ", p[i]);//申请了5个整形,但是使用了20个整形,程序崩掉,越界访问了
}
//释放
free(p);
p = NULL;
return 0;
}
这个代码没法进行运行,会直接崩掉,所以我就展示崩掉的代码了
对非动态开辟内存使用free释放
#include<stdio.h>
#include<stdlib.h>
int main()
{
int num = 10;
int* p = #
free(p);//编译器无法理解你在释放什么
p = NULL;//程序崩掉
return 0;
}
使用free释放一块动态开辟内存的一部分
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p = (int*)malloc(100);//100个字节
if (p == NULL)
{
return 1;
}
int i = 0;
for (i = 0; i < 5; i++)
{
//*(p + i) = i;//起始地址不变,动态内存开辟一定要保证起始位置不变
*p = i;//起始地址变了,导致释放不完全
p++;//是错误的行为,程序直接崩掉
}
free(p);//释放时,p指向的不是起始位置
p = NULL;
return 0;
}
对同一块动态内存多次释放
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p = (int*)malloc(100);//100个字节
if (p == NULL)
{
return 1;
}
int i = 0;
for (i = 0; i < 5; i++)
{
*(p + i) = i;
}
free(p);
p = NULL;//如果这里没有把P置为空指针,那么程序就会崩掉
free(p);//如果置为空指针之后再次释放
//那么函数什么事都不做,所以一定要记得将函数置为空指针
return 0;
}
动态开辟内存忘记释放(内存泄漏)
#include<stdio.h>
#include<stdlib.h>
void test()
{
int *p = (int *)malloc(100);
if(NULL != p)
{
*p = 20;
}
}
int main()
{
test();
while(1);//程序会一直进行下去,导致内存损耗,最后崩掉
}
所以,在进行动态内存的使用时一定要记得进行判断,释放,赋空