Heap asigna una matriz 2D (no una matriz de punteros)

Estoy escribiendo código C y me gustaría asignar 512 * 256 bytes. Para mi propia conveniencia, me gustaría poder acceder a los elementos con la matriz de syntax [a] [b]; sin aritmética para encontrar el índice correcto.

Cada tutorial que veo en línea me dice que cree una matriz de punteros que apuntan a las matrices de las filas que quiero en mi matriz. Esto significa que cada submatriz necesita ser malloc y libre individualmente. Estoy interesado en una solución que solo requiere una llamada a Malloc y una llamada a Free. (Por lo tanto, todos los elementos son contiguos). Creo que esto es posible porque no voy a construir una matriz dentada.

Agradecería si alguien pudiera compartir la syntax para declarar dicha matriz.

Bueno, si quieres asignar una matriz de tipo, la asignas a un puntero de ese tipo.

Como las matrices en 2D son matrices de matrices (en su caso, una matriz de 512 matrices de 256 caracteres), debe asignarla a un puntero a una matriz de 256 caracteres:

char (*arr)[256]=malloc(512*256); //Now, you can, for example: arr[500][200]=75; 

(Los paréntesis alrededor de *arr son para hacer que sea un puntero a la matriz, y no una matriz de punteros)

Si asigna la matriz de esta manera, requiere dos llamadas para free , pero permite la syntax de estilo array[a][b] y es contigua.

 char **array = malloc(512 * sizeof(char *)); array[0] = malloc(512*256); for (int i = 1; i < 512; i++) array[i] = array[0] + (256 * i); 

Vea array2 aquí para más información: http://c-faq.com/aryptr/dynmuldimary.html

Esto es fácil asumiendo que no necesita compatibilidad con el antiguo estándar C89 (entre los comstackdores de C actuales, solo MSVC y algunos comstackdores de objectives integrados son al revés). Así es como lo haces:

 int (*array)[cols] = malloc(rows * sizeof *array); 

Entonces la array[a][b] es válida para cualquier a en [0,rows) b en [0,cols) .

En el lenguaje del estándar C, el array tiene un tipo de modificación variable . Si desea pasar el puntero a otras funciones, deberá repetir este tipo en la lista de argumentos de la función y asegurarse de que al menos se pase la cantidad de columnas a la función (dado que se necesita como parte de la modificación variable). tipo).

Editar: Me olvidé del hecho de que OP solo se preocupa por un tamaño fijo, 512×256. En ese caso, C89 será suficiente, y todo lo que necesita es:

 int (*array)[256] = malloc(512 * sizeof *array); 

El mismo tipo exacto se puede usar en las listas de argumentos de función si necesita pasar el puntero entre las funciones (y también como un tipo de devolución de función, pero para este uso es posible que desee escribirlo … 🙂

Como conoce el tamaño de la matriz con anticipación, puede crear un tipo de struct que contenga una matriz de 521×256 y luego asignar dinámicamente la struct .

Si conoce el tamaño de la matriz, puede escribirla y hacer un puntero a ella. Aquí hay un pequeño fragmento que demuestra este uso:

 #include  #include  typedef int array2d[20][20]; int main() { int i,j; array2d *a = malloc(sizeof(array2d)); for(i=0;i!=20;i++) for(j=0;j!=20;j++) (*a)[i][j] = i + j; for(i=0;i!=20;i++) for(j=0;j!=20;j++) printf("%d ",(*a)[i][j]); free(a); return 0; } 

Es posible asignar dinámicamente el mismo tipo de matriz multidimensional que

 static char x[512][256]; 

te da, pero es un poco difícil debido a la descomposición del tipo. Solo sé cómo hacerlo con un typedef :

 typedef char row[512]; row *x = malloc(sizeof(row) * 256); 

Esto solo le permite determinar el tamaño de la segunda dimensión en tiempo de ejecución. Si ambas dimensiones pueden variar en el tiempo de ejecución, necesita un vector de drogas.