在初始化任何自动变量之前使用它
Use of any automatic variable before it has been initialized
我正在阅读维基百科上关于未定义行为的文章。
在C语言中,在自动变量初始化之前使用它会产生未定义的行为
然而,这个答案说,对于字符类型是可以的。维基百科错了吗?
在C(我不知道c++)中,类型unsigned char
是唯一保证所有可能的位表示具有特定值的类型。没有陷阱表示,没有无效值,没有填充位,什么都没有(与其他类型不同)。
然而,由于某种原因,使程序依赖于未知的位模式是一个坏主意。
未定义的行为并不意味着是非法的或者你的程序会在这里崩溃
如果你使用一个未初始化的变量(如果你分配了一个基本类型变量而没有给它赋值,字符类型是一种特殊的基本类型),那么这个值就是不确定的。它可以是任何东西。您可能不介意它可以是任何东西,因为例如,您可以稍后赋值,可能只是在某些情况下。
然而,当您读取变量的值并根据这个未初始化的值做出进一步的决定时,情况就变得严重了,例如在以下条件中:int x;
if (x > 0) {
...
} else {
...
}
这会把你带到这里。
你链接的答案说的是以下内容是完全正确的:
int x;
if (someCase) {
x = ...
} else {
...
}
// later:
if (someCase) {
// read x
}
相关文章:
- 为什么C++有不同的变量初始化方式?
- 静态 constexpr 成员变量初始化
- C++不同的变量初始化
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 是变量初始化失败吗?
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 类静态变量初始化顺序
- 使用 constinit 变量初始化 constexpr 变量
- 是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
- 使用全局变量初始化不同编译单元中的其他全局变量
- 使用默认构造函数引用成员变量初始化错误
- 宏的 if 语句中的变量初始化
- 不稳定的C :每行适应性变化多变量初始化
- 同一函数中的静态函数变量初始化顺序
- C 语言中的静态变量初始化
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量
- 类POD成员变量初始化
- 尝试捕获类变量初始化的范围
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 多变量初始化编译器支持