Cuando se declara una matriz en C como este:

int array[10];

¿Cuál es el valor inicial de los números enteros?? Estoy obteniendo diferentes resultados con diferentes compiladores y quiero saber si tiene algo que ver con el compilador, o el sistema operativo.

InformationsquelleAutor buzali | 2009-09-12

8 Comentarios

  1. 61

    Si la matriz es declarado en una función, entonces el valor es undefined. int x[10]; en función implica: tomar la posesión de 10-int-tamaño de área de memroy, sin hacer la inicialización. Si la matriz está declarada como global, o como static en una función, entonces todos los elementos se inicializan a cero si no se inicializa ya.

    • correcto. A menos que sea global, que va a contener todo lo aleatorio de basura que estaba en el portabrocas de la memoria antes. No tiene nada que ver con el compilador. Si quieres algo en particular, de allí, que la puso allí.
    • ok, yo estoy usando XCode y por alguna razón todos los elementos de la matriz se inicializan a cero y está dentro de una función. alguna idea de por qué? es debido a que el compilador, el IDE, o el sistema operativo??
    • El único caso que se me ocurre es cuando la matriz es estática. De lo contrario, no tengo idea en realidad.
    • Algunos compiladores/toolchains siempre de cero de las variables y de la memoria asignada, más a menudo, cuando usted está construyendo en «debug» modo (optimizaciones no habilitado). Esta es normalmente la intención de crear un determinista entorno de depuración para la creación de prototipos de código y olvidar inicializar una variable. La otra posibilidad es la memoria de la matriz es el uso de sólo pasa a contener ceros.
    • eso es exactamente lo que quiero. ¿Sabes cómo establecer GCC en el modo de depuración por lo que voy a cero todos los elementos de la matriz?
    • Incorrecto. Ámbito de las variables no importa de almacenamiento de clase.
    • no, no es lo que usted desea. Si desea inicializar la matriz de ceros, entonces escribir int array[10] = {0};. Llegar al compilador para que lo haga automáticamente, significa que está a la escritura de código que sólo funciona en modo de depuración, y se rompe cuando la suelta, o alguien compila con diferentes opciones.
    • también puede ser vale la pena agregar a su respuesta, de que un static variable definida dentro de una función también se pueden consultar a ceros.
    • Añadido a la respuesta. Gracias 🙂
    • Tales valores no se llama undefined indeterminado en el C estándar. (Excepto por el lugar que dice «valor indefinido» en C11…)

  2. 20

    Según lo establecido por la norma, todos los mundiales y función de las variables estáticas automáticamente inicializado a 0. Automática de variables no inicializadas.

    int a[10];  //global - all elements are initialised to 0
    
    void foo(void) {
        int b[10];    //automatic storage - contain junk
        static int c[10]; //static - initialised to 0
    }

    Sin embargo es una buena práctica siempre manualmente inicializar variable de función, independientemente de su clase de almacenamiento. Para establecer todos los elementos de la matriz a 0 usted necesidad justa de asignar primer elemento de matriz a 0 – elementos omitidos se establece en 0 de forma automática:

    int b[10] = {0};
    • Para ser pedante ámbito de los archivos de las variables (globales) han de clase de almacenamiento static, que es la razón por la que está inicializado a 0.
    • Sí, pero debido a que la estática en el nivel de archivo tiene un significado diferente, me acaba de llamar el ‘global’, sea el archivo global o programa global de
    • Yo no puedo ver por qué es una buena práctica de residuos en los ciclos de la inicialización de un buffer de gran tamaño que, en la siguiente línea, usted va a cargar con los datos de un archivo/red.
  3. 12

    ¿Por qué la función de los lugareños (auto de clase de almacenamiento) no se inicializa cuando todo lo demás es?

    C está cerca de el hardware, que es su mayor fortaleza y su mayor peligro. La razón auto de almacenamiento de objetos de una clase tienen aleatoria de valores iniciales es debido a que se almacena en la pila, y una decisión de diseño fue de no borrar automáticamente estos (en parte debido a que tendrían que ser liquidados en cada llamada a la función).

    Por otro lado, la no-auto objetos sólo tienen que ser limpiadas una vez. Además, el sistema operativo tiene que borrar las páginas asignadas por razones de seguridad, de todos modos. De modo que el diseño de la decisión aquí fue para especificar cero de inicialización. Por qué no es de la seguridad un problema con la pila, también? En realidad es aclarado, en primer lugar. La basura que se ve es de instancias anteriores de su propio programa de la llamada de marcos y el código de la biblioteca se llama.

    El resultado final es rápido, eficaz memoria de código. Todas las ventajas de la asamblea con ninguno de los de dolor. Antes de dmr inventado C, «HLL»s como Básicos y de todo OS los núcleos eran realmente, literalmente, implementado como gigante ensamblador de los programas. (Con ciertas excepciones en lugares como IBM).

  4. 7

    De acuerdo con el estándar de C, 6.7.8 (nota 10):

    Si un objeto que ha automático
    el tiempo de almacenamiento no está inicializado
    explícitamente, su valor es
    indeterminado.

    Por lo que depende del compilador. Con MSVC, las versiones de depuración para inicializar las variables automáticas con 0xcc, mientras que los no-versiones de depuración no inicializar las variables en todos.

  5. 5

    Un C declaración de variable le dice al compilador para un lado y el nombre de un área de memoria para usted. Para las variables automáticas, también conocida como pila de variables, los valores en los que la memoria no se cambian desde lo que eran antes. Global y las variables estáticas se ponen a cero cuando se inicia el programa.

    Algunos compiladores en unoptimized depurar el modo de ajuste automático de las variables a cero. Sin embargo, se ha vuelto común en los nuevos compiladores para establecer los valores a un mal denominado valor, de modo que el programador no, sin saberlo, escribir código que depende de un cero que se establece.

    Con el fin de solicitar el compilador para establecer una matriz a cero para usted, usted puede escribir como:

    int array[10] = {0};

    Mejor aún es establecer la matriz con los valores que debe tener. Que es más eficaz y evita la escritura en la matriz dos veces.

    • ¿Sabe usted cómo puede decirle al compilador para establecer los valores a cero?? Estoy usando GCC… ¿hay algún parámetro debug que hace esto?
    • No dependen del compilador para inicializar la matriz de uso explícito de inicializador como Zan sugiere. Incluso si la corriente de gcc matrices de ceros en algún modo de depuración, el siguiente puede decidir a llenar con una totalmente diferente valor, dejando un muy duro para localizar el error de 5 años en el camino. Simplemente escriba el extra de 5 caracteres y el uso de int matriz[10] = {0};
    • Obviamente incorrecto. Variables de segmento de datos son siempre cero.
    • no lejos siempre de cero
  6. 4

    En la mayoría de los compiladores más recientes(por ejemplo. gcc/vc++), parcialmente inicializado array local/los miembros de la estructura por defecto se inicializa a cero(int), NULL(char char o string), 0.000000(float/double).

    Aparte de array local/estructura de datos como en el anterior, estática(global/local) y el espacio mundial, los miembros de mantener la misma propiedad.

    int a[5] = {0,1,2};
    printf("%d %d %d\n",*a, *(a+2), *(a+4));
    
    struct s1
    {
    int i1;
    int i2;
    int i3;
    char c;
    char str[5];
    };
    
    struct s1 s11 = {1};
        printf("%d %d %d %c %s\n",s11.i1,s11.i2, s11.i3, s11.c, s11.str);
        if(!s11.c)
            printf("s11.c is null\n");
        if(!*(s11.str))
            printf("s11.str is null\n");

    Gcc/vc++, la salida debe ser:

    0 2 0
    1 0 0 0.000000
    s11.c es nulo
    s11.str es nulo

  7. 3

    Texto de http://www.cplusplus.com/doc/tutorial/arrays/

    RESUMEN:

    Inicialización de matrices. Cuando se declara un
    matriz regular de ámbito local (dentro de un
    la función, por ejemplo), si no
    especifique lo contrario, sus elementos serán
    no se inicializan a cualquier valor por
    por defecto, por lo que su contenido será
    indeterminado hasta que la tienda de algún valor
    en ellos. Los elementos de global y
    las matrices estáticas, por el contrario, son
    inicializa automáticamente con sus
    los valores por defecto, que para todos los
    tipos fundamentales de este modo son
    se llenan con ceros.

    En ambos casos, local y global, cuando
    declaramos un array, tenemos la
    posibilidad de asignar los valores iniciales
    a cada uno de sus elementos por
    encierra los valores entre llaves { }.
    Por ejemplo:

    int billy [5] = { 16, 2, 77, 40, 12071 };
  8. 1

    Las secciones pertinentes del C estándar (el énfasis es mío):

    5.1.2 entornos de Ejecución

    Todos los objetos con almacenamiento estático duración será inicializado (conjunto de sus valores iniciales) antes del inicio del programa.

    6.2.4 Almacenamiento duraciones de objetos

    Un objeto cuyo identificador se declara con internos o externos de la vinculación, o con la clase de almacenamiento especificador static ha almacenamiento estático duración.

    6.2.5 Tipos

    Matriz y tipos de estructura son llamados colectivamente agregado tipos.

    6.7.8 de Inicialización

    Si un objeto que tiene de almacenamiento automático duración es no se inicializan de forma explícita, su valor es indeterminado. Si un objeto que tiene almacenamiento estático duración es no se inicializan de forma explícita, luego:

    • si tiene tipo de puntero, que se inicializa a un puntero nulo;
    • si tiene aritmética tipo, es inicializado a (positivo o unsigned) cero;
    • si es un agregado, cada miembro se inicializa (de forma recursiva) de acuerdo a estas reglas;
    • si se trata de una unión, el primer nombrado miembro se inicializa (de forma recursiva) de acuerdo a estas reglas.

Dejar respuesta

Please enter your comment!
Please enter your name here