This is an old revision of the document!


Laboratorul 08 - Alocare dinamică

În acest laborator veţi învăţa să:

  • Alocaţi dinamic memorie folosind funcţiile malloc, calloc şi realloc
  • Folosiţi funcţia strdup pentru a clona şiruri de caractere
  • Eliberaţi memoria alocată folosind funcţia free.

Funcţii pentru alocarea memoriei (din stdlib.h):

  • malloc
type* ptr = malloc(size_t size);

Unde size_t este un tip întreg fără semn (unsigned), dependent de arhitectură (pentru arhitectura 32bit, acesta este unsigned int).

Funcţia alocă o zonă continuă de memorie având dimensiunea de size octeţi şi returnează un pointer void* cu adresa de început a zonei de memorie alocată. Pentru a schimba tipul acestui pointer se foloseşte operatorul cast.

Exemplu:

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

Am alocat o zonă de memorie de 100 de elemente de tip int. Tipului pointerului returnat de funcţie, void*, i se face cast automat în int*.

Funcţia sizeof(type) returnează numărul de octeţi ocupaţi de tipul type.

  • calloc
type* ptr = calloc(size_t num, size_t size);

Funcţia alocă spaţiu de memorie pentru un vector cu num elemente, fiecare element având dimensiunea size de octeţi şi returnează un pointer void* cu adresa de început a zonei de memorie alocată. Atenţie! Toţi biţii din această zonă de memorie sunt setaţi pe 0.

Exemplu:

int *a = calloc( 100, sizeof(int) );

Am alocat o zonă de memorie de 100 de elemente de tip int. Toţi biţii din această zonă de memorie au valoarea 0.

  • realloc
type* ptr = realloc(void* old_ptr, size_t size);

Unde old_ptr este adresa de început a zonei de memorie pe care dorim să o realocăm, size reprezintă noua dimensiune a zonei de memorie (în octeţi), iar ptr este adresa de început a zonei de memorie după realocare.

Funcţia realizează modificarea dimensiunii zonei de memorie referite de old_ptr.

Exemplu:

int *a = malloc( 100 * sizeof(int) );
a = realloc( a, 200 * sizeof(int) );

Am alocat o zonă de memorie de 100 de elemente de tip int. Am mărit zona de memorie pentru 200 de elemente întregi. Atenţie! După realocare, cele 100 de numere întregi aflate iniţial în vectorul a au rămas nemodificate.

  • free
void free(void* ptr);

Unde ptr reprezintă adresa zonei de memorie pe care dorim să o eliberăm.

  • strdup
char *strdup( char *s );

Unde s reprezintă un string (şir de caractere terminat cu '\0').

Funcţia alocă o nouă zonă de memroie la care se copiază octeţii şirului s. Se returnează un pointer către începutul zonei de memorie unde s-a făcut copierea.

Problemă rezolvată

Copiaţi şi rulaţi următorul program pe staţia la care vă aflaţi şi scrieţi câte un comentariu în care să explicaţi ce face fiecare instrucţiune. Este foarte important să înţelegeţi cum să folosiţi pointerii în C. Dacă nu înţelegeţi ceva din program, întrebaţi asistenţii.

# include <stdio.h>
# include <stdlib.h>
# include <string.h>
 
int main ()
{
   char c = 'a', *p, s[100];
   p = &c;
   printf ("%c %c %c", *p, *p+1, *p+2);
   s[0] = 'A'; s[1] = 'B'; s[2] = 'C'; s[3] = '\0';
   p = s;
   printf ("\n%s %s %c %s", s, p, *(p+1), p+1);
   strcpy (s, "\nacesta este un exemplu de lucru cu pointeri");
   printf ("%s", s);
   p += 17;
   for (; *p != '\0'; ++p) {
      if (*p == 'e')
         *p = 'E';
      if (*p == ' ')
         *p = '\n';
   }
   printf ("%s\n", s);
 
   return 0;
}

Probleme

programare-cc/laboratoare/08.1605042946.txt.gz · Last modified: 2020/11/10 23:15 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0