常量字符* vs 常量字符[]

const char* vs const char[]

本文关键字:常量 字符 vs      更新时间:2023-10-16

据我所知,像"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 = %sn", c1); // prints Hello
    printf("c2 = %sn", c2); // prints garbage
    return 0;
}

为什么源 1 和源 2 的行为不同?(使用 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] 。也就是说,任何字符串文字的类型都是非常量字符数组。不过,您不能长弦文字。与 C 相反C++字符文本具有常量字符数组的类型。

const char* source1 = "Hello";

source1只是内存位置上的指针,其中定义了Hello

const char source2[] = "Hi";

source2 是字符数组类型的局部变量,并具有另一个地址,即字符串文字Hi。在第一次}之后,source2将被销毁,c2将被指向某个地方,但不在source2的位置上,所以在source2被销毁后取消引用c2只是未定义的行为。

"嗨"与"你好"不是在同一个内存区域中吗?

你(巧妙地)错了。 "Hello"本身是一个类型为(constchar *表达式,但char source2[] = "Hi";是一个定义、声明和初始化char [3]对象的语句。看不到const char *。在函数作用域中,该对象具有自动存储持续时间。

在您的用法中,source2在以下}中不复存在,并使c2成为无效指针。以后c2的使用是不确定的。