我有两个问题......(我正在学习C,这可能是个愚蠢的问题.道歉)
根据如何在C语言和大多数书中声明字符串,即使你通过说分配内存,他们总是说声明一个字符串
char p2[] = "String";
Run Code Online (Sandbox Code Playgroud)我的问题是,无论如何要声明一个字符串?
根据/sf/answers/119310341/,在这样的示例中,
char s[]="hello";
Run Code Online (Sandbox Code Playgroud)放在只读区域,然后复制到数组.在C中打印字符串的地址是否有效?
printf("%p\n", &"Hello There"); // I tried, it prints some address
Run Code Online (Sandbox Code Playgroud)
并通过这样做
printf("%p\n", &"Hello There");
printf("%p\n", &"Hello There");
Run Code Online (Sandbox Code Playgroud)
它正在打印相同的地址.感觉是什么,它应该打印不同的地址.编译器在这里进行一些优化吗?
Fre*_*Foo 14
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;
}
Run Code Online (Sandbox Code Playgroud)
和
// printfoo.c
#include <stdio.h>
void print_foo_addr()
{
printf("%p\n", &"foo");
}
Run Code Online (Sandbox Code Playgroud)
...然后我得到两个不同的指针值(Linux上的GCC 4.7.3),但是当我把定义输入print_foo_addr时main.c,我得到两次相同的值.所以,是的,这是标准明确允许的优化,但GCC至少只在每个模块的基础上执行此优化.