Język ANSI C. część 11. Jarosław Gramacki Instytut Informatyki i Elektroniki

Podobne dokumenty
Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Podstawy programowania komputerów

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Stałe, tablice dynamiczne i wielowymiarowe

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Stałe i zmienne znakowe. Stała znakowa: znak

Powyższe wyrażenie alokuje 200 lub 400 w zależności od rozmiaru int w danym systemie. Wskaźnik wskazuje na adres pierwszego bajtu pamięci.

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Tablice w argumentach funkcji. Tablicy nie są przekazywane po wartości Tablicy są przekazywane przez referencje lub po wskaźniku

Programowanie w języku C++

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

DYNAMICZNE PRZYDZIELANIE PAMIECI

Uzupełnienie dot. przekazywania argumentów

dynamiczny przydział pamięci calloc() memset() memcpy( ) (wskaźniki!! )

4. Tablica dwuwymiarowa to jednowymiarowa tablica wskaźników do jednowymiarowych tablic danego typu.

Wskaźniki. Informatyka

Tablice, funkcje - wprowadzenie

KURS C/C++ WYKŁAD 6. Wskaźniki

Informatyka. Wy-03 Dynamiczna alokacja pamięci, wyjątki. mgr inż. Krzysztof Kołodziejczyk

Wskaźniki. Programowanie Proceduralne 1

Wskaźniki w C. Anna Gogolińska

Podstawy programowania w języku C++

Języki i metodyka programowania. Wskaźniki i tablice.

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

Język ANSI C tablice wielowymiarowe

Spis treści JĘZYK C - WSKAŹNIKI, DYNAMICZNY PRZYDZIAŁ PAMIĘCI. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Struktury czyli rekordy w C/C++

Podstawy Programowania. Zmienne dynamiczne, struktury, moduły programowe

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

Wskaźniki. Pamięć dynamiczna

Podstawy programowania w języku C++

Podstawy programowania w języku C++

Podstawy programowania w języku C++

Języki programowania obiektowego Nieobiektowe elementy języka C++

Biblioteka standardowa - operacje wejścia/wyjścia

Lab 9 Podstawy Programowania

Języki i metody programowania I

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

ZASADY PROGRAMOWANIA KOMPUTERÓW

Podstawy Programowania. Zmienne dynamiczne, struktury, moduły programowe

Podstawy programowania w języku C++

Wprowadzenie do programowania w języku C

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Podstawy Programowania

Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Lab 8. Tablice liczbowe cd,. Operacje macierzowo-wektorowe, memcpy, memmove, memset. Wyrażenie warunkowe.

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

Programowanie obiektowe W3

Podstawy Programowania

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

dr inż. Paweł Myszkowski Wykład nr 8 ( )

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

Wstęp do programowania 1

Tablice, funkcje, wskaźniki - wprowadzenie

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

Programowanie Proceduralne

Programowanie Procedurale

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

Pobieranie argumentów wiersza polecenia

//zmienne globalne int *pa, *pb; //wskaźniki globalne void main(void) { clrscr(); printf("\n podaj wartosc liczby a\n"); scanf("%d",&a); pa=&a;

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Wskaźniki. Pamięć dynamiczna

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Wstęp do programowania

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Bardzo szybkie podsumowanie: wykład 3

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Wykład 4: Klasy i Metody

Programowanie Proceduralne

Wstęp do programowania

część 9 wskaźniki - c.d Jarosław Gramacki Instytut Informatyki i Elektroniki Przykłady podstawowych wyrażeń ze wskaźnikami

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Podstawy informatyki. Wykład nr 1 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Programowanie I C / C++ laboratorium 03 arytmetyka, operatory

Podstawy Programowania 2 Wskaźniki i zmienne dynamiczne. Plan. Wskaźniki - krótka powtórka. Wskaźniki - krótka powtórka Wartości wskaźników.

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Część 4 życie programu

scanf( %s,tekst); //znaki podane z klawiatury (do pierwszego białego znaku ) //s kopiowane do zmiennej tekst i dostawiany jest znak \0

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Programowanie w C++ Wykład 4. Katarzyna Grzelak. 19 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 37

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Funkcje zawarte w bibliotece < io.h >

Wstęp. do języka C na procesor (kompilator RC51)

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Laboratorium 6: Dynamiczny przydział pamięci. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Transkrypt:

Wpisy zaliczeń: 18.02.2011, godz. 12:00, sala 503 Język ANSI C część 11 tablice 2D, alokacja pamięci Jarosław Gramacki Instytut Informatyki i Elektroniki Było: Alokacja pamięci, stos i sterta Stałe, zmienne statyczne i zewnętrzne mają zarezerwowane miejsce w kodzie wykonywalnym programu (są umieszczane w obszarze danych programu). Zmienne lokalne (automatyczne) funkcji są umieszczane na stosie w momencie, gdy sterowanie wejdzie do bloku, w którym zostały zdefiniowane. Zmienne tej klasy znikają po wyjściu sterowania z bloku (są usuwane ze stosu). Zmienne dynamiczne są umieszczane na stercie. W języki C niezmiernie często zachodzi potrzeba dynamicznej alokacji pamięci dr inż. Jarosław Gramacki, Instytut Informatyki i Elektroniki, UZ (ver. 1.16) 2

