c++ - 动态内存,堆栈内存和静态内存与c++的区别?

标签 c++ memory

我想知道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在动态内存中?

最佳答案

pq都是变量。 p类型为“12 char ”和 q 的数组是“指向 char 的指针”类型。两者 pq有自动存储期限。也就是说,它们是在堆栈上分配的。

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/

相关文章:

c++ - 构造函数中表达式的编译时或运行时评估

C++ 和 STL : Constructor Factory

c# - 在 C# 中将两个字节转换为 Int16?

java - 循环 MD5 计算时缓慢且内存泄漏

C# - 在 block 末尾自动释放内存

c++ - 为标准 vector 对象重载运算符 [] 时出错

c++ - 在 cygwin 终端中运行时显示不存在的文件夹的 cmake 错误

c# - 我是否需要自己在 xamarin.forms 中清理内存?

ios - UIView动画增加内存

c++ - "\n"或 '\n' 或 std::endl 到 std::cout?