C++各种变量、类型的存储位置

先看看这张图里面五个区域


就我自己的思考来设置一些问答。

1. 首先哪些变量会进行零初始化?

  如果没有显示地初始化静态变量,编译器将把它设置为0,在默认情况下,静态数组和结构将每个元素或成员的所有位都设置为0。

2. char *p = "hello" 和 char p[6] = "hello"有什么区别?

  char *p = "hello", 对于*(p + 1) = 'a'这条语句是无法执行的,因为hello保存在常量字符串区,当你初始化赋值的时候,这些常量就先在文字常量区开辟一段空间,保存此常量,定义后是不能修改的。以后相同的常量就都在这里了。

  char p[6] = "hello",保存在栈区, 可以进行修改,空间由编译器自动分配和释放。

3. 五种变量存储方式?

 存储描述  持续性  作用域  链接性 如何声明  其他信息 
 自动  自动   代码块  无   在代码块中  比如一些局部变量
 寄存器  自动  代码块  无  在代码块中,使用关键字register  
静态,无链接性   静态  代码块  无  在代码块中,使用关键字static  在函数内,函数退出,值仍然保留
静态,外部链接性  静态  文件  外部  不在任何函数内  extern
静态,内部链接性  静态  文件  内部  不在任何函数内,使用关键字static  所有函数共用

4. const的一些问题。

  const修饰的全局变量保存在代码区中,const修饰的局部变量保存在栈段中。

  默认情况下,全局变量的链接性为外部的(其他文件要使用这个全局变量加上extern关键字), 而const修饰的全局变量是内部链接的,就像使用了static一样。

5. 存储说明符介绍。

  auto——在C++11之前是说明符, 显式指出变量为自动存储,现在是用于类型推断,可以不考虑

  register——使用CPU寄存器来存储变量,提高变量访问的速度

  static——创建静态的内部链接性、静态无链接性的变量

  extern——创建静态外部链接性的变量

  thread_local——C++11新增,变量的持续性与线程相同

  mutable——可以用它来指出,即使结构(或类)变量为const,其某个成员也可以被修改

6. 栈区的详细说明。

   由于自动变量的数目随函数的开始和结束而增减,因此程序必须在运行时对自动变量进行管理。常用的方法是留出一段内存,并将其视为栈。程序使用两个指针来跟踪栈,一个指针指向栈底,另一个指针指向栈顶(下一个可用的内存单元)。当函数被调用时,将自动变量加入到栈中,栈顶指针指向变量后面的下一个可用的内存单元。函数结束时,栈顶指针被重置为函数被调用前的值,从而释放新变量使用的内存。

7. 我之前的一个小小的疑惑

  局部变量全部都是存储在栈区的,但是malloc分配的内存在堆区,那么int *p = new int[5];这种应该分配在栈区还是堆区呢?当然是p在栈区,存一个地址,地址对应的地方在堆区。

原文地址:https://www.cnblogs.com/Dancing-Fairy/p/15244549.html