我正在处理多个变量的单行声明和初始化,并注意到在C中有些异常。
#include <stdio.h>
int main() {
int a, c, d, e = 0;
printf("a = %d, c = %d, d = %d, e = %d", a, c, d, e);
}
因此,上述程序的输出是
a = 2961408, c = 0, d = 4200720, e = 0
容易,因为e
被指定为0
和rest,它们都可能是垃圾值,但是c值为0。我把代码更改为
#include <stdio.h>
int main() {
int a, b, c, d, e = 0;
printf("a = %d, b = %d, c = %d, d = %d, e = %d", a, b, c, d, e);
}
这一次的产出是:
a = 2297856, b = 0, c = 4200736, d = 4200848, e = 0
第二个变量被初始化为0
b
,以前的c
以及e
和rest都是垃圾。
对于3
、4
、5
、6
、7
等变量,每次声明中的第二个变量与最后一个变量一起初始化值0
时,都会注意到同样的情况。
这不是初始化最后一个变量的情况,而是如果我在第二个变量之后给任何变量赋值0
。我的第二个变量获得0
作为初始化值。是我的编译器出了什么问题,还是在C中有一些逻辑?
#include <stdio.h>
int main() {
int a, b, c, d, e, g = 10, f;
printf("a = %d, b = %d, c = %d, d = %d, e = %d, g = %d, f = %d", a, b, c, d, e, g, f);
}
输出:
a = 3702784, b = 0, c = 4200752, d = 4200864, e = 6422400, g = 10, f = 4200752
我的C编译器是gcc (MinGW.org GCC Build-2) 9.2.0
发布于 2021-06-02 09:42:37
我的编译器有问题吗?
不是的。
或者这在C中有什么逻辑吗?
不是的。
读取未初始化的本地值会给出不确定的值。这就是所谓的未定义的行为--你首先需要理解的是这意味着什么。正如我在这里所写的,什么是未定义的行为,它是如何工作的?:
重要的是要调查行为不明确的原因,而不是症状。初学者通常会问,当他们做了一些没有定义的事情时,为什么会发生某种行为,但从调查结果中往往没有什么可学到的。最好把时间花在学习是什么导致了这种不确定的行为上。
现在,这是未定义行为的原因实际上是因为您没有使用那些未初始化的局部变量的地址,请参见这个答案:(为什么)使用未初始化的变量未定义的行为?,所以程序可能会崩溃。
撇开这个问题不谈,在许多系统上,不定值显示为打印任何碰巧存储在RAM中的随机位置的东西。RAM内存的工作方式,我们从不“删除”或“擦除”任何东西从它。我们只需跟踪使用的位置,然后当它们不再被使用时,不管存储在那里的是什么,都会被保留下来。
但是没有任何保证,所以优化的编译器也可以打印一些随机CPU寄存器的内容。再说一次,没有什么有意义的东西可以从中学习。你不妨掷一些骰子,然后找出你得到某些价值的原因。
一些糟糕的编译器利用“调试构建”,将整个RAM设置为零,因此在这样的系统上,您将得到所有的零。这是不好的,因为它隐藏了bug,直到您从调试切换到发布。
无论如何,从中学习到的唯一重要的东西是gcc/mingw会抱怨如果你使用-Wall
的话,非非独立变量。作为初学者,养成用以下方式编译的习惯:
gcc -std=c11 -pedantic-errors -Werror -Wall -Wextra
https://stackoverflow.com/questions/67801305
复制相似问题