Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.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/5/url/2.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++比较陌生。我在同一天上了一门课程。 在使用其内置编译器(GNU GCC v7.1.1)学习指针时,我发现了一个非常不寻常的行为(在下面的观察部分中说明),我无法理解_C++_Pointers - Fatal编程技术网

C++;无法理解未分配指针的行为 我对C++比较陌生。我在同一天上了一门课程。 在使用其内置编译器(GNU GCC v7.1.1)学习指针时,我发现了一个非常不寻常的行为(在下面的观察部分中说明),我无法理解

C++;无法理解未分配指针的行为 我对C++比较陌生。我在同一天上了一门课程。 在使用其内置编译器(GNU GCC v7.1.1)学习指针时,我发现了一个非常不寻常的行为(在下面的观察部分中说明),我无法理解,c++,pointers,C++,Pointers,我执行了以下场景,试图得出一些具体的推论- 情景1 代码- int main () { int *ptr; cout << "The value of ptr is " << ptr; return 0; } int main(){ int*ptr; cout您的所有观察结果都是无效的。您无法读取未初始化且未分配有效值的int*。如果您这样做,您在所有情况下都会尝试打印指针值,那么程序的行为(而不仅仅是输出)未被C++语言定义定义。你不能理解未

我执行了以下场景,试图得出一些具体的推论-

情景1

代码-

int main () {
   int  *ptr;
   cout << "The value of ptr is " << ptr;
   return 0;
}   
int main(){
int*ptr;

cout您的所有观察结果都是无效的。您无法读取未初始化且未分配有效值的
int*
。如果您这样做,您在所有情况下都会尝试打印指针值,那么程序的行为(而不仅仅是输出)未被C++语言定义定义。

你不能理解未分配指针的行为,因为它的行为不是由C++定义的。


这就是为什么如果不想在声明时对其进行初始化,则应始终将新指针设置为NULL或nullptr。

未定义的行为是未定义的。很简单:未初始化的本地(和非静态)变量实际上是未初始化的。它们将有一个不确定的值。使用它们,除了分配给它们之外,会导致错误。事实上,这就是全部。试图争论UB是毫无意义的。总而言之,你不能做你正在做的事。你的代码格式不正确,可以做任何事情,从看起来正常工作到给出一些识别不可识别或不可识别的输出或分段错误--由您选择。如果您的变量未初始化--您不允许尝试查看它…是的,指针只是一个变量,它将其他对象的地址作为其值。可能是太晚的重复,这已经发生了--但我认为我们得到了一个漂白金黄色的奇多。初始化但是,指向
nullptr
NULL
是过时的,因为C++11)的指针通常是不够的,您可能只是用一种未定义的行为(读取未初始化的指针值)来交换另一种(取消引用
nullptr
)@ChristianHackl这很有趣,我原以为会产生编译器错误,但事实并非如此。因此
nullptr
仅用于防止意外访问内存,其他程序或操作系统可能已经在使用这些内存。如果初始化指向
nullptr
的指针还不够,是否有“保存”选项声明指针而不指定值的方法?
nullptr
不用于“阻止”任何内容。它是一个有效的指针值,表示“指针不指向对象”,这与“未定义指针的含义”不同。因此,与未初始化的指针不同,您可以安全地将
nullptr
与其他指针进行比较,并且可以安全地打印其值。您只是无法取消引用它(因为这是未定义的行为).至于你的最后一个问题,不,在如此低的级别上,任何技术技巧都无法实现真正的安全;使用指针的安全是通过更高级别上的程序逻辑实现的。
int main () {
   int a =20;
   int  *ptr;
   cout << "The value of ptr is " << ptr;
   return 0;
}   
int main () {
   int a =20;
   int  *ptr;
   cout<<"The address of a is "<<&a<<"\n";
   cout << "The value of ptr is " << ptr;
   return 0;
}