SKLADNIA Deklaracje i opis void *calloc(size_t nmemb, size_t size); void *malloc(size_t size); void *realloc(void *ptr, size_t size); void free(void *ptr); OPIS zwróć uwagę na "wskaźnik do czegokolwiek" (wskaźnik na void). W trakcie wywołania funkcji przekażemy właściwy typ kopia z systemowego manuala calloc() przydziela pamięć dla tablicy zawierającej nmemb elementów, każdy o rozmiarze size bajtów i zwraca wskaźnik do przydzielonej pamięci. Pamięć jest zerowana. malloc() przydziela size bajtów i zwraca wskaźnik do przydzielonej pamięci. Pamięć nie jest czyszczona. free() zwalnia obszar pamięci wskazywany przez ptr, który został wcześniej przydzielony za pomocą malloc(), calloc() lub realloc(). W przeciwnym przypadku, lub gdy free(ptr) zostało już wcześniej wywołane, funkcja zachowa się w sposób nieokreślony. Jeśli ptr jest równe NULL, nie zostanie wykonana żadna operacja. realloc() zmienia rozmiar bloku pamięci wskazywanego przez ptr na size bajtów. Zawartość nie zostanie zmieniona w zakresie poniżej minimum ze starego i nowego rozmiaru; nowo przydzielona pamięć nie zostanie zainicjalizowana. Jeśli ptr jest równe NULL, to wywołanie jest równoważne malloc(size); jeśli size jest równe zeru, to wywołanie jest równoważne free(ptr). O ile ptr nie jest równe NULL, musi ono być zwrócone przez wcześniejsze wywołanie malloc(), calloc() lub realloc(). dr inż. Jarosław Gramacki, Instytut Informatyki i Elektroniki, UZ (ver. 1.16) 3 WARTOŚĆ ZWRACANA Dla calloc() i malloc(), zwracana wartość jest wskaźnikiem do przydzielonej pamięci, który jest właściwie wyrównany dla dowolnego rodzaju zmiennej, lub NULL gdy żądanie zakończyło się niepowodzeniem. free() nie zwraca żadnej wartości. Deklaracje i opis realloc() zwraca wskaźnik do nowoprzydzielonej pamięci, który jest właściwie wyrównany dla dowolnego rodzaju zmiennej i może być różny od ptr, lub NULL gdy żądanie zakończy się niepowodzeniem. Jeśli rozmiar był równy 0, zwracane jest NULL lub wskaźnik odpowiedni do przekazania go funkcji free(). Gdy realloc() zakończy się niepowodzeniem, pierwotny blok zostaje nienaruszony - nie jest on ani zwalniany ani przesuwany.... tyle teorii dr inż. Jarosław Gramacki, Instytut Informatyki i Elektroniki, UZ (ver. 1.16) 4

Tablice wskaźników, malloc() // allocates memory using malloc(), checks for error return // for malloc() and exit() int main(void) unsigned mem_ints; int *ptr; unsigned j; // number of ints to store // pointer to start of memory printf("\nenter number of integers to store: "); scanf("%u", &mem_ints); ptr = (int*) malloc(mem_ints * sizeof(int) ); if(ptr == NULL) printf("can't allocate memory"); exit(1); for(j=0; j<mem_ints; j++) ptr[j] = j; for(j=0; j<mem_ints; j++) // fill memory with data // check the data if( ptr[j]!= j ) printf("memory error: j=%u, ptr[j]=%u", j, ptr[j] ); exit(1); free(ptr); // free memory printf("memory test successful"); return 1; Jeśli masz w systemie 512MB to podaj: 50000000 =~ 200MB lub #include <assert.h> i dalej: assert( ptr!= NULL); przećwicz działanie assert doprowadzając do błędu (tu: alokacji pamięci) dr inż. Jarosław Gramacki, Instytut Informatyki i Elektroniki, UZ (ver. 1.16) 5 #define NDEBUG // wylacza tryb debug #include <assert.h> int main(void) assert(1==2); #define DEBUG // wlacza tryb debug #include <assert.h> int main(void) assert(1==2); Funkcja assert() C:\Temp>Project1.exe Assertion failed: 1==2, file main.c, line 6 This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. dr inż. Jarosław Gramacki, Instytut Informatyki i Elektroniki, UZ (ver. 1.16) 6

