使用free()和动态分配的复杂指针

时间:2015-11-27 00:51:58

标签: c

我正在尝试使用一个分配复杂双数组的函数,执行一些操作并返回计算的最后一个值。虽然计算很好,但是当我尝试释放分配的空间时,我遇到了问题。在执行期间,我得到“双重释放或内存损坏”错误。我正在使用标准库。

这是我的代码:

#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”并且它可以正常工作。有没有办法解放复杂的阵列?

2 个答案:

答案 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。