Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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++_C_Pointers - Fatal编程技术网

C++ 为什么这个指针没有给我一个垃圾值

C++ 为什么这个指针没有给我一个垃圾值,c++,c,pointers,C++,C,Pointers,在我的代码中,我递增*p的地址,该地址不包含任何值。所以,为什么这个p变量不返回垃圾值呢 #include <stdio.h> int main() { int a=4; int *p=&a; p++; printf("%d ",*p); return 0; } #包括 int main() { INTA=4; int*p=&a; p++; printf(“%d”,*p); 返回0; } 因为您增加的是指针,而不

在我的代码中,我递增*p的地址,该地址不包含任何值。所以,为什么这个p变量不返回垃圾值呢

#include <stdio.h>
int main()
{
    int a=4;
    int *p=&a;
    p++;
    printf("%d ",*p);

    return 0;
}
#包括
int main()
{
INTA=4;
int*p=&a;
p++;
printf(“%d”,*p);
返回0;
}
因为您增加的是指针,而不是指针指向的值

然后*p在a之后指向内存。那个地方在堆栈上,你可以在那里找到一些随机(?)值


在a后面定义另一个变量b和其他值,您很可能会看到该值。

它返回的是垃圾值

 468024888
为什么这个指针没有给我一个垃圾值

 468024888
可能是的。程序的行为未定义

我建议你想想为什么你认为你没有得到垃圾值。这会让你有更深的理解


请注意,从技术上讲,不能保证获得垃圾值。完全有可能根本没有输出,或者程序崩溃或其他任何情况。但是,如果您确实获得了输出,它将是垃圾。

这是一个未定义的行为,因此它可能会向您显示一些看似有效但却无效的值。 这里是
未定义行为的元素

没有“垃圾”值。根据C++标准,包含未定义行为的程序具有…好未定义的行为。输出可以是任何东西

你不能保证得到任何有意义的输出。不过,这并不意味着你得到的输出肯定是毫无意义的(或“垃圾”或任何你想称之为垃圾的东西)

它可以是
4
,因为
a
保存该值,它可以是
4
,因为该值恰好位于某个寄存器中。您无法通过只查看代码和输出来说明为什么会得到输出。这是因为C++标准没有指定程序在运行时在无效引用指针时的操作(即当您的代码调用未定义的行为时,任何事情都可能发生)。 如果您想知道输出的实际来源,可以查看程序集。对于更简单的代码:

int main() {
    int* p;
    return *p;
}
:


当运行代码时,它会检测故障。这是一种可能的结果。给定该代码,其他任何东西都是可能的。

0
是一个垃圾值(就像
1
42
-7621803
,…)是什么让你认为它输出的数字不是垃圾?你超出了
a
的范围,这会导致未定义的行为。一旦你有了未定义的行为,你的整个程序就无效了。你所做的可能会打印一个看似随机的值(其中
0
是一个有效值),可能会导致你的程序崩溃,也可能会使你的计算机起火或勒死你的猫。你为什么期望一个“垃圾值”?什么是“垃圾值”?您的代码调用未定义的行为。坦率地说,期望以某种方式输出是愚蠢的。未定义的行为是未定义的。如果有人告诉你,你应该得到一些垃圾值,这些值具有某些属性,可以称为“垃圾”,他们是在告诉你没有垃圾编号。假设我们有一个垃圾编号列表和一个非垃圾编号列表。最小的垃圾号有一个有趣的特性,就是它是最小的垃圾号,所以它不能是垃圾,所以它可以被移动到非垃圾列表中。现在有了一个新的“最低垃圾数量”,请再次阅读问题。OP知道会发生这种事,也许不会?什么才是“垃圾”?你可以在那里放任何号码。因为行为是未定义的,所以您收到的任何值都是垃圾。