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
指向的对象,并且指针本身没有被重新分配。它指向动态分配的内存。所以你可以使用指针来释放分配的内存。
在第一种情况下,您重新分配指针本身会丢失动态分配内存的地址,并尝试释放具有静态存储持续时间的对象。因此存在内存泄漏和未定义的行为。
在第二种情况下,您只需为分配的内存设置一个值。所以程序只会产生大量的内存泄漏。
我写了一些分配内存的测试代码,并在释放 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
指向的对象,并且指针本身没有被重新分配。它指向动态分配的内存。所以你可以使用指针来释放分配的内存。
在第一种情况下,您重新分配指针本身会丢失动态分配内存的地址,并尝试释放具有静态存储持续时间的对象。因此存在内存泄漏和未定义的行为。
在第二种情况下,您只需为分配的内存设置一个值。所以程序只会产生大量的内存泄漏。