在C中动态分配内存时出错

时间:2011-04-15 06:01:02

标签: c memory-management

我正在尝试计算NxN矩阵的行列式。这段代码在我尝试动态分配内存的行中给出了错误。

  

错误:无法将类型为“int”的值分配给“float *”

类型的实体      

错误:无法将类型为“int”的值分配给“float **”类型的实体

double CalcDeterminant( float **mat, int order)
{
    float **minor;
    unsigned short i;
    float det = 0;
    // order must be >= 0
    // stop the recursion when matrix is a single element
    if( order == 1 )
        return mat[0][0];

    // the determinant value
    // allocate the cofactor matrix

    **minor = malloc((order-1) * sizeof(float *));
    for(i=0;i<order-1;i++)
        minor[i] = malloc((order-1) * sizeof(float));**

    //float *mat2d = malloc( rows * cols * sizeof( float ));
    for(i = 0; i < order; i++ )
    {
        // get minor of element (0,i)
        GetMinor( mat, minor, 0, i , order);
        // the recusion is here!

        det += (i%2==1?-1.0:1.0) * mat[0][i] * CalcDeterminant(minor,order-1);
        //det += pow( -1.0, i ) * mat[0][i] * CalcDeterminant( minor,order-1 );
    }

    // release memory
    for(i=0;i<order-1;i++)
        free(minor[i]);
    free(minor);
    return det;
}

2 个答案:

答案 0 :(得分:5)

您需要添加第#include <stdlib.h>行,以便正确声明malloc()

目前,编译器非常宽松(C89模式)并允许隐式函数声明,因此当编译器遇到malloc()时,它假定它是一个返回int的函数而不是正确的void *

您需要更改编译选项,直到编译器更大声抱怨。例如,如果您使用GCC,则应考虑:

gcc -std=c99 -Wall -Wextra -Wstrict-prototypes -Wmissing-prototypes ...

您可能更喜欢甚至需要使用-std=gnu99代替-std=c99;在使用C99核心语言的同时实现了许多扩展。但是在这些方面使用选项并确保没有编译警告是良好的纪律。使用-Werror强制执行纪律;它会将编译器的任何警告消息转换为错误,因此编译失败。

答案 1 :(得分:3)

您需要包含头文件stdlib.h