这里写目录标题
一、内存操作错误
1.对NULL指针的解引用操作
void test()
{
int *p = (int *)malloc(INT_MAX/4);
*p = 20;//如果p的值是NULL,就会有问题
free(p);
}
这里是p通过malloc函数申请空间,如果是申请的内存空间太大所申请的内存空间就为空,就不能存放东西。
2.对动态开辟空间的越界访问
void test()
{
int i = 0;
int *p = (int *)malloc(10*sizeof(int));
if(NULL == p)
{
exit(EXIT_FAILURE);
}
for(i=0; i<=10; i++)
{
*(p+i) = i;//当i是10的时候越界访问
}
free(p);
}
3.对非动态开辟内存使用free释放
void test()
{
int a = 10;
int *p = &a;
free(p);//ok?
}
这里没有进行申请空间,所以不能用free释放
4. 使用free释放一块动态开辟内存的一部分
void test()
{
int *p = (int *)malloc(100);
p++;
free(p);//p不再指向动态内存的起始位置
}
找不到释放的头,无法释放申请的空间
5.对同一块动态内存多次释放
void test()
{
int *p = (int *)malloc(100);
free(p);
free(p);//重复释放
}
6.动态开辟内存忘记释放(内存泄漏)
void test()
{
int *p = (int *)malloc(100);
if(NULL != p)
{
*p = 20;
}
}
int main()
{
test();
while(1);
}
长时间不释放内存,会让内存泄漏导致电脑卡死
二、内存经典题
1.
void GetMemory(char *p) {
p = (char *)malloc(100);
}
void Test(void) {
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
解析:内存泄漏,程序崩了,因为 GetMemory 并不能传递动态内存,而且 GetMemory 里面的空间也释放不了; Test 函数中的 str 一直都是NULL。 strcpy(str, “hello world”);将使程序崩溃。
2.
char *GetMemory(void) {
char p[] = "hello world";
return p; }
void Test(void) {
char *str = NULL;
str = GetMemory();
printf(str);
}
可能是乱码,因为p是一个局部变量,当它出这个函数之后,会销毁该地址下的内容。
3.
void GetMemory(char **p, int num) {
*p = (char *)malloc(num);
}
void Test(void) {
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
这里没有进行内存释放,会造成内存泄漏
4.
void Test(void) {
char *str = (char *) malloc(100);
strcpy(str, "hello");
free(str);
if(str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
在中途已经将str使用free释放,导致后续str是一个野指针非常危险