Inicialización de cadena

Cuál es la diferencia entre

char Str[32] = "\0"; 

y

 char Str[32] = ""; 

Como ya declaraste los tamaños, las dos declaraciones son exactamente iguales. Sin embargo, si no especifica los tamaños, puede ver que la primera statement hace una cadena más grande:

 char a[] = "a\0"; char b[] = "a"; printf("%i %i\n", sizeof(a), sizeof(b)); 

huellas dactilares

 3 2 

Esto se debe a que a termina con dos nulos (el explícito y el implícito), mientras que b termina solo con el implícito.

Bueno, asumiendo que los dos casos son los siguientes (para evitar errores de comstackción):

 char str1[32] = "\0"; char str2[32] = ""; 

Como lo ha dicho la gente, str1 se inicializa con dos caracteres nulos:

 char str1[32] = {'\0','\0'}; char str2[32] = {'\0'}; 

Sin embargo, de acuerdo con 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 inicializados (es decir, caracteres nulos), por lo que las matrices realmente se inicializan 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'}; 

Entonces, al final, realmente no hay diferencia entre los dos.

Como han señalado otros, “” implica un carácter ‘\ 0’ de terminación, por lo que “\ 0” en realidad inicializa la matriz con dos caracteres nulos.

Algunos otros respondedores han implicado que esto es “lo mismo”, pero eso no es del todo correcto. Puede que no haya diferencias prácticas, siempre que la única forma en que se use la matriz sea hacer referencia a ella como una cadena C que comienza con el primer carácter. Pero tenga en cuenta que, de hecho, dan como resultado dos inicializaciones de memoria diferentes, en particular, difieren en si Str [1] es definitivamente cero o no está inicializado (y podría ser cualquier cosa, según el comstackdor, el sistema operativo y otros factores aleatorios). Hay algunos usos de la matriz (tal vez no sea útil, pero aún así) que tendrían comportamientos diferentes.

A menos que me equivoque, el primero inicializará 2 caracteres a 0 (el ‘\ 0’ y el terminador que siempre está ahí, y dejará el rest sin tocar, y el último inicializará solo 1 carácter (el terminador).

hmmm ¿qué hay de inicializar con un puntero?

 char *myString = "Here is a string"; 

Aunque por razones tradicionales prefiero usar:

 unsigned char *myString = "Here is a string"; 

En este caso, la terminación nula es incrustada por el comstackdor. Puede apuntar el puntero a otra cadena y es independiente apuntar a cualquier longitud de cadena.

No hay diferencia. Ambos generarán un error de comstackción en un símbolo no declarado. :PAG