strings initialize examples definir declarar array c++ c string arrays array-initialization

c++ - examples - initialize array c



Los apoyos alrededor de cadena literal en la declaración de matriz de caracteres son válidos?(por ejemplo, char s[]={"Hello World"}) (6)

[...] De hecho, si lo cambio a char * s [] = {"Hello World"}; el compilador lo acepta también, como se esperaba

El compilador lo acelera, porque en realidad, está creando una matriz 2D de elementos de tamaño indefinidos, donde almacenó solo un elemento, la cadena "Hello World" . Algo como esto:

char* s[] = {"Hello world", "foo", "baa" ...};

No puede omitir los bracets en este caso.

Por accidente, encontré que la línea char s[] = {"Hello World"}; está compilado correctamente y parece tratarse igual que char s[] = "Hello World"; . ¿No es el primero ( {"Hello World"} ) una matriz que contiene un elemento que es una matriz de caracteres, por lo que la declaración para s debe leer char *s[] ? De hecho, si lo cambio a char *s[] = {"Hello World"}; el compilador lo acepta también, como se esperaba.

Buscando una respuesta, el único lugar que encontré que mencionó esto es este, pero no hay citas del estándar.

Entonces mi pregunta es por qué la línea char s[] = {"Hello World"}; se compila aunque el lado izquierdo es de tipo array of char y el lado derecho es de tipo array of array of char ?

Lo que sigue es un programa de trabajo:

#include<stdio.h> int main() { char s[] = {"Hello World"}; printf("%s", s); // Same output if line above is char s[] = "Hello World"; return 0; }

Gracias por cualquier aclaración.

PD: mi compilador es gcc-4.3.4.


Cualquier variable en ( int , char , etc.) es solo una matriz de longitud 1.

char s = {0};

funciona también


Está permitido porque el estándar lo dice: C99 sección 6.7.8, §14:

Una matriz de tipo de caracteres puede inicializarse mediante un literal de cadena de caracteres, opcionalmente encerrado entre llaves. Los caracteres sucesivos del literal de cadena de caracteres (incluido el carácter nulo de terminación si hay espacio o si el conjunto es de tamaño desconocido) inicializan los elementos del conjunto.

Lo que esto significa es que ambos

char s[] = { "Hello World" };

y

char s[] = "Hello World";

no son más que azúcar sintáctico para

char s[] = { ''H'', ''e'', ''l'', ''l'', ''o'', '' '', ''W'', ''o'', ''r'', ''l'', ''d'', 0 };

En una nota relacionada (misma sección, §11), C también permite llaves alrededor de inicializadores escalares como

int foo = { 42 };

que, por cierto, encaja muy bien con la sintaxis de los literales compuestos

(int){ 42 }


Esto también lo permite el estándar C ++, cita:

[dcl.init.string] §1

Una matriz de tipo de caracteres angostos ([basic.fundamental]), char16_t array, char32_t array o wchar_t array se puede inicializar con un string de cadena literal, char16_t string literal, char32_t string literal o wide string literal, respectivamente, o mediante un literal de cadena de tipo apropiado entre llaves ([lex.string]). [recorte]


Las llaves son opcionales, y la expresión es equivalente a solo una matriz de char.

También puedes escribir esto:

int a = {100}; //ok

Demostración: http://ideone.com/z0psd

De hecho, C++11 generaliza esta misma sintaxis, para inicializar no-arrays, así como matrices, uniformemente. Entonces en C++11 , puedes tener estos:

int a{}; //a is initialized to zero, and it is NOT an array int b[]{1,2,3,4}; //b is an array of size 4 containing elements 1,2,3,4 int c[10]{}; //all 10 elements are initialized to zero int *d{}; //pointer initialized to nullptr std::vector<int> v{1,2,3,4,5}; //vector is initialized uniformly as well.


Podría estar equivocado, pero creo que esto no es una matriz de matrices de caracteres, sino que un bloque contiene una matriz de caracteres. int a = {1}; puede funcionar también