目录
动态内存使用中常见的错误
1.对空指针的解引用操作
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p = (int*)malloc(4);
*p = 20; //如果内存开辟失败,则会出问题
free(p);
return 0;
}
2.对动态开辟空间的越界访问
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p = (int*)malloc(40);
if(p == NULL)
{
return 1;
}
for(int i = 0; i <= 10; i++)
{
p[i] = i;
}
free(p);
p = NULL;
return 0;
}
3.对非动态开辟内存使用free释放
#include <stdlib.h>
int main()
{
int arr[10];
free(arr);
return 0;
}
4.使用free释放一块动态内存的一部分
#include <stdlib.h>
int main()
{
int* p = (int*)malloc(40);
if (NULL == p)
{
return 1;
}
for (int i = 0; i < 5; i++)
{
*p = i;
p++;
}
free(p);
p = NULL;
return 0;
}
5.多次释放同一块内存空间
#include <stdlib.h>
int main()
{
int* p = (int*)malloc(40);
if (p == NULL)
{
return 1;
}
free(p);
//....
free(p);
//建议每次释放后将p置为NULL,防止出错
return 0;
}
6.忘记释放动态内存空间(内存泄露)
#include <stdio.h>
#include <stdlib.h>
void test()
{
int* p = (int*)malloc(40);
int flag = 0;
if (p == NULL)
{
return;
}
scanf("%d", &flag);
if (flag == 5)
{
//当flag等于5时,没有释放p的空间,且出了此函数后,p将无法访问,导致内存泄露
return;
}
free(p);
p = NULL;
}
int main()
{
test();
return 0;
}
在使用过程中常见的错误
返回栈区的地址
#include <stdio.h>
int* test()
{
int arr[10];
return arr;
}
//此时arr开辟在栈区,出了test函数arr自动销毁,返回arr的地址。
int main()
{
int* p = test();
//p接收了arr的地址,此时p相当于一个野指针
return 0;
}
没有使用二级指针来修改以及指针
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void test(int* p)
{
p = (int*)malloc(100);
}
//由于p是一级指针,传进去的参数也是一级指针,所以test中的p相当于main中p的一份拷贝,所以修改test中的p不能起到修改main中p的作用
int main()
{
int *p = NULL;
test(p);
strcpy(p,"Hello World!");
printf(p); //相当于printf("Hello World!");
return 0;
}
可以将上面的代码改为以下代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void teszt(int **p)
{
*p = (int*)malloc(100);
}
int main()
{
int *p = NULL;
test(&p);
if(p == NULL) //这一步是为了防止内存开辟时失败,p仍为NULL
{
return 1;
}
strcpy(p,"Hello World!");
printf(p);
return 0;
}