不同程序元素的位置

时间:2011-07-24 05:19:29

标签: c++

  • 局部变量位于堆栈
  • 动态分配的内存位于堆
  • 字符串文字具有const位置
  • 未初始化的全局变量和静态变量位于.bss(以符号开头的块)
  • 初始化的静态和全局变量位于数据部分

指针变量和函数位于何处?

2 个答案:

答案 0 :(得分:4)

功能位于.text部分。

指针在哪里:堆栈上的本地指针,.bss中的全局/静态点等。

是的,一个自动(堆栈上)指针可以指向任何地方(或根本没有):

void foo() {
   char *p = NULL;               // this pointer points nowhere
   const char *q = "hello";      // points to read-only constant
   char buf[1], *r = buf;        // r points to stack
}

指针和其他类型的变量之间存在 no 差异;正如上面的buffoo()返回时结束,pqr也是如此。

另请注意,指针的生命周期以及指向的实体的生命周期与彼此无关。指针可能具有比指向实体更短,相同或更长的生命周期(这是CC++中错误的丰富来源。一些例子:

int *gp1, *gp2, *gp3;
void foo() {
  int j;
  int *lp1, *lp2, *lp3;

  gp1 = lp1 = &j;      // both global 'gp1' and local 'lp1' point to local 'j'
  gp2 = lp2 = new int; // 'gp2' and 'lp2' point to dynamically allocated
                       // anonymous 'int'
  if (true) {
    int j2;
    gp3 = lp3 = &j2;
  }
  // 'gp3' and 'lp3' are "dangling" -- point to 'j2' which no longer exists.
}

foo返回后,gp1gp2gp3仍然存在,但只有gp2指向有效内存。

答案 1 :(得分:1)

指针变量与数据变量没有区别。函数是你真正的程序,编译后函数名称将被转换为内部符号,用于在函数体开始的内存中定位一个地址,函数体将被编译为汇编,最终机器码。

=============================================== ==================================

[编辑第二个问题]

正如我所指出的,指针变量与数据变量没有区别,包括存储和生命周期。例如这是一个示例.cpp文件

#include <stdio.h>
#include <stdlib.h>

using namespace std;

int I_m_data = 10;

int *I_m_global;
int *I_m_initialized = &I_m_data;

int main(){
    int *I_m_local = NULL;

    int **dynamic_allocated = (int **)malloc(sizeof(int *));

    free(dynamic_allocated);
}

此处,I_m_global位于.bss部分,I_m_initialized位于.data部分,I_m_local位于堆栈上,dynamic_allocated指向的指针位于堆上,而{ {1}}本身就在堆栈上。

此外,dynamic_allocatedI_m_global具有全球生命周期; I_m_initializedI_m_local无法从dynamic_allocated编入索引。记住main在内存泄漏的情况下手动指向的空闲堆空间。

祝你好运!