答案稍微有点实施敏感,但总的来说没有。您的g_glbarr
确实是指向char
或指定地址的指针。字符串本身将被放入带有常量字符串的数据部分,并且g_glbarr
将在编译时成为字符串地址的符号。您最终不会为指针分配空间,编译器只是在链接时解析地址。
更新
@Jay,这是八九不离十有点儿相同。整数(通常)只是内联:编译器会尽可能地将常量放在代码中,因为这是一个常见的情况,大多数常规体系结构都可以直接从直接数据中完成。字符串常量将仍然在某些只读数据部分。所以,当你做出这样的:
// warning: I haven't compiled this and wouldn't normally
// do it quite this way so I'm not positive this is
// completely grammatical C
struct X {int a; char * b; } x = { 1, "Hello" } ;
的1
变成了“立竿见影”的数据,该"Hello"
在只读数据分配的地方,编译器将只产生一些分配了一块可读写数据的看起来像
x:
x.a: WORD 1
x.b WORD @STR42
其中STR42
是在内存中的串"Hello"
的位置的符号名。然后当所有东西都链接在一起时,@STR42
被内存中字符串的实际虚拟地址替换。
字符串**可**被删除**如果**它实际上并未在任何地方使用。 – 2010-12-04 08:44:15
字符串文字只是一个例子。可能有很多这样的全局变量,它们可能是结构数组,可能会使用字符串,整数等进行初始化。使用malloc为这些全局变量分配内存会减小任何大小吗? – Jay 2010-12-04 08:52:31