Język C
Transkrypt
Język C
Laboratorium nr 8
Instrukcja
laboratoryjna
8
1)
1/4
Język C
Temat: Zarządzanie pamięcią.
Przygotował: mgr inż. Maciej Lasota
Przydział i zwalnianie obszarów pamięci.
Funkcja malloc() należy do standardowej biblioteki języka C, zadeklarowana jest w
pliku nagłówkowym <stdlib.h>. Jej zadaniem jest dynamiczne alokowanie (pobieranie od
systemu operacyjnego) żądanego bloku pamięci. Przydziela ona obszar pamięci, a
następnie zwraca wskaźnik do tego obszaru. Pamięć pobierana jest z obszaru pamięci
zwanego stertą.
void *malloc(rozmiar);
Pobiera ona jeden argument, którym jest liczba bajtów do przydzielenia. W
przypadku gdy nie może przydzielić określonego miejsca w pamięci zwraca NULL.
Przydzielony obszar pamięci nie jest inicjalizowany, oznacza to że przechowywane są w nim
przypadkowe dane. Funkcja malloc() zwraca wskaźnik typu „void” jest to tzw. wskaźnik
ogólny (wskaźnik, który wskazuje na zmienną dowolnego typu). Dlatego też jeżeli
przydzielamy obszar pamięci dla konkretnego typu danych, należy wynik rzutować na
pożądany typ danych.
Funkcja calloc() służy do alokowania obszaru pamięci przeznaczonego na tablicę.
Zadeklarowana jest w pliku nagłówkowym <stdlib.h>. Przydziela obszar pamięci na tablicę,
a następnie zwraca wskaźnik do tego obszaru. Pamięć pobierana jest z obszaru pamięci
zwanego stertą.
void *calloc(ilosc,rozmiar);
Pobiera ona dwa argumenty, pierwszym argumentem jest liczba elementów w
tablicy, drugim natomiast rozmiar pojedynczego elementu tablicy. W przypadku gdy nie
może przydzielić określonego miejsca w pamięci zwraca NULL. Przydzielony obszar pamięci
jest inicjalizowany zerami.
Laboratorium nr 8
Przykład:
#include <stdio.h>
#include <stdlib.h>
float srednia(int rozmiar, int *t)
{
return(suma(rozmiar,t)/(float)rozmiar);
}
int suma(int rozmiar, int *t)
{
int i;
int suma=0;
for(i=0; i<rozmiar; i++)
{
suma = (suma + (*t));
t++;
}
return(suma);
}
void wprowadz(int rozmiar, int *t)
{
int i;
for(i=0; i<rozmiar; i++)
{
printf("Podaj liczbe: ");
scanf("%d",t);
t++;
}
}
void wyswietl(int rozmiar, int *t)
{
int i;
for(i=0; i<rozmiar; i++)
{
printf("Wprowadzona liczba: %d\n",*t);
t++;
}
}
int main(int argc, char *argv[])
{
int i;
int *tab, *tab_pom;
2/4
Laboratorium nr 8
3/4
if(argc != 2)
{
printf("Blad wywolania programu
<%s> <rozmiar>\n",argv[0]);
exit(1);
}
if((tab = calloc(atoi(argv[1]),sizeof(int))) == NULL)
{
printf("Blad alokacji pamieci ...\n");
exit(1);
}
wprowadz(atoi(argv[1]),tab);
wyswietl(atoi(argv[1]),tab);
printf("Srednia: %f\n",srednia(atoi(argv[1]),tab));
free(tab);
return(0);
}
Funkcja realloc() służy do zmiany rozmiaru obszaru (bloku) pamięci utworzonego
przez malloc() lub calloc(). Przyjmuje dwa parametry, pierwszym parametrem jest wskaźnik
na obszar pamięci (który chcemy zmienić), drugim natomiast nowy rozmiar obszaru.
void *realloc(wskaznik,rozmiar);
Zawartość obszaru pamięci (poddawanego modyfikacji) nie ulegnie zmianie (w
przypadku gdy nowy rozmiar jest większy od starego rozmiaru). Jeśli nowy rozmiar obszaru
jest większy, dodatkowy obszar nie jest inicjalizowany. Funkcja zwraca wskaźnik na nowy
obszar lub NULL w przypadku błędu.
Funkcja free() służy do zwolnienia (zwrócenia) przydzielonej pamięci. Przyjmuje
jeden parametr, który jest wskaźnikiem zwróconym wcześniej przez funkcje malloc(), calloc()
lub realloc().
void free(wskaznik);
Laboratorium nr 8
2)
4/4
Wypełnianie, kopiowanie i porównywanie pamięci.
Funkcja memset() należy do standardowej biblioteki języka C, zadeklarowane jest w
pliku nagłówkowym <string.h>. Służy do ustawiania podanego obszaru pamięci daną
wartością. Przyjmuje trzy parametry, pierwszy określa miejsce docelowe (obszar pamięci),
drugi parametr oznacza wartość jako chcemy ustawić, ostatni parametr oznacza ilość miejsc
w docelowym obszarze, które chcemy ustawić.
memset(gdzie,wartosc,rozmiar);
Przykład:
memset(tablica1,0,sizeof(tablica1));
Funkcja memcpy() służy do kopiowania obszarów pamięci, przyjmuje trzy parametry.
Pierwszy parametr oznacza miejsce źródłowe, drugi miejsce docelowe, ostatni ilość bajtów
do skopiowania.
memcpy(to,from,rozmiar);
Przykład:
char dane1[20],dane2[20];
memcpy(dane1, dane2, sizeof(dane1)); // dane2 -> dane1
Funkcja memcmp() służy do porównywania obszarów (bloków) pamięci o
określonym rozmiarze, zwraca analogiczne wartości co funkcja strcmp().
memcmp(wsk1,wsk2,rozmiar);
Przykład:
char dane1[20],dane2[20];
if(memcmp(dane1, dane2, sizeof(dane1)) == 0)
puts(”Identyczne”);
else puts(”Rozne”);