在以下示例中 here
#include<stdio.h>
char** func1_Str();
char** func2_Str();
int main(void)
{
char **ptr1 = NULL;
char **ptr2 = NULL;
ptr1 = func1_Str();
printf("\n [%s] :: func1_Str() address = [%p], its returned address is [%p]\n",*ptr1,(void*)func1_Str,(void*)ptr1);
ptr2 = func2_Str();
printf("\n [%s] :: func2_Str()address = [%p], its returned address is [%p]\n",*ptr2,(void*)func2_Str,(void*)ptr2);
printf("\n [%s] [%p]\n",*ptr1,(void*)ptr1);
return 0;
}
char** func1_Str()
{
char *p = "Linux";
return &p;
}
char** func2_Str()
{
char *p = "Windows";
return &p;
}
输出:
$ ./static
[Linux] :: func1_Str() address = [0x4005d5], its returned address is [0x7fff705e9378]
[Windows] :: func2_Str()address = [0x4005e7], its returned address is [0x7fff705e9378]
[Windows] [0x7fff705e9378]
$
为什么func1_Str()
和func2_Str()
使用相同的地址来初始化char *p
?这与指针的命名相同有关吗?
最佳答案
如果您为代码启用一些警告,好的编译器会警告您正在“返回局部变量的地址”(或类似的内容)。
char** func1_Str()
{
char *p = "Linux";
return &p;
}
在此示例中,p
位于堆栈上,并使用常量字符串“Linux”
的地址进行初始化。然后,您将返回堆栈上 p
的地址,紧接着,当函数返回到调用者时,堆栈指针将被重置。当您随后调用 func2_Str
时,堆栈上的同一位置将被重用 p
在func2_Str
中。堆栈就像厨房里的一堆盘子,当你调用一个函数时,你会放上新的盘子,当你返回时,你会再次取下盘子。
所以,是的,您的两个指针将获得相同的地址,因此,它们指向的任何内容当然也将是相同的。
变量的名称与它无关(如果您尝试将其中一个变量重命名为其他名称的简单实验,您就会发现)。你也可以这样做:
char** func1_Str()
{
char *q = "Windows";
char *p = "Linux";
return &p;
}
并且您(可能)会看到 p
的值已更改,因为我们现在需要另外四个字节。
(我还发现相当令人惊讶的是,您的系统获得与链接中的示例完全相同的地址 - 您实际上是自己编译的,还是只是从网站复制和粘贴) (当然,如果您实际阅读了链接网站上的文字,您就会明白这一点)
关于c - 函数使用相同的内存进行本地指针初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23188320/