我有两个问题.(我正在学习C,这可能是愚蠢的问题。)(道歉)
我的问题是,是否有声明字符串?
被放置在只读区域,然后复制到数组中。这样打印字符串的地址在C中有效吗?
printf("%p\n", &"Hello There"); // I tried, it prints some address通过这样做
printf("%p\n", &"Hello There");
printf("%p\n", &"Hello There");它正在打印相同的地址。感觉是,它应该打印不同的地址。编译器在这里做一些优化吗?
发布于 2013-09-26 12:03:45
C标准,§6.4.5字符串文字,规定:
如果这些数组的元素具有适当的值,则未指定这些数组是否不同。
因此,具有相同内容的两个字符串文本可能表示相同的数组,并且打印它们的地址会给出相同的指针值两次。这取决于编译器和链接器;当我将以下程序编译成两个单独的模块时.
// main.c
#include <stdio.h>
extern void print_foo_addr(void);
int main()
{
printf("%p\n", &"foo");
print_foo_addr();
return 0;
}和
// printfoo.c
#include <stdio.h>
void print_foo_addr()
{
printf("%p\n", &"foo");
}..。然后我得到两个不同的指针值(Linux4.7.3),但是当我将print_foo_addr的定义放在main.c中时,我会得到两次相同的值。是的,这是标准明确允许的优化,但是GCC至少只在每个模块的基础上执行这个优化。
发布于 2013-09-26 11:59:12
这是C标准特别允许的。
6.4.5p5-6:
在翻译阶段7,值为零的字节或代码被附加到由字符串字面或文字产生的每个多字节字符序列中。然后使用多字节字符序列初始化一个静态存储时间和长度的数组,该数组仅足以包含该序列。..。 如果这些数组的元素具有适当的值,则未指定这些数组是否不同。
发布于 2013-09-26 11:59:58
"Hello There"是字符串文本,它将在string表中可用( "Hello There"在printf中获得相同地址的原因)。
当你做的时候
char p2[] = "String";内存将被分配,“字符串”将被复制到新创建的内存中。但
char * p3 = "String";将指向只读部分.即字符串表。
在这种情况下,如果打印p3和&"String"将是相同的。
如果您打印p2和&"String",则会打印不同的地址。因为p2是堆栈地址。
https://stackoverflow.com/questions/19027566
复制相似问题