gpt4 book ai didi

c - 未初始化的值是由堆栈分配矩阵 mult 创建的

转载 作者:行者123 更新时间:2023-11-30 16:32:18 25 4
gpt4 key购买 nike

我有这个矩阵乘法函数,标准三重 for 循环。输入是指向两个结构的指针(如函数下方所示)。函数名称位于第 125 行(第 126 行是 { )。它输出正确的数字,并在多个输入上进行测试。然而 valgrind 不喜欢它。

void matrix_mult(matrix_t* matrix_1, matrix_t* matrix_2)
{
int** mult;
mult = calloc(matrix_1 -> height, sizeof(int*));
for (int i; i < (matrix_1 -> height); ++i)
{
mult[i] = calloc(matrix_2 -> width, sizeof(int));
for (int j = 0; j < (matrix_2 -> width); ++j)
{
for (int k = 0; k < (matrix_1 -> width); ++k)
{
mult[i][j] += (matrix_1 -> array[i][k]) * (matrix_2 -> array[k][j]);
}
}
free(matrix_1 -> array[i]);
}
free(matrix_1 -> array);
matrix_1 -> array = mult;
matrix_1 -> width = matrix_2 -> width;
}

matrix_t 是这个结构:

struct matrix
{
int height;
int width;
int** array;
};

valgrind 输出为:

==837== Conditional jump or move depends on uninitialised value(s)
==837== at 0x400ED5: matrix_mult (main.c:129)
==837== by 0x400F84: main (main.c:153)
==837== Uninitialised value was created by a stack allocation
==837== at 0x400D6C: matrix_mult (main.c:126)

同样适用于:

matrix_mult (main.c:131)
matrix_mult (main.c:131)
matrix_mult (main.c:136)
matrix_mult (main.c:139)

最佳答案

上面的代码片段存在多个问题。

  • for (int i; i < (matrix_1 -> height); ++i)这里i未初始化,这是一个问题 i将包含一个随机(垃圾)值。这样,可能会进入循环,也可能不会进入循环。
  • 您似乎假设对 calloc 的调用会成功的。需要进行错误检查。检查是否calloc返回NULL,如果是,则处理错误。
  • 冗余代码。

    mult = calloc(matrix_1 -> height, sizeof(int*));
    for (int i; i < (matrix_1 -> height); ++i)`
    {
    mult[i] = calloc(matrix_2 -> width, sizeof(int));
    // some code
    }

一旦您修复了不熟悉的问题 i第一次调用calloc (在进入循环之前)是浪费的,除非 struct 中的数据使得函数 matrix_mult旨在被调用但没有进入循环,这会很奇怪(?!)。

关于c - 未初始化的值是由堆栈分配矩阵 mult 创建的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50212614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com