我在试图理解指针和操作员“新”
时一直在搞乱我最终对这两个代码应该导致的内容更加困惑,这是另一个但不是,所以我想了解这里发生了什么。 提前谢谢。
#include <iostream>
using namespace std;
int main()
{
int * p = new int(50);
p[1] = 33;
cout << *p << endl;
}
Output: 50
当我尝试这个时
#include <iostream>
using namespace std;
int main()
{
int * p = new int[50];
p[1] = 33;
cout << *p << endl;
}
Output: -842150451
我想知道每个结果的含义。
答案 0 :(得分:3)
在第一个中,您动态创建了一个值为50的int。当您尝试分配值33时,实际上将其分配给不属于您的内存。这是未定义的行为。但是当你打印它时,你打印出你创造的原始值,即50。
在第二个中,您动态创建了一个50 int的数组。然后,您已指定数组中的第二个值应为33. *因此,当您使用cout << *p << endl;
打印该值时,您最终只会打印第一个未定义的值。再试一次,你可能会得到另一个价值。
*编辑:正如评论中所指出的,我应该更明确地说明这一点。数组从0开始。因此,如果要访问第一个值p[0]
,则会执行此操作。
答案 1 :(得分:3)
在第一种情况下
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* p = new int[50]();
将int初始化为0。
答案 2 :(得分:0)
在第一种情况下,您要创建一个包含50个整数的数组,为数组中的SECOND int赋值,然后打印数组中的第一个元素。数组索引从0开始,所以当你在cout语句中取消引用指针时,它会打印出在索引0的内存中发生的任何事情。
在第二种情况下,您要创建一个整数,并使用值50初始化它。当您取消引用print语句中的指针时,您将获得刚刚创建的整数。当您访问未分配的内存时,p [1] = 33可能会或可能不会导致错误。
答案 3 :(得分:0)
int* p = new int[50];
值-842150451(十六进制 0xCDCDCDCD )是一个幻数“由Microsoft的C ++调试运行时库用于标记未初始化的堆内存”,请参阅{{3} }。
int* p = new int(50);
我建议您使用this question on SO来查看在逐步执行代码时分配的内存会发生什么。