sintaxis que punteros memoria matrices funcion ejemplos dinamica crear con como arreglo array administracion c algorithm arrays malloc

punteros - que es la memoria dinamica en c



Arrays de tamaƱo variable frente a calloc en C (5)

Estoy de acuerdo con ocdecio que c89 no permite

int array[variable]

c99 permite que algunos tipos de variables y expresiones sean el tamaño de la matriz. Pero además de eso, las cosas asignadas con malloc y familia pueden redimensionarse usando realloc .

En la discusión de la memoria dinámica aquí: "Introducción a punteros C y memoria dinámica"

El autor dice:

Un bloque de memoria como este se puede usar efectivamente como una matriz más flexible. Este enfoque es en realidad mucho más común en los programas C del mundo real. También es más predecible y flexible que una "matriz de tamaño variable"

El tipo de bloque de memoria del que está hablando es como tal:

const int size = 5; int * array = calloc(size, sizeof(int));

y luego usando otro puntero para iterar sobre la matriz:

int * index = array; for (i = 0; i < size; i++) { *index = 1; // or whatever value index++; }

Mi pregunta es ¿cómo es este método mejor que una matriz estándar de tamaño variable como esta ?:

int array[variable];

o dinámico:

char name[] = "Nick";

El autor no arroja mucha luz sobre por qué debería preferir el método anterior al último. O más específicamente: ¿cómo es más "predecible y flexible"?


Porque

int array[variable];

no es válido en el estándar C; solo puede definir la longitud de un conjunto con una constante. (como su

char name[] = "Nick";

ejemplo, que no es de longitud variable).

Como tal, es necesario usar un asignador de memoria como calloc () si desea crear una matriz de una longitud basada en una variable de programa.

Solo no olvides liberarlo ().


Si declara int array[variable] la memoria se asignará en la pila, lo que no es muy bueno para estructuras de datos grandes, relativamente permanentes (como una que desee devolver). No necesita liberar memoria manualmente si usa la sintaxis de matriz ya que se libera cuando se sale del alcance. calloc otra parte, calloc asignará memoria dinámicamente en el tiempo de ejecución en el montón. Tendrá que liberarlo usted mismo tan pronto como haya terminado con él.


Usar matrices de tamaño variable en la pila como una variable automática (en lugar del montón usando calloc / malloc / new / etc) no es una mala idea para un proceso que va a durar mucho tiempo y deberá crear y destruir lotes. de pequeños arreglos. Esto se debe a que se garantiza que la pila nunca se fragmentará, mientras que la memoria se fragmentará y se fragmentará. Si está escribiendo firmware o un servicio que necesita ejecutarse durante años sin detenerse, tiene casi prohibido el uso de malloc o nuevo.


Los arrays automáticos de longitud variable están permitidos en ISO C99, y como extensión, GCC los acepta en modo C90 y en C ++. Por lo tanto, no olvide configurar el indicador del compilador -std = c99 o -std = gnu99. El siguiente ejemplo funcionará

#include<stdio.h> int main() { int n; printf("/n/tEnter the number of digits: "); scanf("%d", &n); char str[n]; for(int i=0; i < n; i++) { scanf("%s", &str[i]); } printf("/n/tThe entered digits are: %s", str); return 0; }

Lo garantizo :-)