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

C Allocating Memory in Loop: Error munmap_chunk(): invalid pointer

我写了一些分配内存的测试代码,并在释放 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];

然后它用表达式 s_array[i] 的值设置 pNumber 指向的对象,并且指针本身没有被重新分配。它指向动态分配的内存。所以你可以使用指针来释放分配的内存。

在第一种情况下,您重新分配指针本身会丢失动态分配内存的地址,并尝试释放具有静态存储持续时间的对象。因此存在内存泄漏和未定义的行为。

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