我刚才学习C ++的动态变量的概念。我碰到的第一个例子是如下。
int *p1 = new int;
std::cin >> *p1;
*p = *p + 5;
std::cout << *p1;
我在想,如果指针P1没有指向一个动态内存的位置和毋宁说是未初始化的,从我的理解是不确定的行为会发生什么。所以,
int *p1;
std::cin >> *p1;
*p1 = *p1 + 7;
std::cout << *p1;
我想这一点,并没有奏效。它让我输入从控制台的整数,但没有得到任何输出。这是为什么?即使P1指向一个随机的内存位置,为什么我不能改变任何它所指向的价值?为什么我需要分配p来一个“新”的内存位置?
这里有几件事情:
new
一块内存 - 它可能是在栈上。下面是与堆栈的例子:
int x = 0;
int* p1 = &x;
std::cin >> *p1;
*p1 = *p1 + 7;
std::cout << *p1;
std::cout << x; // x and *p1 refer to the same value
它让我输入从控制台的整数,但没有得到任何输出。这是为什么?
如果不是由于程序崩溃(如VorpalSword建议),那么也许当你改写(您已改写任何的记忆单词),这打破了这是取决于它保留了其原有价值标准输出机制的东西。关于未定义行为的事情是,它是不确定的 - 这是说,到底会发生什么将取决于在这个过程中每一个可能受影响的机制是如何工作的具体细节,更确切地说它如何可能会失败时的前提条件这取决于受到了侵犯。在一般情况下,没有人试图记录或表征不确定的行为,因为这将是一个无止境的工作,而且也没有好处在任何情况下这样做,因为反正需要被固定调用未定义行为的程序。
即使P1指向一个随机的内存位置,为什么我不能改变任何它所指向的价值?
那么,你可以 - 但这样做,你调用未定义行为,这意味着没有任何保证以后工作的权利,如果有什么不这样做,你以后想什么,要怪的唯一的人是你:)
为什么我需要分配p来一个“新”的内存位置?
因为如果你打算使用一块内存,你需要使用一块内存的代码没有其他位使用用于其他目的。否则,你所做的任何更改将覆盖任何价值,他们已经摆在那里(反之亦然),导致无论是在你的逻辑或他们的逻辑,或两者意外/无益的行为。
“新的”运营商打破你断位的已知将要 - 不使用中逐人,其他的内存从堆中,这样你可以肯定的是仅适用于您自己私人使用。 “删除”操作符提供了内存回堆,以便它可以被重新用于其他目的,你用它做了。
访问一个未初始化的指针是undefined behavior,这基本上意味着任何事情都有可能发生。通常情况下,以下三种情况之一将实际发生:要么程序将立即崩溃,或者它会继续工作。它也工作了一段时间,但后来胡作非为。但是你不能依赖于任何特定结果 - 未定义行为意味着什么事情都可能发生。
这可能赛格故障。您是否尝试过单在调试器步进呢?