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

C在循环中分配内存:错误munmap_chunk():指针无效,c,memory-leaks,dynamic-memory-allocation,undefined-behavior,C,Memory Leaks,Dynamic Memory Allocation,Undefined Behavior,我编写了一个分配内存的小测试代码,当我释放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变量时,就可以在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;
}
#包括
int*pNumber=NULL;
静态int s_数组[10]={0,1,2,3,4,5,6,7,8,9};
int main(){
对于(int i=0;i<10;i++){
pNumber=(int*)malloc(100);
pNumber=&s_数组[i];
}
免费(pNumber);
pNumber=NULL;
返回0;
}
但是我得到了“munmap\u chunk():无效指针”的错误,特别是pNumber=&s\u数组[I]导致了错误。但是,当我将其更改为*pNumber=s_array[I]时,无效指针错误消失了

 for(int i = 0; i < 10; i++) {
        pNumber = (int*) malloc(100);
        *pNumber = s_array[i];
    }
for(int i=0;i<10;i++){
pNumber=(int*)malloc(100);
*pNumber=s_数组[i];
}
我只是好奇为什么pNumber=&s_数组[I]会导致这个错误


我以为我正在释放分配给malloc的指针?

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

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

free(pNumber);
因为指针
pNumber
指向具有静态存储持续时间的内存

pNumber = &s_array[i];
至于这句话,

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

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


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

首先分配内存,结果将是一个可以释放的指针。然后用另一个地址覆盖此地址。free()自然会在for循环中失效,我应该在处理完它后立即释放内存吗?还是有办法将内存释放到循环外部?@Lebronfan23在循环外部,您只能释放最后分配的内存,因为在循环内部,指针在循环的每次迭代中被重新分配,先前分配的内存地址将丢失。换句话说,为了能够将内存释放到外部在循环中,您需要将指向内存的指针存储在某个位置(例如在指针数组中)。