C++ 新运算符未检测到的错误
我在胡闹,试图理解指针和运算符“new” 最后我对这两个代码的结果更加困惑,这是另一个,但不是,所以我想了解这里发生了什么。 提前谢谢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() {
#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您必须继续:)