指针变量和函数位于何处?
答案 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 差异;正如上面的buf
在foo()
返回时结束,p
,q
和r
也是如此。
另请注意,指针的生命周期以及指向的实体的生命周期与彼此无关。指针可能具有比指向实体更短,相同或更长的生命周期(这是C
和C++
中错误的丰富来源。一些例子:
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
返回后,gp1
,gp2
和gp3
仍然存在,但只有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_allocated
和I_m_global
具有全球生命周期; I_m_initialized
和I_m_local
无法从dynamic_allocated
编入索引。记住main
在内存泄漏的情况下手动指向的空闲堆空间。