在 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"不是三个字符,而是一百万个字符——如果将字符串本身压入堆栈,则每次调用该函数时都必须将一百万个字节压入堆栈!即使字符串是常量。
由于字符串在内存中的位置是常数,因此返回指向该位置的指针是有效的。