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

问题描述 投票:5回答:2

我想定义一个多维的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)。

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

c++ pointers g++ language-lawyer c-strings
2个回答
0
投票

没有这种衰减;您观察到的输出是编译器错误。

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


0
投票

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

回归已针对GCC版本9.3进行了修复,希望它也能恢复到受影响的早期版本。

© www.soinside.com 2019 - 2024. All rights reserved.