Respuesta
Puesto que ya declarado los tamaños, las dos declaraciones son exactamente iguales. Sin embargo, si no se especifica los tamaños, se puede ver que la primera declaración hace una cadena más grande:
char a[] = "a\0";
char b[] = "a";
printf("%i %i\n", sizeof(a), sizeof(b));
impresiones
3 2
Esto se debe a extremos con dos nulos (el explícito y el implícito) mientras que b termina solo con el implícito.
A menos que me equivoque, el primero inicializará 2 caracteres a 0 (el '\ 0' y el terminador que está siempre allí, y dejará el resto sin tocar, y el último solo inicializará 1 char (el terminador).
Como otros han señalado, "" implica un terminador '\ 0', por lo que "\ 0" en realidad se inicializa la matriz con dos caracteres nulos.
Algunos otros que responden han dado a entender que se trata de "la misma ", pero eso no es del todo correcto. Puede que no haya ninguna diferencia práctica: siempre que la única forma en que se use la matriz sea hacer referencia a ella como una cadena C que comience con el primer carácter. Pero tenga en cuenta que sí resultan en dos memoria diferente initalizati ons, en particular difieren en si Str [1] es definitivamente cero, o no está inicializado (y podría ser cualquier cosa, dependiendo del compilador, sistema operativo y otros factores aleatorios). Hay algunos usos de la matriz (tal vez no útiles, pero aún) que tendrían diferentes comportamientos.
En el contexto de la pregunta, donde se especifica el tamaño de la matriz, los resultados son idénticos - letra ''a'' seguida de 31 bytes nulos,'' \ 0''. Solo en el contexto de una matriz sin tamaño existe una diferencia. –
No hay diferencia. Ambos generarán un error de compilación en el símbolo no declarado. : P
Presumiblemente, se está refiriendo a la versión original de la pregunta donde el código era 'Str [32] =" \ 0 ";' y 'Str [32] =" ";' y afirman que estos deberían generar un error de compilación . Depende del contexto, por supuesto. Si se trata como 'definiciones' (como lo son en la versión revisada de la pregunta), entonces el tipo ('char') faltaba. Si supone 'char * Str [33];' como una definición anterior, ambas son significativas (pero las cadenas apuntadas son diferentes), pero diferentes de las que asume el resto de las respuestas. Esta respuesta no es útil porque no explica por qué. –
Bueno, suponiendo que los dos casos son los siguientes (para evitar los errores del compilador):
char str1[32] = "\0";
char str2[32] = "";
Como ya se ha indicado, str1 se inicia con dos caracteres nulos:
char str1[32] = {'\0','\0'};
char str2[32] = {'\0'};
Sin embargo , según el estándar C y C++, si se inicializa parte de una matriz, los elementos restantes de la matriz se inicializan por defecto. Para una matriz de caracteres, los caracteres restantes son todos cero inicializado (es decir, los caracteres nulos), por lo que las matrices son realmente inicializa como:
char str1[32] = {'\0','\0','\0','\0','\0','\0','\0','\0',
'\0','\0','\0','\0','\0','\0','\0','\0',
'\0','\0','\0','\0','\0','\0','\0','\0',
'\0','\0','\0','\0','\0','\0','\0','\0'};
char str2[32] = {'\0','\0','\0','\0','\0','\0','\0','\0',
'\0','\0','\0','\0','\0','\0','\0','\0',
'\0','\0','\0','\0','\0','\0','\0','\0',
'\0','\0','\0','\0','\0','\0','\0','\0'};
Así que, al final, realmente no hay diferencia entre los dos.
hmmm ¿qué tal inicializar con un puntero?
char *myString = "Here is a string";
aunque por razones tradicionales Yo prefiero usar:
unsigned char *myString = "Here is a string";
En este caso la terminación nula está incrustado por el compilador. Puede apuntar el puntero a otra cadena y usted es independiente apuntando cualquier longitud de cadena.
- 1. JavaScript cadena de inicialización
- 2. C++ cadena de inicialización del campo
- 3. Array cadena de inicialización como parámetro constructor
- 4. ¿La inclusión de {} importa en la inicialización de cadena C?
- 5. cadenas de inicialización como nulo vs cadena vacía
- 6. Inicialización matriz de caracteres con la cadena más pequeña literal
- 7. inicialización de punteros de char
- 8. ¿Una cadena literal cuenta como inicializador parcial e inicialización cero?
- 9. Inicialización C# matriz con nueva inicialización vs
- 10. inicialización de una matriz bidimensional de cadenas
- 11. inicialización SSLContext
- 12. Inicialización de cadenas de línea múltiple
- 13. Colección inicialización
- 14. unión inicialización
- 15. hashes Inicialización
- 16. Python inicialización
- 17. Inicialización sobre declaración contra la inicialización de constructores
- 18. C++ copia de inicialización e inicialización directa, el caso extraño
- 19. Lista de inicialización del constructor con inicialización vacía
- 20. SBCL archivo de inicialización
- 21. objeto sintaxis de inicialización
- 22. Inicialización de Python segfault
- 23. C++ vector de inicialización
- 24. inicialización de variables estáticas
- 25. ¿Inicialización de variable estática?
- 26. inicialización de log4net
- 27. AVAudioPlayer error de inicialización
- 28. Inicialización uniforme de referencias
- 29. Inicialización de CLLocationDegrees
- 30. Inicialización de NSArrayController
Los bytes finales de la matriz también serán cero bytes. –