Tablice wskaźników, realloc() // reallocates memory using realloc() // for realloc() and exit() W praktyce 10 bajtów wystarczy na 2.5 liczby int. Wiec #define CHUNK 10 co dwie // wprowadzone bytes of additional liczby trzeba doalokować memory pamięci int main(void) int *ptr = NULL; int j, n = 0; int total_bytes = 0; printf("\n"); do if( n*sizeof(int) >= total_bytes ) // pointer to memory // number of data items stored // total bytes allocated gdyby nie inicjalizacja NULL przy deklaracji to wcześniej trzeba by użyć malloc() lub calloc() // if no more memory, ptr = (int*) realloc(ptr, CHUNK); // get another chunk if(ptr == NULL) printf("\ncan't reallocate memory"); exit(1); total_bytes += CHUNK; printf("total bytes allocated = %d\n", total_bytes ); printf("enter a number: "); // get data from user scanf( "%d", &ptr[n] ); // store in memory while(ptr[n++]!= 0); używamy "zwykłego" // user enters 0 for(j=0; j<n-1; j++) operatora [] // display the data printf("%7d ", ptr[j]); free(ptr); return 1; dr inż. Jarosław Gramacki, Instytut Informatyki i Elektroniki, UZ (ver. 1.16) 7 Tablice wskaźników, malloc() + realloc() podajemy z klawiatury kolejno napisy. Zakończenie programu po podaniu "quit" program za każdym razem doalokowuje tyle pamięci aby zmieścić wszystkie wprowadzone napisy oraz ustalony ich separator (znak '-') #include <stdio.h> #include <string.h> char *DodajDo(char *p, char *str); int main (void) char buf[30], *ptr = NULL; do printf("\npodaj napis: "); gets(buf); if (ptr = DodajDo(ptr, buf)) printf("\n %s", ptr); else printf("brak pamięci"); while (strcmp(buf, "quit")); getchar(); free(ptr); c.d.n. tu będzie znajdował się "rosnący" w miarę podawania kolejnych danych napis będzie ważne przy pierwszym wywołaniu funkcji DodajDo() // popraw błąd: quit też się wyświetli dr inż. Jarosław Gramacki, Instytut Informatyki i Elektroniki, UZ (ver. 1.16) 8

c.d. Tablice wskaźników, malloc() + realloc() podajemy z klawiatury kolejno napisy. Zakończenie programu po podaniu "quit" program za każdym razem doalokowuje tyle pamięci aby zmieścić wszystkie wprowadzone napisy oraz ustalony ich separator (znak '-') // implementacja funkcji DodajDo() char *DodajDo(char *p, char *str) if (!p ) // spr. czy string istnieje if (!(p = (char*)malloc(strlen(str) + 1))) // +1 na znak '-' return NULL; else strcpy(p, str); // zapełnienie bufora else if (!(p = (char*)realloc(p, strlen(p) + strlen(str) + 2))) // +2 gdyż separator return NULL; else strcat(strcat(p, "-"), str);// dodanie separat. i nowego napisu return p; zwracamy wskaźnik do alokowanej w funkcji pamięci porównaj przykład "mapa pamięci" z wcześniejszego wykładu zwróć uwagę na kaskadowe wywołania strcat() dr inż. Jarosław Gramacki, Instytut Informatyki i Elektroniki, UZ (ver. 1.16) 9 Tablice wskaźników, alokacja pamięci dla tablicy 2D #include <assert.h> int main(void) int i, j, r, c; // rows, columns ptr double** 1.4 3 double **ptr; double* double printf("enter # of rows and # of cols: "); scanf("%d %d", &r, &c); // how many rows and columns? // 1. etap ptr = (double**) malloc ( r * sizeof(double*) ); assert (ptr!= NULL); proces 2-etapowy // 2. etap ptr[i] = (double*) malloc ( c * sizeof(double) ); assert (ptr!= NULL); for (j=0; j < c; j++) printf("enter elements %d %d: ", i, j); scanf("%lf", &ptr[i][j]); fun (ptr, r, c); // argument przekazany "jak zwykle" c.d.n. 1.5 2.5 4.4 5.5 6.15 6 1 5 4.3 5 1 3 5 2 4 2 3.5 4.4 1.6 lub indywidualna wartość dla każdego wiersza // read values to a matrix używamy "zwykłego" operatora [][] dr inż. Jarosław Gramacki, Instytut Informatyki i Elektroniki, UZ (ver. 1.16) 10

Tablice wskaźników, alokacja pamięci dla tablicy 2D c.d. free(ptr[i]); free(ptr); // free memory in reverse order return 1; // end main void fun( double **tab, int r, int c) int i, j; for (j=0; j < c; j++) printf("%f ", tab[i][j]; używamy "zwykłego" operatora [][] dr inż. Jarosław Gramacki, Instytut Informatyki i Elektroniki, UZ (ver. 1.16) 11 Tablice wskaźników, alokacja pamięci dla tablicy 2D inne sposoby alokacji pamięci dla tablic "typu 2D" - następny wykład dr inż. Jarosław Gramacki, Instytut Informatyki i Elektroniki, UZ (ver. 1.16) 12