C循环中的内存分配:错误munmap_chunk:无效的指针

问题描述

我写了一些测试代码来分配内存,并在释放pNumber变量时在valgrind上看到结果。

#include <stdlib.h>

int *pNumber = NULL;
static int s_array[10] = {0,1,2,3,4,5,6,7,8,9};

int main() {
    for(int i = 0; i < 10; i++) {
        pNumber = (int*) malloc(100);
        pNumber = &s_array[i];
    }
    free(pNumber);
    pNumber = NULL;
    
    return 0;
}

但是我得到“ munmap_chunk():无效的指针”的错误,尤其是 pNumber =&s_array [i] 导致该错误。但是,当我将其更改为* pNumber = s_array [i] 时,无效的指针错误就消失了。

 for(int i = 0; i < 10; i++) {
        pNumber = (int*) malloc(100);
        *pNumber = s_array[i];
    }

我很好奇为什么pNumber =&s_array [i]会导致该错误

我以为我要释放已通过malloc分配的指针?

解决方法

在第一种情况下,程序具有未定义的行为。

您正在尝试释放未分配的内存。

free(pNumber);

因为指针pNumber指向具有静态存储持续时间的内存。

pNumber = &s_array[i];

至此声明

*pNumber = s_array[i];

然后通过表达式pNumber的值设置s_array[i]指向的对象,并且指针本身未重新分配。它指向动态分配的内存。因此,您可以使用指针释放分配的内存。

在第一种情况下,您将重新分配指针本身,从而失去动态分配的内存的地址,并尝试以静态存储持续时间释放对象。结果是内存泄漏和未定义的行为。

在第二种情况下,您只需为分配的内存设置一个值。因此,该程序只会产生大量内存泄漏。