我正在尝试使用一个分配复杂双数组的函数,执行一些操作并返回计算的最后一个值。虽然计算很好,但是当我尝试释放分配的空间时,我遇到了问题。在执行期间,我得到“双重释放或内存损坏”错误。我正在使用标准库。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <complex.h>
#include <assert.h>
double complex main()
{
// Declare fixed number of steps.
int number_of_elements=10;
// Reserve memory for array.
double complex *complexArray = calloc(number_of_elements,sizeof(double complex));
// Verify if allocation was successfull.
assert(complexArray!=NULL);
// Fill first position with number and start counting
complexArray[0]=1+2*I;
int i=0;
for (i=0;i<number_of_elements;i++)
{
complexArray[i+1]=2*complexArray[i]; // Simple operation
printf("The complex number stored in position %i is %f+i%f\n\n",i+1,creal(complexArray[i+1]),cimag(complexArray[i+1])); // Print the current number
}
double complex output=complexArray[i];
assert(complexArray!=NULL); // Check if pointer is not NULL again
free(complexArray); // Program fails here
complexArray=NULL;
return output;
}
我将数据类型从“double complex”更改为“double”并且它可以正常工作。有没有办法解放复杂的阵列?
答案 0 :(得分:4)
你写了你分配的记忆。最后一次循环迭代使用i=9
并写入complexArray[i+1]
,它不在您分配的范围内。 free()
本身似乎没有任何问题。
这样的问题应该可以用valgrind来发现。
答案 1 :(得分:0)
你的free()关于double complex * complexArray = calloc()看起来是正确的。请记住,数组从0开始从零开始,仔细检查索引,具体来说:
complexArray第[i + 1] = 2 * complexArray [I]; //操作简单
因为这会导致第一个输出为: 存储在位置1的复数
我想你的循环可能会抛出一个EXC_BAD_ACCESS。