据我所知,像“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字符数组的类型.