可能重复:
Where are literal strings placed and why can I return pointers to them?
假设我有以下代码:
char *string;
void foo(char *s)
{
string = s;
}
foo("bar");
内部发生了什么?因为我没有明确地声明我传入foo的内容,例如做类似的事情。
char s[] = "bar";
foo(s);
将“bar”始终存储在同一个内存位置?会自动为它分配一些内存吗?如果是这样,这个地址是否保持不变,那么“string”总是指向一个包含“bar”的char数组?
我想我要问的更普遍的问题是:当你将一个参数传递给一个函数而没有先将它明确地分配给某个变量然后传入那个变量时,内部会发生什么。
答案 0 :(得分:3)
char *string;
void foo(char *s)
{
string = s;
}
foo("bar");
"bar"
是一个字符串文字。字符串文字具有静态存储持续时间及其生命周期(因为所有具有静态存储持续时间的对象)都是程序的整个执行。
所以基本上在你的程序启动时你的内存中有一个"bar"
数组对象,并且你在程序执行期间将指针传递给它的第一个元素,这完全没问题。
答案 1 :(得分:2)
您的代码基本上等同于
char *string;
string = "bar";
在这种情况下,假设一个理智的实现,"bar"
,作为一个字符串文字,将被存储在可执行文件中的一个恒定位置并加载到(可能是只读的)内存中,同样也是(虚拟的) )在内存中的地址,按string
始终指向有效的字符串。