c - 函数返回二维指针无法从中获取值

标签 c pointers

<分区>

我有一个像这样返回逆矩阵的函数:

double** inverse(double (**data)) {

    double result[2][2];
    result[0][0] =  data[1][1] /  (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
    result[0][1] = -data[0][1] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
    result[1][0] = -data[1][0] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
    result[1][1] = data[0][0] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);

    return result;
}

我检查了结果中的值,它们是正确的。然后:

    double** s = inverse(gama[FreIdx]);

    printf("%f\n", s[0][0]);

我得到了异常。读取位置0x0时发生访问冲突......我对C不是很熟悉。谁能告诉我发生了什么?

最佳答案

您正在逆向静态地创建一个矩阵,这意味着它将驻留在该函数调用的堆栈帧内。然后你返回那个矩阵的地址,但是一旦你返回函数,它的栈帧就可以被覆盖。
您需要动态分配矩阵,并记得在不需要时尽快释放它。

double** inverse(double data[][2]) {

    double **result = malloc(sizeof(double*) * 2);
    result[0] = malloc(sizeof(double) * 2);
    result[1] = malloc(sizeof(double) * 2);

    result[0][0] =  data[1][1] /  (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
    result[0][1] = -data[0][1] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
    result[1][0] = -data[1][0] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
    result[1][1] = data[0][0] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);

    return result;
}

并释放它:

double **inv = inverse(mat);
free(inv[0]);
free(inv[0]);
free(inv);

注意:最好创建一个析构函数来负责释放内部数组和外部数组。将 NULL 放入 inv(您刚刚释放)也是一种很好的做法,以捕获释放后的潜在用法。

关于c - 函数返回二维指针无法从中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45253885/

相关文章:

c - 非阻塞读函数

c - EXC_BAD_ACCESS 创建子节点(C)

c++ - char 指针,使用 cin.getline 读取?

c - 为什么这个指针解除引用的例子有效?

C++ std::vector 的指针删除和段错误

c - MSP430:__delay_cycles() 很慢/MCLK 可能很慢

c - 为什么 tm_mday 从 1 开始,而 struct tm 的所有其他元素都从 0 开始?

将 4 个整数拼接成一个整数

C++如何仅在没有其他人直接或间接引用该指针时删除对象指针

c - 在C中传递函数还是传递函数指针?