Ich möchte ein mehrdimensionales C-String-Array definieren, das durch mehrere String-Literale initialisiert wird. In C würde ich folgendes tun:
#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;
}
Kompilieren mit gcc -std=c18 -pedantic test.c
und Ausführen von Ergebnissen in:
$ ./a.out
0x55d95410f004 0x55d95410f008
Wie ich erwartet habe, strArr[1][0]
zerfällt das leere String-Literal in einen gültigen Zeiger.
Wenn ich jedoch denselben Code in C ++ versuche :
#include <cstdio>
const char *strArr[2][1] = { {"foo"}, {""}};
int main(void) {
printf("%p\t%p\n", strArr[0][0], strArr[1][0]);
return 0;
}
Kompilieren mit g++ -std=c++17 -pedantic test.cpp
und Ausführen von Ergebnissen in:
$ ./a.out
0x55c61494d004 (nil)
Hier strArr[1][0]
zerfällt das leere String-Literal in einen Nullzeiger. Warum passiert das in C ++?
Im C ++ 17-Standard sehe ich in 5.13.5 Absatz 16 Folgendes :
Gewöhnliche String-Literale und UTF-8-String-Literale werden auch als schmale String-Literale bezeichnet. Ein schmales String-Literal hat den Typ "Array von n const char", wobei n die Größe des Strings ist, wie unten definiert, und eine statische Speicherdauer (6.7) hat.
Dies scheint darauf hinzudeuten, dass ein leeres String-Literal als gewöhnliches String-Literal eine statische Speicherdauer haben sollte. Warum sollte ein leeres String-Literal in einen Nullzeiger zerfallen?
std::array
?Antworten:
Dieses Verhalten ist nicht korrekt und in diesem Fall das Ergebnis einer Regression im GCC : https://gcc.gnu.org/PR90947
Die Regression wurde für GCC Version 9.3 behoben und sollte hoffentlich auch zu den früheren betroffenen Versionen zurückkehren.
quelle
Es gibt keinen solchen Verfall; Die Ausgabe, die Sie beobachtet haben, ist ein Compiler-Fehler.
(Ja, dies ist eine kurze Antwort, aber es gibt nichts hinzuzufügen).
quelle