Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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++ 为什么在下面的代码中将内存分配给*p_C++_C_Gcc - Fatal编程技术网

C++ 为什么在下面的代码中将内存分配给*p

C++ 为什么在下面的代码中将内存分配给*p,c++,c,gcc,C++,C,Gcc,在下面的程序中尝试过,当我们声明指针变量时,创建了一个引用,需要显式分配内存。无法理解下面的程序工作的原因。p是怎么得到记忆的 int *p,b; *p = 4; printf("%d\n", *p); 没有为您创建内存,您正在使用。指针p是创建的,但它的值是什么,大家都在猜测。您很幸运没有遇到运行时错误 根据你的评论 但当我删除变量b时,我得到了预期的分段错误。上面的程序我尝试了不同的数字。工作正常 这清楚地表明您有未定义的行为。添加或删除变量不应导致segfault将指针保留为未初始

在下面的程序中尝试过,当我们声明指针变量时,创建了一个引用,需要显式分配内存。无法理解下面的程序工作的原因。p是怎么得到记忆的

 int *p,b;
 *p = 4;
 printf("%d\n", *p);

没有为您创建内存,您正在使用。指针p是创建的,但它的值是什么,大家都在猜测。您很幸运没有遇到运行时错误

根据你的评论


但当我删除变量b时,我得到了预期的分段错误。上面的程序我尝试了不同的数字。工作正常


这清楚地表明您有未定义的行为。添加或删除变量不应导致segfault

将指针保留为未初始化值。所以,当您解引用它*p时,您访问内存中的任意位置,从而导致分段错误


通过将变量的地址(如&b)或一些新分配的内存(如mallocsizeofint)分配给p本身而不是*p,从而将p指向某个对象。

无法解释这一点,因为这是一个未定义的行为

无论如何,p没有得到任何内存分配。也许它指向b,也许指向一个完全不同的地方。我们不能说


你很幸运,仅此而已

这里,点的定义是保存另一个变量的地址。在编码中,你没有给出任何像&b这样的地址,你只是给p赋值了常数。所以在p之前没有用这个。地址p的存储方式和我们用普通方法定义的一样,比如int p=4;。通过更改值,上述代码可以完美地运行。我有用户Turbo C++编译器4 < /P>它从不确定行为的深度中拉出它。但是当我删除变量B时,我会像预期的那样得到分割错误。上面的程序我尝试了不同的数字。正常工作。@abhi7436这是行为未定义的进一步证据。请思考未定义行为中未定义的含义!这是一个非常常见的问题。这个问题类似于如果我站在公路中间,为什么我没有被车撞?答案是汽车在你不应该在公路上看到你的时候没有必要撞你。但如果你不移动,它们最终会移动的可能性非常高。你很幸运没有遇到运行时错误。我通常称之为不幸。很早,很容易看出,crash是幸运的,在一些随机内存上涂鸦不是。@art是的,我想这取决于幸运意味着它运行了还是意味着你发现了一个bug。@NathanOliver肯定是前者。在截止日期前调试损坏的回溯非常有趣,我希望我能一直这样做。这可以解释计算机是确定性的,毕竟,只是C标准声明它是未定义的行为。@cyphar是的,p只是指向未特权区域。这是一种刻板印象,认为任何事情都可能发生,无法解释。不,你不是飞向月球,然后再返回乌兰巴托。但是你可能在主墙上挖了一个大洞,从现在起你的房子是一个危险的地方。当然,我想说的是,在不了解编译器、操作系统架构等的情况下,我们无法真正回答他的问题。@user312567我很喜欢这个类比。下次有人开始谈论未定义的行为时,我可能会用这个词,比如独角兽血。