C++;动态变量和未定义内存之间的差异 我刚才正在学习C++中的动态变量概念。我遇到的第一个例子如下 int *p1 = new int; std::cin >> *p1; *p = *p + 5; std::cout << *p1; int*p1=新的int; 标准:cin>>*p1; *p=*p+5; 标准::cout>*p1; *p1=*p1+7; std::cout

C++;动态变量和未定义内存之间的差异 我刚才正在学习C++中的动态变量概念。我遇到的第一个例子如下 int *p1 = new int; std::cin >> *p1; *p = *p + 5; std::cout << *p1; int*p1=新的int; 标准:cin>>*p1; *p=*p+5; 标准::cout>*p1; *p1=*p1+7; std::cout,c++,pointers,dynamic-memory-allocation,C++,Pointers,Dynamic Memory Allocation,可能是seg故障。您是否尝试过在调试器中单步执行此操作?取消对未初始化指针的引用,这基本上意味着任何事情都可能发生。通常,有三种情况会发生:要么程序立即崩溃,要么继续工作。它也可能会在一段时间内起作用,但以后会表现不好。但你不能依赖于任何特定的结果——未定义的行为意味着任何事情都可能发生 它让我从控制台输入一个整数,但并没有输出任何东西。 为什么呢 如果不是因为程序崩溃(正如VorpalSword建议的那样),那么可能是当你过度编写(不管你过度编写了什么单词的内存)时,破坏了stdout机制中依

可能是seg故障。您是否尝试过在调试器中单步执行此操作?

取消对未初始化指针的引用,这基本上意味着任何事情都可能发生。通常,有三种情况会发生:要么程序立即崩溃,要么继续工作。它也可能会在一段时间内起作用,但以后会表现不好。但你不能依赖于任何特定的结果——未定义的行为意味着任何事情都可能发生

它让我从控制台输入一个整数,但并没有输出任何东西。 为什么呢

如果不是因为程序崩溃(正如VorpalSword建议的那样),那么可能是当你过度编写(不管你过度编写了什么单词的内存)时,破坏了stdout机制中依赖于它保留其原始值的某些东西。关于未定义行为的问题是它是未定义的——也就是说,确切地说,将发生什么将取决于过程中每个可能受影响的机制如何工作的确切细节,更确切地说,当它所依赖的先决条件被违反时,它将如何失败。一般来说,没有人试图记录或描述未定义的行为,因为这将是一项无休止的工作,在任何情况下这样做都没有好处,因为调用未定义行为的程序无论如何都需要修复

即使p1指向随机内存位置,为什么我不能更改 它所指的东西的价值是什么

好吧,你可以——但通过这样做,你调用了未定义的行为,这意味着在那之后没有任何东西可以保证正常工作,如果在那之后任何东西都不能做你想做的事情,那么唯一应该受到责备的人就是你:)

为什么我需要将p分配给“新”内存位置

因为如果你要使用一段内存,你会想要使用一段没有其他代码用于其他目的的内存。否则,您对它所做的任何更改都将覆盖他们在其中放置的任何值(反之亦然),从而导致在您的逻辑或其逻辑中出现意外/无效的行为,或者两者兼而有之


“new”操作符将您从堆中分离出一些已知的未被其他任何人使用的内存,以便您可以确保这些内存仅可供您自己的私人使用。“delete”操作符将该内存返回到堆中,以便在处理完后可以将其重新用于其他目的。

这里有几点:

  • 如果不初始化变量,则未指定其值(取决于编译器、编译器设置、操作系统、当时机器的状态等)。这就是当时堆栈上发生的任何事情
  • 操作系统需要保证进程隔离——这意味着,如果一个进程行为不当,它不会导致整个系统停机,也不会影响其他正在运行的进程。其中之一就是内存保护。每个进程都有允许使用的内存。如果随机地址恰好落在此区域之外,您的程序将崩溃
  • 如果随机地址落在允许的区域内,那么它可能是“无害的”,或者您可能会损坏进程堆栈、堆或任何其他数量的东西,导致以后的神秘崩溃
  • 最后,它不必指向堆或
    新的
    内存块-它可以位于堆栈上
下面是一个堆栈示例:

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
intx=0;
int*p1=&x;
标准:cin>>*p1;
*p1=*p1+7;

根据我的理解,当p1未初始化时,它可以指向任何地方。但是,当您创建一个动态变量时,它位于堆中,其行为更加可预测。您不应该反引用未初始化的指针。我仍然想看看其他人对此有何看法。那么,在某些情况下,我的第二个代码块是否可以工作,比如说,如果未初始化的变量随机指向堆?
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