【发布时间】:2010-09-17 00:58:21
【问题描述】:
我想知道函数指针存储在程序的哪个部分?如,它是在程序堆栈上还是有一个单独的部分?
void f(void){}
int main(void){
int x[10];
void (*fp)(void) = NULL;
fp = f;
return 0;
}
现在,x 和 fp 的地址会在程序堆栈内存的同一段吗?
【问题讨论】:
标签: c function function-pointers
我想知道函数指针存储在程序的哪个部分?如,它是在程序堆栈上还是有一个单独的部分?
void f(void){}
int main(void){
int x[10];
void (*fp)(void) = NULL;
fp = f;
return 0;
}
现在,x 和 fp 的地址会在程序堆栈内存的同一段吗?
【问题讨论】:
标签: c function function-pointers
函数指针在存储方面与任何其他指针没有什么不同,这与任何其他变量也没有什么不同。所以是的,它们都将一起存储在同一个地方,即局部变量的堆栈。
【讨论】:
有了一个好的编译器,它们就不会存在于任何地方,因为它们的值永远不会被使用并且对程序的输出没有任何贡献。
【讨论】:
这个精确问题的答案是,您的两个示例(一个整数数组和一个指向函数的指针)都是局部变量,并且都保存在“堆栈”中(堆栈有点概念但在你问题的层面上,这是正确的思考方式),所以x和fp的地址都在那里。
你可能会得到什么(“程序的哪个部分存储了函数指针”)可能有点不同:如果你为指向函数的指针赋值-- 就像你给它分配一个实际函数的地址一样 -- 函数的地址是包含 几乎肯定会在其他地方,因为可执行代码位于系统内存的不同部分而不是执行堆栈。
(整数数组完全分配在堆栈上,如果将x视为指针,它将指向堆栈区域。)
【讨论】: