Con la siguiente declaración
int array[ROW][COLUMN]={0};
Obtengo la matriz con todos los ceros pero con el siguiente
int array[ROW][COLUMN]={1};
No obtengo la matriz con un solo valor. El valor predeterminado sigue siendo 0.
¿Por qué este comportamiento y cómo puedo inicializar con todos 1?
EDITAR: Acabo de entender que usar memset
con valor como 1, establecerá cada byte como 1 y, por lo tanto, el valor real de cada celda de la matriz no será 1 pero 16843009
. ¿Cómo lo configuro en 1?
c
arrays
initialization
Kraken
fuente
fuente
why and how
ambos. :)Respuestas:
Se obtiene este comportamiento, ya que
int array [ROW][COLUMN] = {1};
lo hace no media "set todos los artículos a uno". Permítanme intentar explicar cómo funciona esto paso a paso.La forma explícita y demasiado clara de inicializar su matriz sería así:
#define ROW 2 #define COLUMN 2 int array [ROW][COLUMN] = { {0, 0}, {0, 0} };
Sin embargo, C le permite omitir algunos de los elementos de una matriz (o estructura / unión). Por ejemplo, podría escribir:
int array [ROW][COLUMN] = { {1, 2} };
Es decir, inicializar los primeros elementos en 1 y 2, y el resto de elementos "como si tuvieran una duración de almacenamiento estático". Hay una regla en C que dice que todos los objetos de duración de almacenamiento estático, que no sean inicializados explícitamente por el programador, deben establecerse en cero.
Entonces, en el ejemplo anterior, la primera fila se establece en 1,2 y la siguiente en 0,0 ya que no les dimos ningún valor explícito.
A continuación, hay una regla en C que permite un estilo de corsé laxo. El primer ejemplo también podría escribirse como
int array [ROW][COLUMN] = {0, 0, 0, 0};
aunque, por supuesto, este es un estilo deficiente, es más difícil de leer y comprender. Pero esta regla es conveniente, porque nos permite escribir
int array [ROW][COLUMN] = {0};
lo que significa: "inicializar la primera columna de la primera fila en 0, y todos los demás elementos como si tuvieran una duración de almacenamiento estática, es decir, ponerlos en cero".
por lo tanto, si intentas
int array [ROW][COLUMN] = {1};
significa "inicializar la primera columna de la primera fila en 1 y establecer todos los demás elementos en cero".
fuente
int array [ROW][COLUMN] = {{0}};
Si desea inicializar la matriz
-1
, puede usar lo siguiente,memset(array, -1, sizeof(array[0][0]) * row * count)
Pero esto funcionará
0
y-1
solofuente
0000
y1111
<cstring>
en C ++int array[ROW][COLUMN]={1};
Esto inicializa solo el primer elemento en 1. Todo lo demás obtiene un 0.
En la primera instancia, está haciendo lo mismo: inicializando el primer elemento en 0 y el resto por defecto en 0.
La razón es sencilla: para una matriz, el compilador inicializará cada valor que no especifique con 0.
Con una
char
matriz, podría usarmemset
para configurar cada byte, pero esto generalmente no funcionará con unaint
matriz (aunque está bien para 0).Un
for
ciclo general hará esto rápidamente:for (int i = 0; i < ROW; i++) for (int j = 0; j < COLUMN; j++) array[i][j] = 1;
O posiblemente más rápido (dependiendo del compilador)
for (int i = 0; i < ROW*COLUMN; i++) *((int*)a + i) = 1;
fuente
0
inicializa solo el primer valor. Luego inicializa todo el resto con0
por defecto.value
campomemset
es 1, entonces el valor real en la matriz no será 1, pero2^0 + 2^8 + 2^16 + 2^24
?memset
establece cada byte en su destino en el valor que se le da, lo que no funcionará para establecer unint
en 1.memset
No se puede usar para establecer valores de objetos de varios bytes a menos que desee que cada byte del objeto tenga el mismo valor.Tenga en cuenta que GCC tiene una extensión para la notación de inicializador designada que es muy útil para el contexto. También está permitido
clang
sin comentarios (en parte porque intenta ser compatible con GCC).La notación de extensión le permite usar
...
para designar un rango de elementos que se inicializarán con el siguiente valor. Por ejemplo:#include <stdio.h> enum { ROW = 5, COLUMN = 10 }; int array[ROW][COLUMN] = { [0 ... ROW-1] = { [0 ... COLUMN-1] = 1 } }; int main(void) { for (int i = 0; i < ROW; i++) { for (int j = 0; j < COLUMN; j++) printf("%2d", array[i][j]); putchar('\n'); } return 0; }
El resultado es, como era de esperar:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Tenga en cuenta que Fortran 66 (Fortran IV) tenía recuentos de repetición para inicializadores para matrices; Siempre me ha parecido extraño que C no los obtuviera cuando se agregaron inicializadores designados al idioma. Y Pascal usa la
0..9
notación para designar el rango de 0 a 9 inclusive, pero C no lo usa..
como token, por lo que no es sorprendente que no se haya usado.Tenga en cuenta que los espacios alrededor de la
...
notación son esencialmente obligatorios; si están unidos a números, entonces el número se interpreta como un número de punto flotante. Por ejemplo,0...9
sería tokenized como0.
,.
,.9
, y números de punto flotante no están permitidos como subíndices de matriz. Con las constantes nombradas,...ROW-1
no causaría problemas, pero es mejor adquirir hábitos seguros.Adenda:
Observo de pasada que GCC 7.3.0 rechaza:
int array[ROW][COLUMN] = { [0 ... ROW-1] = { [0 ... COLUMN-1] = { 1 } } };
donde hay un conjunto adicional de llaves alrededor del inicializador escalar
1
(error: braces around scalar initializer [-Werror]
). No estoy seguro de que sea correcto dado que normalmente puede especificar llaves alrededor de un escalarint a = { 1 };
, lo cual está explícitamente permitido por el estándar. Tampoco estoy seguro de que sea incorrecto.También me pregunto si sería una mejor notación
[0]...[9]
: no es ambigua, no se puede confundir con ninguna otra sintaxis válida y evita la confusión con números de coma flotante.int array[ROW][COLUMN] = { [0]...[4] = { [0]...[9] = 1 } };
¿Quizás el comité de estándares consideraría eso?
fuente
Para inicializar una matriz 2d con cero, use el método siguiente:
int arr[n][m] = {};
NOTA : El método anterior solo funcionará para inicializar con 0;
fuente
Utilice una matriz de vectores en su lugar:
vector<vector<int>> array(ROW, vector<int>(COLUMN, 1));
fuente
char grid[row][col]; memset(grid, ' ', sizeof(grid));
Eso es para inicializar los elementos de la matriz de caracteres en caracteres de espacio.
fuente