盘点常见的动态内存的错误

目录

常见的动态内存的错误:

1.对空指针的解引用操作

前提须知:

正确写法:

 2.对动态开辟空间的越界访问

3.对⾮动态开辟内存使⽤free释放

 4.使⽤free释放⼀块动态开辟内存的⼀部分

5.对同⼀块动态内存多次释放 

解决办法:

6.动态开辟内存忘记释放(内存泄漏)



盘点常见的动态内存的错误_第1张图片

常见的动态内存的错误:

1.对空指针的解引用操作

前提须知:

malloc、calloc、realloc在开辟/调整 空间失败的时候,返回NULL

如果在使用以上函数后没有进行是否是空指针的判断,很有可能会导致解引用空指针。

int main()
{
    int *p = (int*)malloc(10 * sizeof(int));
    int i = 0;
    for (i = 0; i <10; i++)
  {
    *(p + i) = i;
  }
 
    for (i = 0;i < 10; i++)
  {    
    printf("%d",p[i]);
    return 0;
  }
 
     return 0;
}

没有进行判断释放返回的地址是否是空指针NULL,然后直接使用解引用,而这样很有可能操作失误

正确写法:

int main()
{
     int *p = (int*)malloc(10 * sizeof(int));
     if (p == NULL)
   {
     perror("malloc");
     return 1;
   }
    int i = 0;
    for (i = 0; i <10; i++)
  {
    *(p + i) = i;
  }
 
    for (i = 0;i < 10; i++)
  {    
    printf("%d",p[i]);
    return 0;
  }
 
     return 0;
}

 如果不进行判断,编译器也会发出警告

 2.对动态开辟空间的越界访问

盘点常见的动态内存的错误_第2张图片

 20个字节,在赋值时变成了20个元素,导致越界访问,最后会导致程序崩溃。

盘点常见的动态内存的错误_第3张图片

 不过编译器在过程中并没有报错

3.对⾮动态开辟内存使⽤free释放

void test()
{
int a = 10;
int *p = &a;
free(p);
}

 运行后程序会崩溃

盘点常见的动态内存的错误_第4张图片

 4.使⽤free释放⼀块动态开辟内存的⼀部分

void test()
{
int *p = (int *)malloc(100);
p++;
free(p);//p不再指向动态内存的起始位置
}

 现在的p指向的不是起始位置,而释放申请的空间一定是从起始位置开始释放的

5.对同⼀块动态内存多次释放 

void test()
{
int *p = (int *)malloc(100);
free(p);
free(p);//重复释放
}

 盘点常见的动态内存的错误_第5张图片

 多次释放也会崩溃

解决办法:

在free(p)后立马输入p=NULL就算多次释放也没有问题

void test()
{
int *p = (int *)malloc(100);
free(p);
p = NULL;
free(p);//重复释放
}

6.动态开辟内存忘记释放(内存泄漏)

void test()
{
int *p = (int *)malloc(100);
if(NULL != p)
{
*p = 20;
}
}
int main()
{
test();
while(1);
}
  • 忘记释放不再使⽤的动态开辟的空间会造成内存泄漏。
  • 切记:动态开辟的空间⼀定要释放,并且正确释放。

你可能感兴趣的:(C语言,数据存储,java,算法,c语言,数据存储)