我想定义一个多维的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;
}
用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("%p\t%p\n", 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进行了修复,希望它也能恢复到受影响的早期版本。