我为数组I调用test分配空间,它将具有double类型的(2 * n + 1)个元素。我填充数组,最后我释放()它。但如果我使用free(),我会收到一个错误:“double free or corruption(out):0x0000000000000f1dc20”。如果我评论free(),代码就会运行。我无法发现这个问题。
using namespace std;
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
long n=512; //grid size
double *test;
int main()
{
test = (double*) malloc(sizeof(double) * (2*n+1));
for (long j=-n;j<=n;j++)
{
test[j] = double(j);
}
free(test); //<--- gives me error if I use this
return 0;
}
答案 0 :(得分:3)
不,那就是不行。
为2n的双精度数组分配足够的空间,但C定义范围为[0..2n-1]的数组索引。您不能随意决定使用[-n .. + n]访问元素。正如评论中已经描述的那样,它是未定义的行为。
如果你需要做你似乎正在做的事情,你将不得不为所有访问使用偏移量,例如:
test[j+n] = double(j);
然后你有更好的机会不破坏你的堆结构,从而从你的C和/或OS内存管理器那里得到恼人的错误消息。