当我这样做时,它会完美打印出“2”。
int main()
{
int *p;
int x = 2;
*p = x;
cout << *p;
}
但是当我第一次将* p初始化为null时,程序崩溃了。
int main()
{
int *p=0;
int x = 2;
*p = x;
cout << *p;
}
我想问一下第一个程序首先成功运行的是什么,为什么可以将值分配给未初始化的指针?
[编辑]我的问题实际上与我过去的考试问题有关。您可以勾选多个答案,似乎(b)&amp; (c)两者都是正确的。但现在我知道(c)作品是否完全归功于运气。
答案 0 :(得分:4)
第一个程序受到未定义的行为的影响。它似乎有效,但不幸的是,看似理智的行为也是未定义的行为。
如果程序取消引用未初始化的指针,请不要指望程序一直正常工作。
答案 1 :(得分:3)
永远不要使用未初始化的指针或取消引用空指针,你所做的是 undefined 行为,世界上任何事情都可能发生。你的代码实际上工作和行为'合理'是纯粹的运气。
至于为什么你的代码按照它的方式行事,可能是由于你的编译器和方式的原因。机器和操作系统表现。你p
的变量声明只会保留未初始化的内存,其值可以是任何内容,你只是“幸运”,因为该值指的是可读写内存位置。然而,通过明确地将其设置为“0”,它指向您的操作系统可能具有的不可读的&amp;不可写入的内存位置,任何访问它的尝试都会导致CPU向您的操作系统投诉,操作系统通过终止您的程序来响应。
不要依赖这种行为它可能发生的事情,即使在相同的系统配置下也可能在未来发生。
答案 2 :(得分:1)
在你的第一个代码中,p
指向一些未定义的内存。幸运的是,它是一个可写的内存区域。它似乎有用,但C ++标准,我和所有人都在这里保证你,肯定会发生坏事。
int main()
{
int *p; //it may even point to the first variable on the main() stack, who knows?...
int x = 2;
*p = x;
cout << *p;
}
第二次失败是因为,你试图对地址int
的数据进行0
加载(读取)操作...现实生活中的哪个位置坦率地说,未定义。读取的偏移量可以是内存地址0+4
,也可以是内存地址0-4
....再次知道。
永远不要使用未初始化的指针!