This is an old revision of the document!
În acest laborator veţi învăţa să:
Funcţii pentru alocarea memoriei (din stdlib.h):
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.
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.
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.
void free(void* ptr);
Unde ptr reprezintă adresa zonei de memorie pe care dorim să o eliberăm.
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.
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; }
Sa se scrie un program care inlocuieste intr-un sir de caractere s toate aparitiile lui s1 cu s2.
Rezolvarea va contine o funcţie care înlocuieşte într-un şir s prima apariţie a unui subşir dat s1 printr-un şir dat s2, folosind un vector intermediar alocat dinamic, în care se construieşte şirul rezultat.
Funcţia declarată trebuie să respecte următorul antet:
char* my_replace(char *s, char *s1, char *s2)
Prima linie din fisierul de intrare va contine subsirurile s1 si s2 separate de un spatiu.
Pe cea de-a doua linie din fisierul de intrare se va gasi sirul s.
Sirurile sunt de lungime maxim 100.
O singura linie care contine sirul initial s in care toate aparitiile lui s1 au fost inlocuite cu s2.
Intrare | Ieşire |
---|---|
imi nu-mi mie imi plac pointerii | mie nu-mi plac pointerii |
Să se scrie un program care citeşte numere de la tastatură până la întâlnirea numărului 0 şi care le stochează într-un vector alocat dinamic, ce va fi realocat dacă este nevoie. La final, se va afişa vectorul stocat, pentru verificare.
Pentru acest lucru, vom avea nevoie de următoarele variabile:
Se va porni cu o capacitate inţială (de exemplu, cap = 5) şi, în momentul în care citim un nou număr şi nu mai există spaţiu pentru a fi stocat (cap == n), se va creşte capacitatea (fie printr-un anumit număr, fie se va dubla) şi se va realoca vectorul v cu această noua capacitate.
Pe prima linie se va afla un sir de numere terminat care se termina cu cifra 0.
Pe prima linie se va afla sirul initial de numere introduse.
Intrare | Ieşire |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 0 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Să se scrie un program pentru citirea unor cuvinte (de la tastatură) şi afişarea numărului de apariţii ale fiecărui cuvânt. Cuvintele au maxim 19 litere fiecare.
Se va folosi un vector de pointeri la cuvinte şi un vector de numere întregi. Variante:
Pe prima linie din fisierul de intrare se va afla un numar natural n ce reprezinta numarul de cuvinte din fisier.
Pe urmatoarele linii se vor afla cele n cuvinte ce urmeaza a fi citite.
Fisierul de iesire va contine pe fiecare linie cate o pereche de forma “cuvant numar_aparitii”.
Cuvintele trebuie afişate în ordinea în care au fost găsite în fişierul de intrare.
Intrare | Ieşire |
---|---|
6 ana are mere are mere mere | ana 1 are 2 mere 3 |