在 C 中返回本地变量地址与本地字符串地址

下面的程序没有运行,因为我们正在返回本地 int 值。

#include<stdio.h>

int *fun1()
{
    int i = 10;
    return &i;       // local i hence will not get printed in main
}

main()
{
    int *x = fun1();

    printf("%d", *x);
}

然而,在下面的程序运行的同时,即使我们正在返回本地字符串基地址。为什么本地 char* 的概念在这里不适用?

char *fun()
{
    char *p = "ram";
    return p;             //char* is local, even though in main it gets printed. why?
}

int main()
{
    char *x = fun();
    printf("%s", x);

    return 0;
}

回答

char *fun()
{
char *p = "ram";
return p;             //char* is local, even though in main it gets printed. why?
}

当您编写这样的代码时,"ram"不会像那样放置在堆栈int i = 10中 - 它被放置在.rodata可执行文件的(只读数据)部分中。放在堆栈上的是指向内存中该位置的指针

想象一下,如果"ram"不是三个字符,而是一百万个字符——如果将字符串本身压入堆栈,则每次调用该函数时都必须将一百万个字节压入堆栈!即使字符串是常量。


由于字符串在内存中的位置是常数,因此返回指向该位置的指针是有效的。


以上是在 C 中返回本地变量地址与本地字符串地址的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>