我想定义一个多维的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)
在这里,in的空字符串文字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版中修复,并且有望将其恢复到受影响的早期版本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句