¿Malloc o definición de matriz normal?

4 minutos de lectura

¿Cuándo debo usar malloc en lugar de la definición de matriz normal en C?

No puedo entender la diferencia entre:

int a[3]={1,2,3}
int array[sizeof(a)/sizeof(int)]

y:

array=(int *)malloc(sizeof(int)*sizeof(a));

En general, utilice malloc() Cuándo:

  • la matriz es demasiado grande para colocarla en la pila
  • la vida útil de la matriz debe sobrevivir al ámbito donde se crea

De lo contrario, use una matriz asignada de pila.

int a[3]={1,2,3}
int array[sizeof(a)/sizeof(int)]

Si se utilizan como variables locales, ambas a y array se asignaría en la pila. La asignación de pilas tiene sus pros y sus contras:

  • pro: es muy rápido: solo se necesita una operación de resta de registro para crear espacio de pila y una operación de suma de registro para recuperarlo
  • contra: el tamaño de la pila suele ser limitado (y también se fija en el momento del enlace en Windows)

En ambos casos, la cantidad de elementos en cada matriz es una constante de tiempo de compilación: 3 es obviamente una constante mientras sizeof(a)/sizeof(int) se puede calcular en tiempo de compilación ya que tanto el tamaño de a y el tamaño de int son conocidos en el momento en que array se declara.

Cuando la cantidad de elementos se conoce solo en tiempo de ejecución o cuando el tamaño de la matriz es demasiado grande para caber de manera segura en el espacio de la pila, se usa la asignación de almacenamiento dinámico:

array=(int *)malloc(sizeof(int)*sizeof(a));

Como ya se ha señalado, esto debe ser malloc(sizeof(a)) ya que el tamaño de a ya es la cantidad de bytes que toma y no la cantidad de elementos y, por lo tanto, la multiplicación adicional por sizeof(int) no es necesario.

La asignación y desasignación de montones es una operación relativamente costosa (en comparación con la asignación de pilas) y esto debe sopesarse cuidadosamente frente a los beneficios que proporciona, por ejemplo, en el código que se llama muchas veces en bucles estrechos.

Los compiladores de C modernos admiten la versión C99 del estándar C que presenta las denominadas matrices de longitud variable (o VLA) que se asemejan a características similares disponibles en otros lenguajes. El tamaño de VLA se especifica en tiempo de ejecución, como en este caso:

void func(int n)
{
   int array[n];
   ...
}

array todavía está asignado en la pila como si la memoria para el arreglo hubiera sido asignada por una llamada a alloca(3).

¿Malloc o definicion de matriz normal
invasor

Definitivamente tienes que usar malloc() si no desea que su matriz tenga un tamaño fijo. Dependiendo de lo que intente hacer, es posible que no sepa de antemano cuánta memoria necesitará para una tarea determinada o que deba cambiar el tamaño de su matriz dinámicamente en tiempo de ejecución, por ejemplo, puede ampliarla si hay más datos. entrando. Esto último se puede hacer usando reasignar() sin pérdida de datos.

En lugar de inicializar una matriz como en su publicación original, simplemente debe inicializar un puntero a un número entero.

int* array; // this variable will just contain the addresse of an integer sized block in memory
int length = 5; // how long do you want your array to be;

array = malloc(sizeof(int) * length); // this allocates the memory needed for your array and sets the pointer created above to first block of that region;

int newLength = 10;
array = realloc(array, sizeof(int) * newLength); // increase the size of the array while leaving its contents intact;

¿Malloc o definicion de matriz normal
relajarse

Tu código es muy extraño.

La respuesta a la pregunta en el título es probablemente algo así como “use arreglos asignados automáticamente cuando necesite cantidades bastante pequeñas de datos de corta duración, asignaciones de montón usando malloc() para cualquier otra cosa”. Pero es difícil precisar una respuesta exacta, depende mucho de la situación.

No estoy seguro de por qué está mostrando primero una matriz, luego otra matriz que intenta calcular su longitud a partir de la primera y, finalmente, una malloc() llamada que intenta hacer lo mismo.

Normalmente, tiene una idea de la cantidad de elementos deseados, en lugar de una matriz existente cuyo tamaño desea imitar.

La segunda línea es mejor como:

int array[sizeof a / sizeof *a];

No es necesario repetir una dependencia en el tipo de alo anterior definirá array como una matriz de int con el mismo número de elementos que el arreglo a. Tenga en cuenta que esto solo funciona si a es de hecho una matriz.

Además, la tercera línea probablemente debería ser:

array = malloc(sizeof a);

No es necesario ser demasiado inteligente (especialmente porque se equivocó) sobre el sizeof argumento, y no hay necesidad de emitir malloc()valor de retorno de .

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad