Vil*_*ray 8 c++ pointers g++ c-strings language-lawyer
我想定义一个多维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;
}
Run Code Online (Sandbox Code Playgroud)
在以下位置编译gcc -std=c18 -pedantic test.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;
}
Run Code Online (Sandbox Code Playgroud)
如我所料,空字符串文字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;
}
Run Code Online (Sandbox Code Playgroud)
在以下位置编译g++ -std=c++17 -pedantic test.cpp并执行结果:
$ ./a.out
0x55d95410f004 0x55d95410f008
Run Code Online (Sandbox Code Playgroud)
在这里,in的空字符串文字strArr[1][0]衰减为空指针。为什么在C ++中会发生这种情况?
在C ++ 17标准中,我在5.13.5第16段中看到以下内容:
普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为“ n const char的数组”,其中n是下面定义的字符串的大小,并且具有静态存储持续时间(6.7)。
这似乎表明空字符串文字(即普通字符串文字)应具有静态存储期限。那么,为什么一个空字符串字面量会衰减为空指针?