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

0 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;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 5

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

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

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

gcc -std=c99 -Wall -Wextra -Wstrict-prototypes -Wmissing-prototypes ...
Run Code Online (Sandbox Code Playgroud)

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