const char * vs const char []

时间:2015-03-12 11:21:19

标签: c++ c

据我所知,字符串文字像" 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编译)

3 个答案:

答案 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" 本身是类型为({constchar *表达式,而char source2[] = "Hi";是< em> statement 定义,声明和初始化char [3]对象。看不到const char *。在功能范围内,该对象具有自动存储期限。

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