Cuerdas sin un carácter ‘\ 0’?

Si por error, defino una matriz de caracteres sin ‘\ 0’ como su último carácter, ¿qué sucede entonces? Lo pregunto porque noté que si trato de recorrer en iteración la matriz while (cnt! = ‘\ 0’), donde cnt es una variable int que se usa como índice para la matriz e imprime simultáneamente los valores cnt para monitorear ¿Qué sucede? La iteración se detiene en el último carácter + 2.Los caracteres adicionales son, por supuesto, aleatorios, pero no entiendo por qué tiene que detenerse después de 2. ¿El comstackdor inserta automáticamente un carácter ‘\ 0’? sería apreciado.

Para que quede claro, doy un ejemplo. Digamos que la matriz “str” ​​contiene la palabra doh (sin ‘\ 0’). Imprimir la variable cnt en cada bucle me daría este doh + o doh ^ y así sucesivamente.

EDITAR (comportamiento indefinido)

El acceso a los elementos de la matriz fuera de los límites de la matriz es un comportamiento indefinido.
Llamar a las funciones de cadena con cualquier otra cosa que no sea una cadena C es un comportamiento indefinido.
No lo hagas

La cadena de CA es una secuencia de bytes terminados por e incluyendo un '\0' (terminador NUL). Todos los bytes deben pertenecer al mismo objeto.


De todos modos, lo que ves es una coincidencia!

Pero podría suceder así

                         , ------------------ basura
                         |  , ---------------- str [cnt] (cuando cnt == 4, sin verificación de límites)
 memoria ----> [... | d | o | h | * | 0 | 0 | 0 | 4 | ...]
                   |  |  \ _____ / -------- cnt (big-endian, correctamente alineado de 4 bytes)
                   \ ___ / ------------------ str

Si define una matriz de caracteres sin la terminación \0 (denominada “terminador nulo”), entonces su cadena, bueno, no tendrá ese terminador. Lo harías así:

 char strings[] = {'h', 'e', 'l', 'l', 'o'}; 

El comstackdor nunca inserta automáticamente un terminador nulo en este caso. El hecho de que su código se detenga después de “+2” es una coincidencia; podría detenerse fácilmente en +50 o en cualquier otro lugar, dependiendo de si había un carácter \ 0 en la memoria después de su cadena.

Si define una cadena como:

 char strings[] = "hello"; 

Entonces eso será terminado nulo. Cuando usa comillas como esa en C, entonces aunque no pueda verlo físicamente en el editor de texto, hay un terminador nulo al final de la cadena.

Hay algunas funciones relacionadas con la cadena C que automáticamente agregarán un terminador nulo. Esto no es algo que hace el comstackdor, sino parte de la especificación de la función en sí. Por ejemplo, strncat () , que concatena una cadena a otra, agregará el terminador nulo al final.

Sin embargo, si una de las cadenas que utiliza no tiene ese terminador, entonces esa función no sabrá dónde termina la cadena y terminará con valores de basura (o un error de segmentación).

Esto sucedería si, por coincidencia, el byte en *(str + 5) es 0 (como un número, no ASCII)

En lenguaje C, el término cadena se refiere a una matriz de caracteres terminada en cero . Así que, hablando en términos pediátricos, no existe tal cosa como “cadenas sin un carácter ‘\ 0′”. Si no está terminada en cero, no es una cadena.

Ahora, no hay nada de malo en tener un simple conjunto de caracteres sin ceros, siempre y cuando entiendas que no es una cadena. Si alguna vez intentas trabajar con una matriz de caracteres como si fuera una cadena, el comportamiento de tu progtwig no está definido . Cualquier cosa puede suceder. Puede parecer que “funciona” por algunas razones mágicas. O podría estrellarse todo el tiempo. Realmente no importa lo que realmente hará un progtwig así, ya que si el comportamiento no está definido, el progtwig es inútil.

En lo que respecta a la mayoría de las funciones de manejo de cadenas, las cadenas siempre se detienen en un carácter '\0' . Si extraña este terminador nulo en alguna parte, usualmente sucederá una de tres cosas:

  • Su progtwig continuará leyendo más allá del final de la cadena hasta que encuentre un '\0' que acaba de estar allí. Existen varias formas para que dicho personaje esté allí, pero ninguna de ellas suele ser predecible de antemano: podría ser parte de otra variable, parte del código ejecutable o incluso parte de una cadena más grande que se almacenó previamente en el mismo búfer. Por supuesto, para cuando esto suceda, el progtwig puede haber procesado una cantidad significativa de basura. Si ve mucha basura producida por un printf() , una cadena no terminada es una causa común.

  • Su progtwig continuará leyendo más allá del final de la cadena hasta que intente leer una dirección fuera de su espacio de direcciones, causando un error de memoria (por ejemplo, el temido “Error de segmentación” en los sistemas Linux).

  • Su progtwig se quedará sin espacio al copiar sobre la cadena y, nuevamente, causará un error de memoria.

Y no, el comstackdor de C normalmente no hará nada más que lo que especifique en su progtwig, por ejemplo, no terminará una cadena por sí solo. Esto es lo que hace que C sea tan potente y también tan difícil de codificar.

Apuesto a que un int se define justo después de su cadena y que este int solo toma valores pequeños de modo que al menos un byte es 0.