【发布时间】:2013-11-09 03:49:34
【问题描述】:
我知道程序中使用的字符串文字会存储在只读区域中,例如。
//global
const char *s="Hello World \n";
这里的字符串文字 "Hello World\n" 存储在程序的只读区域中。 现在假设我在一些函数的主体中声明了一些文字,比如
func1(char *name)
{
const char *s="Hello World\n";
}
由于函数的局部变量存储在该函数的激活记录中,这是 字符串文字也一样吗?再次假设我从某个函数 func2 调用 func1 为
func2()
{
//code
char *s="Mary\n";
//call1
func1(s);
//call2
func1("Charles");
//code
}
在上面,在第一次从 func2 调用 func1 时,传递了“s”的起始地址,即 s[0] 的地址,而在第二次调用中,我不确定实际发生了什么。字符串文字“Charles”在哪里获得存储空间。编译器是否创建了一些tempory并传递了它的地址还是发生了其他事情? 我发现文字从“只读数据”部分存储 String literals: Where do they go? 但我不清楚这是否只发生在全局文字或某些函数的本地文字上。任何见解都将是可观的。谢谢。
【问题讨论】:
-
我认为所有基于静态内存的值都存储在只读区域中,但要确定它的实际存储位置,您应该使用调试器逐步执行代码和/或打开可执行文件使用十六进制编辑器。
-
尝试像“gcc -S -c file.c -o file.s”这样编译你的.c文件并查看file.s。在底部,您将看到一个包含所有字符串的“文本”部分。如果您仔细查看汇编代码,您可以看到它们是如何加载的。
-
虽然
gcc确实如此,但另一个有趣的问题是,是否有任何标准对此有任何要求。