gpt4 book ai didi

c++ - C++程序中函数的地址是什么?

转载 作者:IT老高 更新时间:2023-10-28 12:37:57 29 4
gpt4 key购买 nike

因为函数是一组指令存储在一个连续的内存块中。

函数的地址(入口点)是函数中第一条指令的地址。 (据我所知)

因此我们可以说函数的地址和函数中第一条指令的地址将是相同的(在这种情况下第一条指令是变量的初始化。)。

但下面的程序与上面的行相矛盾。

代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
char ** fun()
{
static char * z = (char*)"Merry Christmas :)";
return &z;
}
int main()
{
char ** ptr = NULL;

char ** (*fun_ptr)(); //declaration of pointer to the function
fun_ptr = &fun;

ptr = fun();

printf("\n %s \n Address of function = [%p]", *ptr, fun_ptr);
printf("\n Address of first variable created in fun() = [%p]", (void*)ptr);
cout<<endl;
return 0;
}

一个输出示例是:

 Merry Christmas :) 
Address of function = [0x400816]
Address of first variable created in fun() = [0x600e10]

所以,这里的函数地址和函数中第一个变量的地址是不一样的。为什么会这样?

我在 google 上搜索过,但无法找到所需的确切答案,而且对这门语言不熟悉,我完全无法在网上找到一些内容。

最佳答案

So, here the address of function and the address of first variable in function is not same. Why so?

为什么会这样?函数指针是指向函数的指针。无论如何,它并不指向函数内的第一个变量。

详细地说,函数(或子例程)是一组指令(包括变量定义和不同的语句/操作),根据需要执行特定工作,通常是多次。它不仅仅是指向函数内部存在的元素的指针。

在函数内部定义的变量与可执行机器代码的存储区域不同。根据存储类型,存在于函数内部的变量位于执行程序内存的其他部分。

当一个程序被构建(编译成一个目标文件)时,程序的不同部分以不同的方式组织起来。

  • 通常,函数(可执行代码)位于一个名为 code segment 的单独段中。 ,通常是只读内存位置。

  • 分配的编译时间变量 OTOH 存储在 data segment 中。 .

  • 函数局部变量,通常在需要时填充到堆栈内存中。

因此,不存在函数指针将产生函数中存在的第一个变量的地址的关系,如源代码所示。

对此,引用wiki文章,

Instead of referring to data values, a function pointer points to executable code within memory.

所以,TL;DR,函数的地址是可执行指令所在的代码(文本)段内的内存位置。

关于c++ - C++程序中函数的地址是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34463637/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com