Assignació de memòria dinàmica en C

De la Viquipèdia, l'enciclopèdia lliure
Això mostra la diferència entre malloc i Heapalloc.

L'assignació de memòria dinàmica en C es refereix a realitzar una gestió manual de memòria per a l'assignació de memòria dinàmica en el llenguatge de programació C mitjançant un grup de funcions a la biblioteca estàndard C, és a dir, malloc ,realloc ,calloc ,aligned_alloc i free.[1][2][3]

El llenguatge de programació C++ inclou aquestes funcions; tanmateix, els operadors new i delete proporcionen una funcionalitat similar i són recomanats pels autors d'aquest idioma.[4] Tot i així, hi ha diverses situacions en què no s'aplica l'ús new/delete, com ara el codi de recollida d'escombraries o el codi sensible al rendiment, i una combinació de malloc i ubicació. es pot requerir new en lloc de l'operador new de nivell superior.

Moltes implementacions diferents del mecanisme d'assignació de memòria real, utilitzades permalloc, estan disponibles. El seu rendiment varia tant en el temps d'execució com en la memòria requerida.

Justificació[modifica]

El llenguatge de programació C gestiona la memòria de forma estàtica, automàtica o dinàmica. Les variables de durada estàtica s'assignen a la memòria principal, normalment juntament amb el codi executable del programa, i persisteixen durant tota la vida del programa; Les variables de durada automàtica s'assignen a la pila i van i venen a mesura que les funcions es criden i tornen. Per a variables de durada estàtica i de durada automàtica, la mida de l'assignació ha de ser constant en temps de compilació (excepte en el cas de matrius automàtiques de longitud variable [5]). Si la mida requerida no es coneix fins a l'execució (per exemple, si es llegeixen dades de mida arbitrària de l'usuari o d'un fitxer de disc), l'ús d'objectes de dades de mida fixa és inadequat.

Visió general de les funcions[modifica]

Les funcions d'assignació de memòria dinàmica C es defineixen a la capçalera stdlib.h (capçalera cstdlib en C++).[6]

Funció Descripció
malloc assigna el nombre especificat de bytes
aligned_alloc assigna el nombre especificat de bytes a l'alineació especificada
realloc augmenta o disminueix la mida del bloc de memòria especificat, movent-lo si cal
calloc assigna el nombre especificat de bytes i els inicialitza a zero
free allibera el bloc de memòria especificat de nou al sistema

Diferències entre malloc() i calloc()[modifica]

  • malloc() pren un sol argument (la quantitat de memòria a assignar en bytes), mentre que calloc() pren dos arguments — el nombre d'elements i la mida de cada element.
  • malloc() només assigna memòria, mentre que calloc() assigna i posa a zero els bytes de la regió assignada.

Exemple d'ús[modifica]

Crear una matriu de deu nombres enters amb abast automàtic és senzill a C:

int array[10];

Tanmateix, la mida de la matriu es fixa en temps de compilació. Si es vol assignar una matriu similar dinàmicament sense utilitzar una matriu de longitud variable, que no es garanteix que sigui compatible amb totes les implementacions C11, es pot utilitzar el codi següent:

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

Això calcula el nombre de bytes que ocupen deu nombres enters a la memòria, després demana que molts bytes a malloc i assigna el resultat a un punter anomenat array (a causa de la sintaxi C, els punters i les matrius es poden utilitzar indistintament en algunes situacions).

Referències[modifica]

  1. 7.20.3 Memory management functions (en anglès), p. 313. 
  2. Summit, Steve. «Chapter 11: Memory Allocation» (en anglès). C Programming Notes. [Consulta: 11 juliol 2020].
  3. «aligned_alloc(3) - Linux man page» (en anglès).
  4. Stroustrup, Bjarne. Programming: Principles and Practice Using C++ (en anglès). Addison Wesley, 2008, p. 1009. ISBN 978-0-321-54372-1. 
  5. «gcc manual» (en anglès). gnu.org. [Consulta: 14 desembre 2008].
  6. 7.20.3 Memory management functions, p. 313.