1

可能重复:
文字字符串放在哪里,为什么我可以返回指向它们的指针?

假设我有一些如下代码:

char *string;

void foo(char *s)
{
   string = s;
}

foo("bar");

内部发生了什么?因为我没有明确声明我传递给 foo 的内容,例如通过做类似的事情。

char s[] = "bar";
foo(s);

“bar”会一直存储在同一个内存位置吗?是否会自动为其分配一些内存?如果是这样,这个地址是否保持不变,所以“string”总是指向一个包含“bar”的 char 数组?

我想我要问的更一般的问题是:当您将参数传递给函数而不首先将其显式分配给某个变量,然后传入该变量时,内部会发生什么。

4

2 回答 2

3
char *string;

void foo(char *s)
{
   string = s;
}

foo("bar");

"bar"是一个字符串文字。字符串文字具有静态存储持续时间,它们的生命周期(与所有具有静态存储持续时间的对象一样)是程序的整个执行。

所以基本上在程序启动时内存中的某处有一个"bar"数组对象,并且在程序执行期间您将指针传递给它的第一个元素,这完全没问题。

于 2012-10-20T09:57:27.293 回答
2

您的代码本质上等同于

char *string;

string = "bar";

在这种情况下,假设一个健全的实现,"bar"作为字符串文字,将存储在可执行文件中的一个恒定位置并加载到(可能是只读的)内存中,也加载到内存中的相同(虚拟)地址,string以便总是指向一个有效的字符串。

于 2012-10-20T09:57:36.300 回答