2008-09-08 15 views

Respuesta

22

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.

1

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).

+0

Los bytes finales de la matriz también serán cero bytes. –

3

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.

+0

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. –

-4

No hay diferencia. Ambos generarán un error de compilación en el símbolo no declarado. : P

+0

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é. –

16

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.

+0

¡Observación importante! – jfm3

+1

Esta es una gran respuesta. Esto también me hizo entender por qué 'char a [2] =" be "' no sería sabio. – Pithikos

+0

¿Los elementos también se inicializan en '\ 0' cuando se asigna memoria a una cadena a través de malloc? – Lokesh

1

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.

Cuestiones relacionadas