Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:未初始化变量垃圾 int-myInt; 我可以运行我的程序吗,myInt获取地址0x1234,我像上面一样输出它->1234 这只是随机的垃圾吗_C++_Memory_Memory Management_Ram - Fatal编程技术网

C++ C++;:未初始化变量垃圾 int-myInt; 我可以运行我的程序吗,myInt获取地址0x1234,我像上面一样输出它->1234 这只是随机的垃圾吗

C++ C++;:未初始化变量垃圾 int-myInt; 我可以运行我的程序吗,myInt获取地址0x1234,我像上面一样输出它->1234 这只是随机的垃圾吗,c++,memory,memory-management,ram,C++,Memory,Memory Management,Ram,其值是不确定的。(§8.5/9) 试图从中获取有意义的数据是没有用的。实际上,它只是发生在那里的任何事情 大多数编译器都会将“有意义的”调试数据打包到调试版本中。例如,MSVC将初始化为0xCCCC。当然,这会在优化的构建中被删除。“随机垃圾”但强调“垃圾”而不是“随机”“随机”–也就是说,绝对任意垃圾,甚至没有任何“随机性”的保证–编译器和运行时系统可以在那里拥有绝对的任何东西(一些系统可能总是给出零,其他系统可能给出任意不同的值,等等。)整数是堆栈上的一个变量,因为它是一个局部变量。只要尚未

其值是不确定的。(§8.5/9)

试图从中获取有意义的数据是没有用的。实际上,它只是发生在那里的任何事情


大多数编译器都会将“有意义的”调试数据打包到调试版本中。例如,MSVC将初始化为0xCCCC。当然,这会在优化的构建中被删除。

“随机垃圾”但强调“垃圾”而不是“随机”“随机”–也就是说,绝对任意垃圾,甚至没有任何“随机性”的保证–编译器和运行时系统可以在那里拥有绝对的任何东西(一些系统可能总是给出零,其他系统可能给出任意不同的值,等等。)

整数是堆栈上的一个变量,因为它是一个局部变量。只要尚未初始化,堆栈上的数据就保持原样。它是(的一部分)以前使用过的数据。因此它是垃圾,但它不是随机的,因为给定了可执行文件和开始状态,值是可预测的。预测很困难,因为您必须考虑操作系统、编译器等,而且它是毫无意义的。

甚至不能保证它是一个值。尝试读取int,任何事情都可能发生pen(如发送的导致程序终止的信号)。在现实编程中,打开未初始化的
bool
会导致您既不符合
true
也不符合
false
的情况,这一点尤为重要

程序A已关闭,它在0x1234处有一个值为1234的int->我运行我的程序,myInt获取地址0x1234


还要注意的是,由于现代操作系统中的虚拟内存,被称为地址0x1234的程序实际上不太可能引用物理内存中与被称为地址0x1234的程序相同的空间。

难道没有安全意识强的操作系统可以初始化所有的初始化内存,这样您就看不到程序留下了什么吗另一个进程或另一个用户?垃圾,是的,但特别是对于比“随机”更危险的堆栈变量。由于该值是由以前的执行路径决定的,因此最终会出现非常奇怪的错误。@Paul:如果操作系统以这种方式运行,最终还是会出现垃圾。垃圾与其他进程/用户无关。0xCCCC很有趣,因为在x86中,0xCC是调试中断(int3)因此,如果程序试图从单元化内存执行指令(比如由于缓冲区溢出或其他类似的错误),它会立即进入调试器,允许附加调试器、转储内核或其他类似的依赖操作系统的函数。我不确定第一部分是否正确。当然int的值是不确定的,但它在堆栈上有一个定义良好的位置,程序可以合法访问,因此我看不到任何情况哪个访问它是未定义的行为。@泰勒标准说,如果它没有初始化,它就是未定义的行为(见4.1/1)它可能包含任何位模式,包括陷阱表示。它会如何分割。我很难相信这个部分。理论上,未定义的行为会导致任何事情发生。因此,如果LITB是正确的,它是UB,它可能会分段。但是,我很难找到C++标准中的什么地方。is UB.4.1.1谈到UB用于将未初始化对象转换为右值,但它似乎不适用于基本类型,3.9.6证实了他所说的bools,但不适用于int。@Tyler为什么它不适用于基本类型?另外,3.9.1/6也不证实我所说的。这只是一个非标准的脚注。4.1/1是共同的n验证我所说的。@Tim,当您有未定义的行为时,任何事情都可能发生。如果int包含某个位模式,并且读取时该模式被定义为无效(未映射为整数值),则操作系统可能会终止您的程序。有些系统具有此类模式,称为“陷阱表示”。请阅读:。请解释您的否决票。任意垃圾绝对是更好的描述
int myInt;
cout << myInt; // Garbage like 429948, etc