我想知道C++中动态内存、栈内存和静态内存的区别。
下面是一些代码作为示例:
#include<iostream>
using namespace std;
char *GetMemory(void)
{
char p[]="hello world";
char *q="hello world";
return q;
}
int main(void)
{
return 0;
}
为什么p
在栈内存中,而q
在动态内存中?
最佳答案
p
和 q
都是变量。 p
类型为“12 char
”和 q
的数组是“指向 char
的指针”类型。两者 p
和 q
有自动存储期限。也就是说,它们是在堆栈上分配的。
q
是一个指针,初始化为指向字符串"hello world"
的首字符.这个字符串是一个字符串字面量,所有的字符串字面量都有静态存储期。
p
是一个数组,所以当你初始化p
使用字符串文字,它会导致 p
声明一个字符数组,初始化时,将字符串字面量的内容复制到数组中。所以,当GetMemory()
被调用,在堆栈上为数组分配空间p
, 以及字符串文字的内容 "hello world"
被复制到那个数组中。
您的代码不执行任何动态分配。
请注意,因为 q
是指向具有静态存储持续时间的字符数组的指针,返回 q
是安全的来自函数:它指向的数组将在程序的整个持续时间内存在。返回 p
是不安全的,但是,因为 p
函数返回时不再存在。
另请注意 "hello world"
的类型是char const[12]
. C++ 中存在不安全的隐式转换,允许将字符串文字转换为 char*
。指向字符串文字的初始字符。这是不安全的,因为它悄悄地放弃了 const 限定。您应该始终使用 const char*
在处理字符串文字时,因为字符不可修改。 (在 C++ 语言的最新修订版 C++11 中,这种不安全的转换已被删除。)
关于c++ - 动态内存,堆栈内存和静态内存与c++的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11606094/