2010-09-15 14 views
11

Quiero inicializar una matriz bidimensional de tamaño variable a cero. sé que se puede hacer para una matriz de tamaño fijo:inicializar una matriz C multidimensional de tamaño variable a cero

int myarray[10][10] = {0}; 

pero no funciona si hago esto:

int i = 10; 
int j = 10; 
int myarray[i][j] = {0}; 

¿Hay alguna manera de una línea de hacer esto o hago Tengo que recorrer cada miembro de la matriz?

Gracias

Respuesta

9

No se puede inicializar con una inicializador, pero se puede memset() la matriz a 0.

#include <string.h> 

int main(void) { 
    int a = 13, b = 42; 
    int m[a][b]; 
    memset(m, 0, sizeof m); 
    return 0; 
} 

Nota: esto es C99. En C89, la declaración de m (int m[a][b];) es un error.

+0

@ vittorio88: probablemente estés usando un compilador de C++. En C, un puntero a cualquier objeto ('m' solo, de tipo' int (*) [b] ') es compatible con un puntero a void (tipo' void * ') que es lo que' memset() 'espera. Entonces no hay problemas allí. – pmg

-1

tamaño variable matrices bidimensionales no se admiten en C. Una dimensión (i no recuerdo si es primero o segundo) tiene que ser fija. Recomiendo pasar sobre ella una vez que está definida.

+0

-0.5 (redondeado hacia arriba) 'C99' admite matrices bidimensionales de tamaño variable. – pmg

+0

Tienes razón. mi error. – erelender

1

Si obtiene un puntero a su estructura de datos, puede intentar memset.

+0

+1 - memset es, de lejos, la mejor manera de inicializar matrices y nuevas asignaciones de memoria, sin duda funciona en C++, por lo que vale la pena intentarlo en C. – ChrisBD

+0

@kbrimington: en la mayoría de contextos, un nombre de matriz "decae" en un puntero a su primer elemento. Eso también funciona para las matrices multidimensionales y, como memset() toma 'void *', no hay problema con el tipo de puntero que representa el nombre de la matriz. – pmg

+0

@pmg - Gracias. Entendí esto; sin embargo, aprecio la aclaración. – kbrimington

0

No puede crear una matriz estática utilizando variables no constantes. Intente utilizar la asignación dinámica:

int i = 10; 
int j = 10; 
size_t nbytes = i*j*sizeof(int); 
int* myarray = (int*) malloc(nbytes); 
memset(myarray,0,nbytes); 
+0

-0.5 (redondeado hacia arriba) en 'C99' usted ** DO ** puede crear arreglos estáticos usando variables no constantes. – pmg

3

Online C99 Standard (n1256 draft), Sección 6.7.8, párrafo 3:

El tipo de la entidad a ser inicializado será una matriz de tamaño desconocido o un tipo de objeto que es no es un tipo de matriz de longitud variable.

Énfasis mío.

Como todos han dicho, su mejor opción es usar memset().

Cuestiones relacionadas