C++ 新运算符未检测到的错误

C++ 新运算符未检测到的错误,c++,pointers,new-operator,C++,Pointers,New Operator,我在胡闹,试图理解指针和运算符“new” 最后我对这两个代码的结果更加困惑,这是另一个,但不是,所以我想了解这里发生了什么。 提前谢谢 #include <iostream> using namespace std; int main() { int * p = new int(50); p[1] = 33; cout << *p << endl; } Output: 50 #包括 使用名称空间std; int main() {

我在胡闹,试图理解指针和运算符“new”

最后我对这两个代码的结果更加困惑,这是另一个,但不是,所以我想了解这里发生了什么。 提前谢谢

#include <iostream>
using namespace std;
int main()
{
    int * p = new int(50);
    p[1] = 33;
    cout  << *p << endl;
}

Output: 50
#包括
使用名称空间std;
int main()
{
int*p=新的int(50);
p[1]=33;

cout在第一个示例中,您动态创建了一个值为50的int。当您尝试分配值33时,实际上是在内存中分配了一个不是您的值。这是未定义的行为。但是当您打印它时,您打印了您创建的原始值,即50


在第二个数组中,您动态创建了一个50 int的数组。然后,您指定了数组中的第二个值应为33。*因此,当您在第一个数组中使用
cout打印值时,您动态创建了一个值为50的单个int。当您尝试分配值33时,实际上是在内存中分配了一个不是您的值。它是未定义的行为。但当您打印它时,您将打印您创建的原始值,即50

在第二个示例中,您动态创建了一个50 int的数组。然后您指定了数组中的第二个值应为33。*因此,在第一个示例中,当您使用
cout打印值时

int * p = new int(50);  // allocates 1 int on heap, initialized to value of 50
p[ 1] = 33;             // p gives you the address of integer, 
                        // p[1] moves the p pointer forward and accessing 
                        // the pointed object results in undefined behavior,
                        // this means that at this moment anything can happen
                        // exception, crash, home war, nothing, everything,
                        // printing garbage value as well
在第二种情况下:

int* p = new int[50];   // allocates 50 ints on heap, uninitialized
p[ 1] = 17;             // initializes element with index 1 to value of 17
std::cout << *p;        // p gives you the address of first element, with index 0
                        // which is still uninitialized, thus prints garbages
在第一种情况下,将ints值初始化为0。

int * p = new int(50);  // allocates 1 int on heap, initialized to value of 50
p[ 1] = 33;             // p gives you the address of integer, 
                        // p[1] moves the p pointer forward and accessing 
                        // the pointed object results in undefined behavior,
                        // this means that at this moment anything can happen
                        // exception, crash, home war, nothing, everything,
                        // printing garbage value as well
在第二种情况下:

int* p = new int[50];   // allocates 50 ints on heap, uninitialized
p[ 1] = 17;             // initializes element with index 1 to value of 17
std::cout << *p;        // p gives you the address of first element, with index 0
                        // which is still uninitialized, thus prints garbages

将int值初始化为0。

在第一种情况下,您将创建一个50 int的数组,为数组中的第二个int赋值,然后打印数组中的第一个元素。数组索引从0开始,因此当您在cout语句中取消引用指针时,它将打印内存中索引为0的任何内容


在第二种情况下,您将创建一个整数,并用值50初始化它。当您在print语句中取消引用指针时,您将得到刚刚创建的整数。p[1]=33在访问未分配内存时可能会导致错误,也可能不会导致错误。

在第一种情况下,您要创建一个包含50个整数的数组,为数组中的第二个整数赋值,然后打印数组中的第一个元素。数组索引从0开始,因此当您取消引用cout语句中的指针时,它将打印所有发生的情况索引0处的内存中已删除

int* p = new int[50];
在第二种情况下,您正在创建一个整数,并使用值50对其进行初始化。当您在print语句中取消引用指针时,您将获得刚刚创建的整数。p[1]=33可能会或可能不会在访问未分配内存时导致错误

int* p = new int[50];
  • 在堆上分配一个int数组,其中包含50个未初始化的元素,范围从索引0到49。 将p[1]设置为33不会更改p[0],这是您正在使用“cout”打印的内容
    • 在堆上分配一个int数组,其中包含50个未初始化的元素,范围从索引0到49。
      将p[1]设置为33不会更改p[0],这是您打印时使用的“请在此处发布代码,不要只是链接到它。请使用文本,而不是图片。您可能正在尝试创建数组,但使用()而不是[]”,则得到一个初始化为的整数50@user3447258欢迎使用SO。如果以下答案之一解决了您的问题,您应该接受它(单击相应答案旁边的复选标记)。这有两个作用。它让每个人都知道您的问题已得到解决,并让帮助您的人相信您的帮助。请参阅以获取完整的解释。请在此处发布代码,不要仅链接到它。请使用文本,而不是图片。您可能正在尝试创建数组,但您使用()而不是[],则得到一个初始化为的整数50@user3447258欢迎使用SO。如果以下答案之一解决了您的问题,您应该接受它(单击相应答案旁边的复选标记)。这有两件事。它让每个人都知道你的问题已经解决,并且它给了帮助你的人信用。请参阅以获得完整的解释。回答很好,但你可能希望明确说明他认为p[1]是第一个元素的事实。否则这可能会让人困惑。我想你可能有“第一”这个词和“second”在这里互换。答案很好,但你可能想明确地说明他认为p[1]是第一个元素的事实。否则这可能会让人困惑。我想你可能有“first”和“second”两个词在这里交换。@user3447258我可以向你解释更多吗?是的,当然,我是stackoverflow的新手,我还不熟悉这些评论和内容,你还有其他解释吗?请继续:)@user3447258我可以向你解释更多吗?是的,我是stackoverflow的新手,我还不熟悉这些评论和内容,还有其他解释吗g您必须继续:)