¿Por qué este programa en C detecta dos caracteres ‘\0’ en una cadena cuando se descomenta una línea de código no relacionada?
Actualmente estoy aprendiendo C y escribí este programa para comprobar si el carácter ‘\0’ realmente está al final de las cadenas, como se indica en “K and R”.
Sin embargo, obtuve un resultado extraño.
Si comento la declaración “int lista[] = {0, 1, 2, 3, 4};” del programa (esta es una declaración que no tiene nada que ver con las otras declaraciones de este programa, era parte de otra prueba que iba a hacer), la salida del programa sale como se esperaba, detectando un carácter ‘\0’ al final de la cadena.
Sin embargo, si dejo la declaración sin comentar, la salida del programa detecta dos carácter ‘\0’ al final de la cadena.
¿Por qué sucede esto?
Este es el programa con la declaración sin comentar:
#include <stdio.h>
int main(void)
{
int lista[] = {0, 1, 2, 3, 4};
char string[] = "linhas";
for (int i = 0; i <= sizeof(string); i++)
{
if (string[i] != '\0')
{
printf("%c\n", string[i]);
}
else
{
printf("este maldito carácter nulo\n");
}
}
}
Esto produce este resultado:
l
i
n
h
a
s
este maldito carácter nulo
este maldito carácter nulo
Este es el programa con la línea comentada:
#include <stdio.h>
int main(void)
{
/int lista[] = {0, 1, 2, 3, 4};/
char string[] = "linhas";
for (int i = 0; i <= sizeof(string); i++)
{
if (string[i] != '\0')
{
printf("%c\n", string[i]);
}
else
{
printf("este maldito carácter nulo\n");
}
}
}
produce:
l
i
n
h
a
s
este maldito carácter nulo
davy.ai
Explicación
El problema es causado por la condición del bucle
for
, que está comprobandoi <= sizeof(string)
.En el primer programa, donde
int lista[] = {0, 1, 2, 3, 4};
está descomentado, el tamaño del arraystring
es en realidad más grande que la longitud de la palabra “linhas” debido a la presencia del arrayint
lista
. El operadorsizeof
devuelve el tamaño total del arraystring
más el arraylista
.Por lo tanto, la condición
i <= sizeof(string)
está haciendo que el bucle continúe iterando más allá del final del arraystring
, hasta que llega al final del array combinado más grande. Y como el arraylista
no está inicializado con ningún valor, los caracteres extra leídos son caracteres nulos, que se muestran como “this dawmn null char”.En el segundo programa, donde el array
lista
está comentado, el operadorsizeof
devuelve correctamente el tamaño sólo del arraystring
. Por lo tanto, la condición del buclei <= sizeof(string)
se detiene al final del arraystring
, lo que resulta en la detección y visualización de sólo un carácter nulo.Para solucionar este problema, la condición del bucle debe cambiarse a
i < sizeof(string)
, de modo que se detenga al final del arraystring
, independientemente del tamaño de cualquier otro array.Aquí está el código corregido:
“`
#include <stdio.h>
int main(void)
{
int lista[] = {0, 1, 2, 3, 4};
char string[] = “linhas”;
}
“`</stdio.h>