为什么多维数组中的空字符串文本衰减为空指针?
Why does an empty string literal in a multidimensional array decay to a null pointer?
我想定义一个多维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的回归已修复,并且希望也能恢复到受影响的早期版本。
没有这样的衰减;你观察到的输出是一个编译器错误。
(是的,这是一个简短的答案,但没有其他要补充的(。
相关文章:
- 文本文件中的单词链表
- 从命令行c++发送文本文件名
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 2D数组来自文本输入,中间有空格
- 如何将内容数组写入文本文件?
- 无法通过空白将文本文件行分隔为矢量
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- C++将文本文件中的数据读取到结构数组中
- 在指针的帮助下,文本文件中单词的频率
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将值从二维数组输出到文本文件
- 如何在c++中从文本文件中逐行读取整数
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何根据单词在文本中出现的概率输出单词
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- C++试图读取一个文件并输出到另一个文本文件
- 为什么多维数组中的空字符串文本衰减为空指针?