gpt4 book ai didi

c - 局部变量的返回地址

转载 作者:行者123 更新时间:2023-11-30 15:55:42 26 4
gpt4 key购买 nike

Possible Duplicate:
Can a local variable's memory be accessed outside its scope?

我试图理解为什么我会得到以下程序的输出

[hello] [0xbfde68f4]
[world] [0xbfde68f4]
[world] [0xbfde68f4]

程序是

int main(void)
{
char **ptr1 = NULL;
char **ptr2 = NULL;

ptr1 = func1();
ptr2 = func2();
printf(" [%s] [%p]\n",*ptr1, (void*)ptr1);

printf(" [%s] [%p]\n",*ptr2, (void*)ptr2);

printf(" [%s] [%p]\n",*ptr1, (void*)ptr1);

return 0;
}

char** func1()
{
char *p = "hello";
return &p;
}

char** func2()
{
char *p = "world";
return &p;
}

我知道返回局部变量的地址不是一个好的做法,但这只是一个实验。

最佳答案

内存地址被重用。首先它保存着“hello”常量的地址,然后它被重新用来保存“world”常量的地址。

一旦内存不再使用,就可以重新使用。重用最近使用的内存通常是最有效的,因此编译器和内存管理器通常会尝试这样做。

请注意,这绝对不能保证。您可能会发现该程序崩溃或在不同的编译器或平台上给出不同的地址。然而,在这种特定情况下,重用是非常非常有可能的,因为这两个变量都是本地变量并在堆栈上分配,并且没有中间代码使用任何堆栈空间。如果您添加堆栈空间的干预使用,您将得到不同的行为。

关于c - 局部变量的返回地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11876772/

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