Eu quero definir uma matriz multidimensional de string C, inicializada por vários literais de string. Em C, eu faria o seguinte:
#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;
}
Compilando gcc -std=c18 -pedantic test.c
e executando resultados em:
$ ./a.out
0x55d95410f004 0x55d95410f008
Como eu esperava, a string vazia literal se strArr[1][0]
deteriora para um ponteiro válido.
No entanto, quando tento o mesmo código em 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;
}
Compilando g++ -std=c++17 -pedantic test.cpp
e executando resultados em:
$ ./a.out
0x55c61494d004 (nil)
Aqui, a string vazia literal se strArr[1][0]
deteriora para um ponteiro nulo. Por que isso acontece em C ++?
No padrão C ++ 17, vejo o seguinte no parágrafo 5.13.5 16 :
Literais de sequência ordinária e literais de sequência UTF-8 também são chamados de literais de sequência estreita. Um literal de cadeia estreita tem o tipo "array de n const char", em que n é o tamanho da cadeia, conforme definido abaixo, e tem duração de armazenamento estático (6.7).
Isso parece indicar que um literal de string vazio, sendo um literal de string comum, deve ter duração de armazenamento estático. Então, por que uma string vazia literal se deterioraria para um ponteiro nulo?
std::array
?Respostas:
Esse comportamento não está correto e, neste caso, é o resultado de uma regressão no GCC : https://gcc.gnu.org/PR90947
A regressão foi corrigida para a versão 9.3 do GCC e, esperamos, também deve retornar às versões anteriores afetadas.
fonte
Não existe tal decadência; a saída que você observou é um erro do compilador.
(Sim, esta é uma resposta curta, mas não há mais nada a acrescentar).
fonte