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

Why does an empty string literal in a multidimensional array decay to a null pointer?

本文关键字:衰减 文本 空指针 字符串 数组 为什么      更新时间:2023-10-16

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

#include <stdio.h>
const char *strArr[2][1] = { {"foo"}, {""}};
int main(void) {
printf("%pt%pn", strArr[0][0], strArr[1][0]);
return 0;
}

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

$ ./a.out 
0x55d95410f004  0x55d95410f008

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


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

#include <cstdio>
const char *strArr[2][1] = { {"foo"}, {""}};
int main(void) {
printf("%pt%pn", strArr[0][0], strArr[1][0]);
return 0;
}

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

$ ./a.out 
0x55c61494d004  (nil)

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


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

普通字符串文本

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

这似乎表明空字符串文本(作为普通字符串文本(应具有静态存储持续时间。那么,为什么空字符串文字会衰减为空指针呢?

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

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

没有这样的衰减;你观察到的输出是一个编译器错误。

(是的,这是一个简短的答案,但没有其他要补充的(。