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



我有:

#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: %fn", 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中不是全局或静态的变量不能保证初始化为任何特定值。

所以在之后

mat4f a;

a的元素的值可以是任何值。就C语言标准而言,读取那些未初始化的值会调用未定义的行为——任何事情都可能发生。

注释行显式地设置了元素值,使其按预期工作。

最新更新