为什么局部变量结构在离开其范围时不会重置?

Eri*_*oma 0 c struct chess

我正在写一个国际象棋引擎并获得伪随机移动,我传递一个移动生成函数和一个数组来填充.这是一些代码:

...

else if(pstrcmp(input, (char*)"check", 5)){
            int checkIndex = getIndex(input[6], input[7] - 49);
            printf("checkindex %i\n", checkIndex);
            if(!(checkIndex < 0 || checkIndex > 127)){
                //we've received a valid check
                struct m mUn[MOVE_BUFF];
                gen_psm(checkIndex, mUn);
                int i = 0;
                while(mUn[i].start != mUn[i].end && i < MOVE_BUFF){
                    printf("%s\n", GSQ(mUn[i].end));
                    i++;
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

...

第一行只是一些输入检查.代码的内容在struct m mUn[MOVE_BUFF]while循环之间.所以我创建了一个struct m数组,我创建了一个数组,它包含一些指定特定移动的整数,然后我传递给它,gen_psm其中需要检查方形的索引和要填充的数组.它为数组填充了位于索引处的片段的有效移动.第一步,精致和花花公子.然后我尝试第二步,我发现数组从第一步开始仍然有数据,即使我已经退出了我声明它的mUn的范围.结构的某些性质是否会保留其数据?我是否需要填充整个事物(当我尝试它时似乎充满了0).如果我需要0填充它,是否有更快的方法(如果我必须0填充它几亿次,这是一个问题)?

Ed *_* S. 7

标准中没有任何内容可以保证已经更改了已保留范围的局部变量的内存,这只是未定义的行为来读取它.编译器可以将其归零,也可以不归零,它可以在其开头插入笑脸.没有具体说明变量超出范围后该内存位置会发生什么.

简单地声明一个数组可以确保为它保留空间,但它不会初始化每个成员.您可以memset或者只是在循环中初始化每个.