据我所知,字符串文字像" 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编译)
答案 0 :(得分:9)
在此代码段中
{
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字符数组的类型。
答案 1 :(得分:5)
const char* source1 = "Hello";
source1
只是指向内存位置的指针,其中定义了Hello
。
const char source2[] = "Hi";
source2
是字符数组类型的局部变量,并且有另一个地址,即字符串文字Hi
。在第一个}
source2被销毁后,c2
将被指向某个位置,但不会指向source2
的位置,因此在取消引用c2
之后,它只是未定义的行为source2
被摧毁。
答案 2 :(得分:1)
“ Hi”和“ Hello”不在同一存储区域吗?
您(巧妙)误会了。 "Hello"
本身是类型为({const
)char *
的表达式,而char source2[] = "Hi";
是< em> statement 定义,声明和初始化char [3]
对象。看不到const char *
。在功能范围内,该对象具有自动存储期限。
在您的用法中,source2
在下一个}
处不复存在,并使c2
成为无效指针。以后c2
的使用是不确定的。