【发布时间】:2018-05-23 14:05:01
【问题描述】:
这个网站上有很多关于字符串文字的静态生命周期的好答案。据我了解,它们被分配在只读内存中(其他人专门提到了“字符串文字池”)。因此,返回指向字符串文字的指针不会导致悬空指针。它们也是左值。
为什么对于整数常量字面量不成立?它也没有静态存储持续时间吗?如果我尝试分配一个整数常量,gcc 会抱怨它不是左值。
为什么要对字符串文字进行这种特殊处理? (以及 C99 中的复合文字)。我听说过左值的以下定义:“左值(定位器值)表示占据内存中某个可识别位置(即具有地址)的对象。”如果字符串文字(字符数组类型)必须在内存中可寻址,为什么同样不适用于整数?即使是整数也必须在程序的地址空间中分配。有性能原因吗?
【问题讨论】:
-
字符串文字不是处理器原生的东西。它们必须存储在内存中(除非它们很短),而诸如整数常量之类的“文字”可以自然地作为操作数传递给相应的汇编指令和/或存储在寄存器中.当然还有一些历史原因......
-
可能与字符串文字不是奇异值这一事实有关。 int 只是编译器可以直接传递给指令的值。另一方面,字符串是一个由其地址操作的数组,这意味着它需要存在于内存中的某个位置。指向字符串文字的指针可能与使用整数常量得到的字符串等价。
-
char *p = "Hello";允许有用,int *p = &3;没那么有用 -
请注意,您可以制作左值文字,例如
int *p = &(int){3};
标签: c