nxn - valor inicial de la matriz int en C
matriz nxn en c++ (7)
¿Por qué los locals de función ( auto
storage class) no se inicializan cuando todo lo demás es?
C está cerca del hardware; esa es su mayor fortaleza y su mayor peligro. La razón por auto
los objetos de clase de almacenamiento auto
tienen valores iniciales aleatorios es porque están asignados en la pila, y se tomó una decisión de diseño para no borrarlos automáticamente (en parte porque tendrían que borrarse en cada llamada a función).
Por otro lado, los objetos no auto
solo tienen que borrarse una vez. Además, el sistema operativo tiene que borrar las páginas asignadas por razones de seguridad de todos modos. Entonces, la decisión de diseño fue especificar cero inicialización. ¿Por qué la seguridad no es un problema con la pila también? En realidad, está despejado, al principio. La basura que ve es de instancias anteriores de los marcos de llamadas de su propio programa y el código de la biblioteca que llamaron.
El resultado final es un código rápido y eficiente de memoria. Todas las ventajas del montaje sin dolor. Antes de que dmr inventara C, los "HLL" como Basic y todo el kernel de OS fueron literalmente implementados como gigantes ensambladores. (Con ciertas excepciones en lugares como IBM).
Al declarar una matriz en C me gusta esto:
int array[10];
¿Cuál es el valor inicial de los enteros? Obtengo resultados diferentes con diferentes compiladores y quiero saber si tiene algo que ver con el compilador o el sistema operativo.
De acuerdo con el estándar C, 6.7.8 (nota 10):
Si un objeto que tiene una duración de almacenamiento automática no se inicializa explícitamente, su valor es indeterminado.
Entonces depende del compilador. Con MSVC, las compilaciones de depuración inicializarán las variables automáticas con 0xcc, mientras que las compilaciones sin depuración no inicializarán esas variables.
En la mayoría de los últimos compiladores (por ej., Gcc / vc ++), los miembros de la matriz / estructura local parcialmente inicializados se inicializan por defecto a cero (int), NULL (cadena char / char), 0.000000 (flotante / doble).
Además de los datos locales de matriz / estructura, los miembros de espacio estático (global / local) y global también mantienen 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");
En gcc / vc ++, la salida debería ser:
0 2 0 1 0 0 0.000000 s11.c es null s11.str es nulo
La declaración de la variable AC simplemente le dice al compilador que reserve y nombre un área de memoria para usted. Para las variables automáticas, también conocidas como variables de pila, los valores en esa memoria no cambian de lo que eran antes. Las variables globales y estáticas se ponen a cero cuando se inicia el programa.
Algunos compiladores en modo de depuración no optimizado establecen las variables automáticas a cero. Sin embargo, se ha vuelto común en los compiladores más nuevos establecer los valores a un valor incorrecto conocido para que el programador no escriba, sin saberlo, código que depende de que se haya establecido un cero.
Para pedirle al compilador que configure una matriz en cero, puede escribirla como sigue:
int array[10] = {0};
Mejor aún es establecer la matriz con los valores que debería tener. Eso es más eficiente y evita escribir en la matriz dos veces.
Si la matriz se declara en una función, entonces el valor no está definido. int x[10];
en una función significa: tomar la propiedad del área 10-int-size de memroy sin hacer ninguna inicialización. Si la matriz se declara global o static
en una función, todos los elementos se inicializan a cero si no se han inicializado.
Tal como lo establece el estándar, todas las variables estáticas globales y de función se inicializan automáticamente a 0. Las variables automáticas no se inicializan.
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 inicializar siempre manualmente la variable de función, independientemente de su clase de almacenamiento. Para establecer todos los elementos de la matriz en 0, solo debe asignar el primer elemento de la matriz a 0; los elementos omitidos se establecerán en 0 automáticamente:
int b[10] = {0};
Texto de http://www.cplusplus.com/doc/tutorial/arrays/
RESUMEN:
Inicializando matrices. Al declarar una matriz regular de ámbito local (dentro de una función, por ejemplo), si no especificamos lo contrario, sus elementos no se inicializarán a ningún valor de manera predeterminada, por lo que su contenido no se determinará hasta que almacenemos algún valor en ellos. Los elementos de las matrices global y estática, por otra parte, se inicializan automáticamente con sus valores predeterminados, que para todos los tipos fundamentales significa que están llenos de ceros.
En ambos casos, local y global, cuando declaramos una matriz, tenemos la posibilidad de asignar valores iniciales a cada uno de sus elementos adjuntando los valores entre llaves {}. Por ejemplo:
int billy [5] = { 16, 2, 77, 40, 12071 };