|
Wpisał doctor
|
|
Poniedziałek, 12. Marzec 2007 02:49 |
|
Operacje na pamięci
W pamięci RAM, tzw pamięci danych przechowywane są zmienne wymagane podczas pracy programy. Sam program jest ładowany do pamięci, tyle że jest to pamięć programu.
Poniżej przedstawię przydatne funkcje, ułatwiające pracę z pamięcią.
funkcja memset - przydatna gdy chcemy zapełnić pamięć tymi samymi elementami, np. zerami. void *memset(void *bufor, char znak, rozmiar bufora)
Przykład Kładziemy na formę 1 Button oraz 2 Labele. Zdarzenie OnClick przycisku uzupełniamy
void __fastcall TForm1::Button1Click(TObject *Sender) { char bufor[] = "www.doctor.programuj.com"; Label1->Caption = bufor; memset(bufor, '0', 5); Label2->Caption = bufor; } |
Jak widać, funkcja memset zastąpi pięc pierwszych znaków naszego bufora zerami, czyli zacznie czyścić bufor. W aplikacjach konsolowych wymaga włączenia bibliotek #include <string.h> #include <stdio.h> #include <mem.h>
funkcja memcpy kopiuje blok n-bajtów ze Ľródła do miejsca docelowego. void *memcpy(void *przeznaczenie, const void *zrodlo,int n) {viewonly="registered} Przykład
void __fastcall TForm1::Button1Click(TObject *Sender) { char zrodlo[] = "******************************"; char przeznaczenie[] = "abcdefghijlkmnopqrstuvwxyz0123456709"; char *ptr;
Label1->Caption = przeznaczenie;
ptr = (char *) memcpy(przeznaczenie, zrodlo, strlen(zrodlo));
if (ptr) Label2->Caption = przeznaczenie; else ShowMessage("błąd memcpy\n"); }
|
W aplikacjach konsolowych wymaga dołączenia mem.h, string.h.
funkcja memcmp porównuje dwa bloki pamięci na długości pierwszych n-bajtów. int memcmp(const void *blok1, const void *blok2, int n) Funkcja zwraca wartość równą zero jeśli porównywane bloki są równe. W innym przypadku zwraca wartość różną od zera.
1 przypadek: bloki nie są takie same.
char *blok1 = "ABCDE123"; char *blok2 = "ABCDe237"; int status = memcmp(blok1, blok2, 5); //The strings to position 5 are: if (status) Label1->Caption = "Nie takie same"; if(status == 0) Label1->Caption = "Takie same";
|
Zwracam uwagę, że porównywane jest tylko 5 pierwszych znaków z każdego bloku.
2 przypadek: porównywane bloki są takie same.
char *blok1 = "ABCDE123"; char *blok2 = "ABCDE237"; int status = memcmp(blok1, blok2, 5); //The strings to position 5 are: if (status) Label1->Caption = "Nie takie same"; if(status == 0) Label1->Caption = "Takie same"; |
Wymagane biblioteki mem.h, string.h.
Rezerwacja bloku pamięci o długości n-bajtów - funkcja malloc. void *malloc(int n) Jeśli operacja alokacji pamięci przebiegnie poprawnie, funkcja zwraca wskaĽnik do bloku pamięci. Jeżeli nie ma wystarczająco dużo miejsca w pamięci n aalokację bloku, to funkcja malloc zwraca NULL.
char *wskaznik;// wskaznik do bloku pamieci if ((wskaznik = (char *) malloc(50)) == NULL)// rezerwacja 10 bajtów pamięci Label1->Caption = "Nie udało się zarezerwować pamięci"; else { Label1->Caption = "Zarezerwowałem pamięć"; strcpy(wskaznik, "Kopiuję przykładowe dane do pamięci"); Label2->Caption = wskaznik; }
|
Wymagane biblioteki alloc.h, stdlib.h.
Pozostałe funkcje do przydziału pamięci: void *realloc(void *block, int n) - zmienia rozmiar przydzielonej poprzednio pamięci na n-bajtów. void *calloc(int n, int rozmiar_zmiennej) - do dynamicznego przydziału pamięci. Rezerwacja n-jednostek pamięci.
Przykład
char *wskaznik = NULL; wskaznik = (char *) calloc(10, sizeof(char)); // alokacja 10 jednostek typu char strcpy(wskaznik, "doctor"); Label1->Caption = wskaznik; free(wskaznik);
| {/viewonly}
Zwalnianie przydzielonej pamięci - skoro umiemy ją alokować, to musimy umieć ją i zwalniać. Służy do tego funkcja free. void free(void *block)
Zwalnianie pamięci w powyższym przykładzie:
|
|
Ostatnia aktualizacja: Piątek, 10. Lipiec 2009 13:58 |