¿Cuál es el valor de una cadena no inicializada en c? [duplicate]

6 minutos de lectura

avatar de usuario
Nikunj Banka

Posible duplicado:

valor inicial de la matriz int en C

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(){
    char name[10];
    printf("%s\n", name);
    return 0;
}

¿Qué valor tiene una cadena no inicializada en C? ¿El compilador asigna automáticamente un almacenamiento de tamaño 10 y lo llena con valores basura? ¿Qué sucede básicamente al escribir el código anterior?

  • @Yuushi, el enlace es realmente útil. Pero, ¿existe una correspondencia directa entre las cadenas C y las matrices C int? ¿Podemos también inicializar todos los caracteres de la cadena a un valor específico, por ejemplo, escribiendo: char nombre[10] = {‘a’} ; ? (Podemos hacer esto para matrices C int como está escrito en la segunda respuesta a la pregunta que señaló).

    – Nikunj Banka

    5 de febrero de 2013 a las 8:06

  • La inicialización de int y char arrays es diferente, sí, y no puedes escribir char c[10] = {'a'} para inicializar un char matriz con todo a‘s (ni puedes hacer int x[10] = {1} para inicializar una matriz int con todos unos). Sin embargo, eso no es lo que estaba haciendo su pregunta. La pregunta tal como se establece es exactamente la misma y las respuestas son exactamente las mismas, independientemente del tipo.

    – Yuushi

    5 de febrero de 2013 a las 8:15


  • @Nikunj Banka No, no puede iniciar la matriz de caracteres de esta manera char name[10] = {'a'}. esto podría hacerse solo si desea iniciar con 0 como este char name[10] = {0}

    – MOHAMED

    5 de febrero de 2013 a las 8:15


  • @Yuushi, en qué inicialización de char y int ¿es diferente? char es solo un tipo entero en C como otros.

    – Jens Gusted

    5 de febrero de 2013 a las 8:23

  • Una “cadena no inicializada” suena inválida. ¿Cómo puedes estar seguro de que una secuencia termina en ‘\0’ sin poner el ‘\0’ allí? @MohamedKALLEL char name[10] = {'a'}; es una inicialización válida. Establecerá el primer byte en ‘a’ y los siguientes nueve bytes en 0.

    – autista

    5 de febrero de 2013 a las 8:41

Se asignan 10 bytes en la pila, eso es todo. Su valor se deja como está, lo que significa que es lo que se había escrito en esos 10 bytes antes de haber sido asignado.

  • ¿Y qué valores tienen estos 10 bytes? Si no se define nada, ¿tendré razón al decir que se asignan valores basura?

    – Nikunj Banka

    5 de febrero de 2013 a las 7:47

  • @NikunjBanka Sí, esto es correcto. Aunque no están asignados activamente. 🙂

    – junix

    5 de febrero de 2013 a las 7:48


  • @NikunjBanka: No se realiza ninguna asignación.

    – alk

    5 de febrero de 2013 a las 7:50


avatar de usuario
Ivailo Strandjev

Como la cadena no está inicializada, el valor no está definido; puede ser cualquier cosa. También diría que no es seguro imprimir una cadena no inicializada ya que no tiene un carácter cero de terminación, por lo que, en teoría, puede terminar imprimiendo más de 10 caracteres.

Y otra cosa – C no llena el almacenamiento con nada. Simplemente lo deja como está.

EDITAR: tenga en cuenta que no estoy diciendo que, siempre que tenga un carácter de terminación 0, sea seguro acceder a la cadena no inicializada. Invocar un comportamiento indefinido nunca es tan seguro como lo es indefinido – nunca se sabe lo que va a pasar.

  • +1 para “puede imprimir más de 10 caracteres”. Además, dijiste que no completará nada. ¿Pero qué pasa si declaro la cadena estática? Creo que el compilador no completará nada solo si se declara automático. Por favor, corríjame si estoy equivocado .

    – Nikunj Banka

    5 de febrero de 2013 a las 8:09


  • Como tal, esta respuesta está muy cerca de ser incorrecta/engañosa. Incluso si hay un 0 de terminación dentro de esos 10 bytes, aún invocaría un comportamiento indefinido para acceder a una variable no inicializada (una cadena c es diferente).

    – PP

    5 de febrero de 2013 a las 8:12

  • @KingsIndian Solo dije que no puede estar seguro de que solo se imprimirán 10 caracteres, nunca dije que está bien usar la variable si hay un carácter de terminación 0.

    – Ivailo Strandjev

    5 de febrero de 2013 a las 8:15

  • En mi opinión, da la impresión de que si hay un 0 de terminación dentro de la memoria asignada (10 bytes), está bien imprimirlo/acceder a él, lo cual es incorrecto.

    – PP

    5 de febrero de 2013 a las 8:16


  • @KingsIndian agregó una edición para abordar su inquietud.

    – Ivailo Strandjev

    5 de febrero de 2013 a las 8:20

El contenido de las variables no inicializadas es, aparte de, por ejemplo, en Java, indefinido. En otras palabras: el contenido consta de valores colocados en la pila últimamente para invocaciones de otros métodos.

En su ejemplo particular, probablemente serán ceros. Pero no importa

El punto clave es que es indefinido. Si no puedes confiar en que siempre será el mismo, no te sirve de nada. No puedes hacer suposiciones. Ninguna otra parte de su código puede depender de él. Es como si no existiera.

Si tiene curiosidad por saber de dónde provienen los contenidos reales, son restos de contextos de ejecución anteriores almacenados en la pila. Si ejecuta algunas llamadas de función, dejará basura por ahí que su programa se sentirá libre de sobrescribir. Esos bytes que solo sirven para sobrescribir pueden terminar en su cadena.

El estándar C usa el término “sin especificar”, es decir, puede ser cualquier cosa. En la vida real, lo más probable es que esté lleno de basura aleatoria, y si no tiene suerte, no tendrá un byte cero de terminación, por lo que invoca comportamiento indefinido y probablemente la llamada a printf() se bloqueará (falla de segmentación, ¿alguien?).

  • Entonces, significa que diferentes compiladores pueden decidir sobre diferentes valores, pero ¿eso no será portátil?

    – Ghasan غسان

    5 de febrero de 2013 a las 7:50

  • @Noor Esto no es portátil ni en lo más mínimo. Incluso puede variar de una ejecución del programa a otra. Realmente, esperar una explicación razonable para un comportamiento indefinido y valores no especificados simplemente no tiene sentido.

    usuario529758

    5 de febrero de 2013 a las 7:51

avatar de usuario
Megharaj

contiene valores basura (aleatorios). Consulte más información sobre las clases de almacenamiento para comprenderlo mejor.

  • Entonces, significa que diferentes compiladores pueden decidir sobre diferentes valores, pero ¿eso no será portátil?

    – Ghasan غسان

    5 de febrero de 2013 a las 7:50

  • @Noor Esto no es portátil ni en lo más mínimo. Incluso puede variar de una ejecución del programa a otra. Realmente, esperar una explicación razonable para un comportamiento indefinido y valores no especificados simplemente no tiene sentido.

    usuario529758

    5 de febrero de 2013 a las 7:51

¿Ha sido útil esta solución?