据我所知,像“Hello”这样的字符串文字
被认为是C中的char *和C中的const char *,对于这两种语言,字符串文字存储在只读存储器中.(如果我错了,请纠正我)
- #include <stdio.h>
- int main(void)
- {
- const char* c1;
- const char* c2;
- {
- const char* source1 = "Hello";
- c1 = source1;
- const char source2[] = "Hi"; //isn't "Hi" in the same memory region as "Hello" ?
- c2 = source2;
- }
- printf("c1 = %s\n",c1); // prints Hello
- printf("c2 = %s\n",c2); // prints garbage
- return 0;
- }
为什么source1和source2的行为不同?(使用gcc -std = c11 -W -O3编译)
解决方法
在此代码段中
- {
- const char* source1 = "Hello";
- c1 = source1;
- const char source2[] = "Hi"; //isn't "Hi" in the same memory region as "Hello" ?
- c2 = source2;
- }
source2是代码块的本地字符数组,在退出结束括号后的块时将被销毁.
至于字符文字,它有静态存储持续时间.因此,退出代码块后,指向字符串文字的指针将有效.字符串文字将与字符数组相对.
考虑到在C中字符串文字“Hello”的类型是char [6].这是任何字符串文字的类型是非const字符数组.不过你可能不会改变字符串文字.与C中的C相反,字符文字具有const字符数组的类型.