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

维尔赫姆·格雷(Vilhelm Gray)

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

这似乎表明空字符串文字(即普通字符串文字)应具有静态存储期限。那么,为什么一个空字符串字面量会衰减为空指针呢?

维尔赫姆·格雷(Vilhelm Gray)

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

该回归已在GCC 9.3版中修复,并且有望将其恢复到受影响的早期版本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么解析空字符串文字时,Parslet(在Ruby中)会返回空数组?

来自分类Dev

为什么解析空字符串文字时,Parslet(在Ruby中)会返回空数组?

来自分类Dev

为什么JS中的空数组加false会返回字符串?

来自分类Dev

为什么将空字符串文字视为true?

来自分类Dev

为什么在JavaScript中不空字符串== null

来自分类Dev

当我的默认数组为空时,为什么猫鼬用空字符串调用验证器?

来自分类Dev

为什么字符串文字可与指针媲美?

来自分类Dev

为什么字符串文字可与指针媲美?

来自分类Dev

空字符串和'\ 0'char有什么区别?(从指针和数组的角度来看)

来自分类Dev

为什么这个假值会转换为空字符串而不是 0?

来自分类Dev

为什么contains()方法在Java中的非空字符串中找到空字符串

来自分类Dev

是什么原因初始化或为C中的char指针或C ++中的const char指针分配空字符串文字?

来自分类Dev

由于数组会衰减到指针,所以为什么不能应用const?

来自分类Dev

删除字符串数组中的空字符串

来自分类Dev

字符串数组中的空字符串

来自分类Dev

为什么在Chrome中存储为变量“名称”的数组会转换为字符串?

来自分类Dev

为什么我的字符串数组变为空-C

来自分类Dev

为什么添加两个空字符串的结果不为空?

来自分类Dev

为什么可空 cursor.getString() 赋值给不可空字符串编译?

来自分类Dev

为什么与字符串文字不同,具有单独字符的字符数组不以空终止符结尾?

来自分类Dev

为什么从字符串返回的空数组在golang中的长度为1?

来自分类Dev

Groovy:为什么按空格split()对一个空字符串进行返回会返回一个空字符串的列表?

来自分类Dev

C ++为什么可以初始化一个空字符串数组?

来自分类Dev

替换多维数组中的字符串

来自分类Dev

为什么 s[0] 是 C++ 中空字符串 s 的空字符串?

来自分类Dev

为什么不将字符串文字作为对数组的引用而不是不透明的指针传递?

来自分类Dev

为什么在JavaScript中空字符串文字的计算结果为false?

来自分类Dev

为什么在JavaScript中空字符串文字的计算结果为false?

来自分类Dev

为什么mcrypt加密在最终字符串中包含很多空字符?

Related 相关文章

  1. 1

    为什么解析空字符串文字时,Parslet(在Ruby中)会返回空数组?

  2. 2

    为什么解析空字符串文字时,Parslet(在Ruby中)会返回空数组?

  3. 3

    为什么JS中的空数组加false会返回字符串?

  4. 4

    为什么将空字符串文字视为true?

  5. 5

    为什么在JavaScript中不空字符串== null

  6. 6

    当我的默认数组为空时,为什么猫鼬用空字符串调用验证器?

  7. 7

    为什么字符串文字可与指针媲美?

  8. 8

    为什么字符串文字可与指针媲美?

  9. 9

    空字符串和'\ 0'char有什么区别?(从指针和数组的角度来看)

  10. 10

    为什么这个假值会转换为空字符串而不是 0?

  11. 11

    为什么contains()方法在Java中的非空字符串中找到空字符串

  12. 12

    是什么原因初始化或为C中的char指针或C ++中的const char指针分配空字符串文字?

  13. 13

    由于数组会衰减到指针,所以为什么不能应用const?

  14. 14

    删除字符串数组中的空字符串

  15. 15

    字符串数组中的空字符串

  16. 16

    为什么在Chrome中存储为变量“名称”的数组会转换为字符串?

  17. 17

    为什么我的字符串数组变为空-C

  18. 18

    为什么添加两个空字符串的结果不为空?

  19. 19

    为什么可空 cursor.getString() 赋值给不可空字符串编译?

  20. 20

    为什么与字符串文字不同,具有单独字符的字符数组不以空终止符结尾?

  21. 21

    为什么从字符串返回的空数组在golang中的长度为1?

  22. 22

    Groovy:为什么按空格split()对一个空字符串进行返回会返回一个空字符串的列表?

  23. 23

    C ++为什么可以初始化一个空字符串数组?

  24. 24

    替换多维数组中的字符串

  25. 25

    为什么 s[0] 是 C++ 中空字符串 s 的空字符串?

  26. 26

    为什么不将字符串文字作为对数组的引用而不是不透明的指针传递?

  27. 27

    为什么在JavaScript中空字符串文字的计算结果为false?

  28. 28

    为什么在JavaScript中空字符串文字的计算结果为false?

  29. 29

    为什么mcrypt加密在最终字符串中包含很多空字符?

热门标签

归档