c - 尝试编写一个采用特定长度数组的函数,得到奇怪的不一致结果而没有错误

标签 c linux

我有:

#include <stdio.h>

typedef float mat4f[16];

void logMat(mat4f in) {
    int i;
    for (i=0; i<16; i++) {
        //in[i] = i; //uncomment this line and it works as expected
        printf("%2d: %f\n", i, in[i]);
    }
}

int main(void) {

    mat4f a;
    logMat(a);

    return 0;
}

当我运行它时,索引 4 和 12 处的元素经常出现损坏。 一些例子:

 0: 0.000000
 1: 0.000000
 2: 0.000000
 3: 0.000000
 4: -0.019316
 5: 0.000000
 6: 0.000000
 7: 0.000000
 8: 0.000000
 9: 0.000000
10: 0.000000
11: 0.000000
12: -0.000000
13: 0.000000
14: 0.000000
15: 0.000000

 0: 0.000000
 1: 0.000000
 2: 0.000000
 3: 0.000000
 4: 894113943650304.000000
 5: 0.000000
 6: 0.000000
 7: 0.000000
 8: 0.000000
 9: 0.000000
10: 0.000000
11: 0.000000
12: 0.002546
13: 0.000000
14: 0.000000
15: 0.000000

我多次运行它会得到不同的结果。 但是,如果我取消注释您将在源代码中看到的那一行,它每次都会按预期工作。

谁能发现我的错误?为什么索引 4 和 12?

我有点想按照这里的建议去做:stackoverflow.com/a/1810295/1472246

最佳答案

您发现了 C 的一个特性。尽管它通常是棘手错误的来源。

问题是线路:

mat4f a;

它只为变量a保留空间。它实际上并没有将其设置为任何值。所以 a 将具有之前存在的数据的值。它通常为零,但有时会是其他值。

a 也设置为零的一种方法是使用初始化程序声明它:

mat4f a = {0};

关于c - 尝试编写一个采用特定长度数组的函数,得到奇怪的不一致结果而没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23031212/

相关文章:

linux - Linux 文件中缺少 EOL 字符

c - 在 Opencl 中 clGetDeviceIDs 返回错误 CL_OUT_OF_HOST_MEMORY

c - 此示例中的 printf 语句是否调用未定义的行为?

c - C 中函数参数的自省(introspection)是否可能?

c - 未定义对另一个库函数的引用

linux - 从 CSV 数据值中删除回车符

c++ - 使用 Monit 监控 C++ 多线程进程

c - 指向接受常量和非常量参数的函数的指针

c - kbhit 和函数的多次调用

linux - 查找连接到 Linux 机器的所有存储设备