10x30:
int(*array)[30] = malloc((sizeof *array) * 10);
15x20:
int(*array)[20] = malloc((sizeof *array) * 15);
Cambiar el tamaño de 20x25:
int(*array2)[25] = realloc(array, (sizeof *array2) * 20);
La dimensión exterior (10, 15, 20) se puede determinar en tiempo de ejecución, ya que no es necesario como parte de los cálculos de índice por parte del compilador. La dimensión interna (30, 20, 25) debe conocerse en tiempo de compilación. Espero eso ayude.
Tenga en cuenta que a diferencia de las soluciones de matriz-de-puntos, éste puede ser manejado como un solo bloque de memoria, ya que asigna todo en un solo trozo de memoria como un conjunto de bienes declarados:
memcpy(somewhere, array2, sizeof(int) * 20 * 25); // (sizeof *array2) * 20
Sin embargo, en última instancia depende de tu uso.
Dado que algunas personas tienen dificultades para comprender las acciones tomadas por una operación de índice de array
, vamos a lo que Clang nos da una expresión de índice en el siguiente código
int main() {
int(*array)[10] = malloc((sizeof *array) * 5);
array[4][9] = 0;
int(*array1)[10][5] = malloc((sizeof *array1) * 20);
array1[19][9][4] = 0;
}
Es un buen compilador, lo que puede imprimir su AST de una manera fácilmente legible
// array[4][9] = 0;
(BinaryOperator 0xba62cc0 <line:5:3, col:17> 'int' '='
(ArraySubscriptExpr 0xba62c80 <col:3, col:13> 'int'
(ImplicitCastExpr 0xba62c60 <col:3, col:10> 'int *' <ArrayToPointerDecay>
(ArraySubscriptExpr 0xba62c20 <col:3, col:10> 'int [10]'
(DeclRefExpr 0xba62bdc <col:3> 'int (*)[10]' Var='array' 0xba62a00)
(IntegerLiteral 0xba62c00 <col:9> 'int' 4)))
(IntegerLiteral 0xba62c40 <col:12> 'int' 9))
(IntegerLiteral 0xba62ca0 <col:17> 'int' 0))
// array1[19][9][4] = 0;
(BinaryOperator 0xba630b8 <line:8:3, col:22> 'int' '='
(ArraySubscriptExpr 0xba63078 <col:3, col:18> 'int'
(ImplicitCastExpr 0xba63058 <col:3, col:15> 'int *' <ArrayToPointerDecay>
(ArraySubscriptExpr 0xba63018 <col:3, col:15> 'int [5]'
(ImplicitCastExpr 0xba62ff8 <col:3, col:12> 'int (*)[5]' <ArrayToPointerDecay>
(ArraySubscriptExpr 0xba62fa0 <col:3, col:12> 'int [10][5]'
(DeclRefExpr 0xba62f5c <col:3> 'int (*)[10][5]' Var='array1' 0xba62db0)
(IntegerLiteral 0xba62f80 <col:10> 'int' 19)))
(IntegerLiteral 0xba62fc0 <col:14> 'int' 9)))
(IntegerLiteral 0xba63038 <col:17> 'int' 4))
(IntegerLiteral 0xba63098 <col:22> 'int' 0)))
Tenga en cuenta que cada expresión subíndice toma un puntero, añade el valor del índice, una nd produce el elemento direccionado. Si ese subelemento es una matriz, se descompone en un puntero a su primer elemento. Esto realmente no es realmente diferente de los pasos realizados por un array declarado
int main() {
int array[5][10] = { };
array[4][9] = 1;
}
Los rendimientos de un AST muy similares, con sólo la expresión más interno primero se decayó a un puntero a su primer elemento
// array[4][9] = 1;
(BinaryOperator 0xbf9f7e8 <line:5:3, col:17> 'int' '='
(ArraySubscriptExpr 0xbf9f7a8 <col:3, col:13> 'int'
(ImplicitCastExpr 0xbf9f788 <col:3, col:10> 'int *' <ArrayToPointerDecay>
(ArraySubscriptExpr 0xbf9f748 <col:3, col:10> 'int [10]'
(ImplicitCastExpr 0xbf9f728 <col:3> 'int (*)[10]' <ArrayToPointerDecay>
(DeclRefExpr 0xbf9f6cc <col:3> 'int [5][10]' Var='array' 0xbfa81f0))
(IntegerLiteral 0xbf9f6f0 <col:9> 'int' 4)))
(IntegerLiteral 0xbf9f768 <col:12> 'int' 9))
(IntegerLiteral 0xbf9f7c8 <col:17> 'int' 1)))
¿Has probado algo? – cthom06
comp.lang.c Preguntas frecuentes sobre preguntas frecuentes 6.16 - [¿Cómo puedo asignar dinámicamente una matriz multidimensional?] (Http://c-faq.com/malloc/realloc.html) y 7.29 - [Habiendo asignado dinámicamente una matriz, ¿puedo cambiar su tamaño?] (http://c-faq.com/aryptr/dynmuldimary.html) – schot