c - 函数使用相同的内存进行本地指针初始化?

标签 c pointers scope

在以下示例中 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 时,堆栈上的同一位置将被重用 pfunc2_Str中。堆栈就像厨房里的一堆盘子,当你调用一个函数时,你会放上新的盘子,当你返回时,你会再次取下盘子。

所以,是的,您的两个指针将获得相同的地址,因此,它们指向的任何内容当然也将是相同的。

变量的名称与它无关(如果您尝试将其中一个变量重命名为其他名称的简单实验,您就会发现)。你也可以这样做:

char** func1_Str()
{
    char *q = "Windows";
    char *p = "Linux";
    return &p;
}

并且您(可能)会看到 p 的值已更改,因为我们现在需要另外四个字节。

(我还发现相当令人惊讶的是,您的系统获得与链接中的示例完全相同的地址 - 您实际上是自己编译的,还是只是从网站复制和粘贴) (当然,如果您实际阅读了链接网站上的文字,您就会明白这一点)

关于c - 函数使用相同的内存进行本地指针初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23188320/

相关文章:

c++ - 如何使用堆栈 c 评估算术表达式?

c - 回显值到 Linux 控制台

javascript - 如何让jquery只运行一次

scope - 动态范围界定的优点是什么?

ruby-on-rails - 通过多个条件/过滤器过滤 Rails 3 数据库查询

c - 使用 read() 扫描字符数组

java - 通过 JNI/DLL 或 EXE 执行 native 代码?

c - 链表实现内存分配

c++ - 在 C++ 中声明指向结构的指针会自动为其成员分配内存。我错了吗?

c - 如何在c中编写一个读取数组的函数?