据我所知,像"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编译)
发布于 2015-03-12 11:26:48
在这个代码片段中
{
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字符数组。
发布于 2015-03-12 11:25:30
const char* source1 = "Hello";source1只是内存位置的指针,其中定义了Hello .
const char source2[] = "Hi";source2是字符类型数组的局部变量,并具有另一个地址,即字符串-文字Hi。在第一次} source2被销毁之后,c2将被指向某个地方,而不是在source2的位置上,因此,在source2被销毁后,这只是取消引用c2的未定义行为。
发布于 2018-12-20 15:26:14
"Hi“不是和"Hello”在同一个内存区域吗?
你(巧妙地)错了。"Hello"本身就是(const) char *类型的表达式,而char source2[] = "Hi";是定义、声明和初始化char [3]对象的语句。在视线中看不到const char *。在函数范围中,对象具有自动存储持续时间。
在您的使用中,source2在下面的}中不再存在,并使c2成为无效的指针。后来对c2的使用还没有定义。
https://stackoverflow.com/questions/29008425
复制相似问题