提问者:小点点

C++中的静态和动态内存分配[重复]


为什么下面的猜测是错误的?(一位软件工程公司经理告诉我,这几乎是正确的,但我不明白为什么,我也无法在互联网上搜索答案。)

int* ptr = new int;      // Sorry I mistyped before

我的要求:

//新编辑:2015年1月1日17:39(UTC+08:00)br>我想的是,它将堆栈指针下移(还是上移?)若要为释放空间,请执行以下操作。并为找到一个空白空间。然后将此的地址存储到中。


共3个答案

匿名用户

左侧是一个,右侧正在创建一个(指针)

你想要:

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.

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|中|静态|动态内存|分配|重复)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?