为什么多维数组中的空字符串文字会衰减为空指针?

Vil*_*ray 8 c++ pointers g++ c-strings language-lawyer

我想定义一个多维C字符串数组,该数组由多个字符串文字初始化。在C语言中,我将执行以下操作:

#include <stdio.h>

const char *strArr[2][1] = { {"foo"}, {""}};

int main(void) {
    printf("%p\t%p\n", strArr[0][0], strArr[1][0]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在以下位置编译gcc -std=c18 -pedantic test.c并执行结果:

#include <stdio.h>

const char *strArr[2][1] = { {"foo"}, {""}};

int main(void) {
    printf("%p\t%p\n", strArr[0][0], strArr[1][0]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如我所料,空字符串文字strArr[1][0]会衰减为有效的指针。


但是,当我在C ++中尝试相同的代码时:

#include <cstdio>

const char *strArr[2][1] = { {"foo"}, {""}};

int main(void) {
    printf("%p\t%p\n", strArr[0][0], strArr[1][0]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在以下位置编译g++ -std=c++17 -pedantic test.cpp并执行结果:

$ ./a.out 
0x55d95410f004  0x55d95410f008
Run Code Online (Sandbox Code Playgroud)

在这里,in的空字符串文字strArr[1][0]衰减为空指针。为什么在C ++中会发生这种情况?


在C ++ 17标准中,我在5.13.5第16段中看到以下内容:

普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为“ n const char的数组”,其中n是下面定义的字符串的大小,并且具有静态存储持续时间(6.7)。

这似乎表明空字符串文字(即普通字符串文字)应具有静态存储期限。那么,为什么一个空字符串字面量会衰减为空指针?

Vil*_*ray 2

这种行为是不正确的,在这种情况下是GCC回归的结果: https: //gcc.gnu.org/PR90947

GCC 9.3 版的回归已得到修复,并且有望恢复到受影响的早期版本。