为什么下面的猜测是错误的?(一位软件工程公司经理告诉我,这几乎是正确的,但我不明白为什么,我也无法在互联网上搜索答案。)
int* ptr = new int; // Sorry I mistyped before
我的要求:
//新编辑:2015年1月1日17:39(UTC+08:00)br>我想的是,它将堆栈指针下移(还是上移?)若要为
左侧是一个
你想要:
int * ptr = new int;
或者如果您想要进行静态分配
int num; // = 5; Will initialize num to 5
你的说法是正确的。
>
右部分(新的int)是动态内存分配的。 换句话说,右边的部分返回一个
我想解释一下关于你的代码的一些事情。
那部分
new int
被认为是“动态分配”,但实际上它是在堆内存中分配的。
声明
int ptr
不被认为是“静态分配”,而是被认为是“自动”的,因为它是在堆栈内存上分配的。请注意,堆比堆栈大得多(Windows中每个线程的默认堆栈大小为1MB,因此您将无法在堆栈上分配大型数组。另一方面,堆理论上有4GB的内存地址空间,尽管一个进程只有2GB可用,而且它也是一个虚拟内存,而不是物理内存。
现在,由于您将ptr仅表示为整数类型(而不是指针),编译器将失败,因为您试图将内存地址分配给非指针类型。因此,您需要明确地告诉编译器这是您的意图,并且通过将内存分配(它只是一个32位地址)强制转换为int来告诉编译器:
int ptr = (int)new int; //allocate an int on the heap and cast the address to an int value
现在ptr将持有一个32位的数字,它是堆中内存分配的起始地址。由于编译器将此ptr视为一个简单的整数而不是一个指针,所以您现在不能对它做太多的事情,因此为了对它做一些有意义的事情(而不是仅仅将地址保存在整数值中),您需要将它强制转换为一个指针,并且仅使用它。例如,用某个值初始化地址(假设该值为5):
(*(int*)ptr) = 5; //cast to pointer and dereference it.
正如您所看到的,语法现在变得“丑陋”,很难阅读/理解。如果你用“正确”的方式做事,你可以这样写:
int* ptr = new int;
*ptr = 5; //dereference the pointer
还有一件事,关于指针算术:因为ptr只是一个整数而不是指针,所以当你递增它时:
int ptr = new int; //Assume ptr got the address 0x010
ptr++;
//Now ptr will hold the value of 0x011 because the value just got incremented by 1.
但如果ptr是一个真正的指针:
int* ptr = new ptr; //Assume ptr got the address 0x010
ptr++;
//Now ptr will hold the value of 0x014 because the size of an int is 4 bytes
//and the pointer now points to the next address after the allocated integer.