Podstawy programowania komputerów



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

Stałe, tablice dynamiczne i wielowymiarowe

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

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

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

Wskaźniki w C. Anna Gogolińska

Programowanie w języku C++

Podstawy programowania w języku C++

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

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

Tablice, funkcje - wprowadzenie

Wskaźniki. Informatyka

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

Lab 9 Podstawy Programowania

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

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

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

ZASADY PROGRAMOWANIA KOMPUTERÓW

Podstawy programowania w języku C++

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:

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

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

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

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

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.

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

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

Wskaźniki. Programowanie Proceduralne 1

Język ANSI C tablice wielowymiarowe

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.

Uzupełnienie dot. przekazywania argumentów

Wykład 1: Wskaźniki i zmienne dynamiczne

. Podstawy Programowania 2. Wskaźniki i zmienne dynamiczne. Arkadiusz Chrobot. 25 lutego 2019

Struktury czyli rekordy w C/C++

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.

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

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

Wprowadzenie do programowania w języku C

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

Bardzo szybkie podsumowanie: wykład 3

Wykład 4: Klasy i Metody

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

Zmienne, stałe i operatory

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

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

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

2 Przygotował: mgr inż. Maciej Lasota

Języki i metodyka programowania. Wprowadzenie do języka C

Programowanie obiektowe W3

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

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

Języki i metody programowania I

Wskaźniki. Pamięć dynamiczna

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy PRAWA PRZYJACIÓŁ KLASY. Dostęp z zewnątrz: Dostęp z wewnątrz:

Typy danych. Przemysław Gawroński D-10, p lutego Wykład 1. (Wykład 1) Typy danych 25 lutego / 11

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Język C zajęcia nr 11. Funkcje

Podstawy programowania skrót z wykładów:

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

Wskaźniki. Pamięć dynamiczna

Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:

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

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

zmienne stanowią abstrakcję komórek pamięci: programista może przechowywać dane w pamięci, nie martwiąc się o techniczne szczegóły (np.

Wstęp do programowania

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Podstawy programowania w języku C++

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

Podstawy programowania w języku C++

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Biblioteka standardowa - operacje wejścia/wyjścia

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

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

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

Wprowadzenie do programowania w języku C

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Zarządzanie pamięcią

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

Języki i metody programowania I

Funkcja (podprogram) void

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

Temat: Dynamiczne liniowe struktury danych - stos, kolejka, lista. 1. Wady i zalety struktury tablicy

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

Tablice, funkcje, wskaźniki - wprowadzenie

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

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

Wstęp do Programowania, laboratorium 02

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

Podstawy programowania w języku C++

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

Podstawy Programowania

Podstawy Programowania

Wskaźniki. Przemysław Gawroński D-10, p Wykład 1. (Wykład 1) Wskaźniki / 9

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

Tablice (jedno i wielowymiarowe), łańcuchy znaków

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Transkrypt:

Podstawy programowania komputerów Wykład 10: Sterowanie pamięcią w C

Pamięć na stosie!każdy program napisany w języku C ma dostęp do dwóch obszarów pamięci - stosu i sterty, w których może być przechowywana zmienna ilość danych.!na stosie automatycznie przechowywane są zmienne lokalne.!wywołania funkcji również zostawiają ślad na stosie, aby było wiadomo dokąd program ma powrócić po zakończeniu funkcji.!stos obsługiwany jest automatycznie i programista nie ma możliwości ingerencji w tą obsługę.

Pamięć na stercie!sterta jest obszarem pamięci udostępnianym przez system operacyjny wszystkim wykonującym się procesom (sprawdź w WinTop lub PrcView).!W systemach wielodostępnych są zabezpieczenia, które uniemożliwiają dostęp procesu do pamięci, z której korzysta inny proces.!ponieważ wielkość sterty jest ograniczona, więc procesy działające w systemie współzawodniczą o dostęp do tego obszaru.

System operacyjny a pamięć!przydziałem pamięci zajmuje się system operacyjny, może on jednak przydzielić tylko tyle pamięci ile w danej chwili jest wolne.!procesy, którym pamięć została przydzielona, powinny informować system, że z niej nie korzystają -zwalniać pamięć natychmiast po tym jak ona przestaje być im potrzebna.

Przydział pamięci w ruchu programu (Declaration or Runtime Memoty Allocation)!pamięć operacyjna w każdym komputerze ma charakter zasobów zdecydowanie ograniczonych;!często pisząc program nie wiemy, jakie wymiary będzie mieć obszar danych;!zajmowanie zbędnej pamięci zwiększa częstotliwość operacji dyskowych i spowalnia pracę całego środowiska;

Przydzielanie pamięci: malloc ( )!Dla przechowywania danych automatycznie rezerwuje się obszar pamięci, potrzebny zgodnie z deklaracją w kodzie źródłowym C.!Możliwe jest rezerwowanie pamięci w trakcie działania programu za pomocą funkcji malloc ( ) double * wsd; wsd = (double *) malloc(30 * sizeof(double)); Wskaźnik do zarezerwowanego obszaru dla 30 wartości typu double

!Uogólniony format: #include<stdlib.h> Obsługa funkcji malloc( ) void *malloc(size_t size);!wskaźnik typu void (nieokreślony) //można konwertować automatycznie int *ptr ;... ptr= malloc(100*sizeof(int)); //lub stosować wymuszoną konwersje int *ptr ;... ptr = (int*) malloc(100*sizeof(int));

Tablica statyczna i dynamiczna Taki samy obszar pamięci można zarezerwować drogą zadeklarowania tablicy statycznej. float dane[100]; Stosowanie malloc( ) pozwala utworzyć tablicę dynamiczną, czyli taką, której rozmiar określany jest w trakcie działania programu: int n; wsdane = (float *) malloc(n*sizeof(float)); // nie można napisać tak: float dane[n];

Zwalnianie pamięci: free( ) int *ptr_liczby, max = 0;... scanf( %d, &max); ptr_liczby = malloc(max*sizeof(int)); //można lokować dane w pamięci liczby... free (ptr_liczby); //liczby już nie są dostępne

Zalety i wady ręcznej alokacji + Trwałość pamięci jest kontrolowana przez programistę, a nie przez zbiór sztywnych reguł. + Możliwe jest utworzenie bloku pamięci w jednej funkcji i usuniecie go w innej. - Obszar pamięci przeznaczony do alokacji może ulec fragmentacji - aktywne bloki mogą przeplatać się z nieużywanymi. - Korzystanie z ręcznie alokowanej pamięci jest wolniejsze niż korzystanie ze stosu.

Niepowodzenie w alokacji pamięci Programista ma przewidzieć, że malloc( ( ) może zwrócić pusty wskaźnik. Na przykładzie dynamicznego wiersza: d_wiersz( )//funkcja obsługi d_wiersza {char wiersz[ ] ;... ptr_str = malloc(strlen(wiersz)+1); if ( ptr_str!= NULL ) { StrCopy(wiersz, ptr_str); termination = 0} else{termination = 1} return termination}

Stała NULL!W pliku nagłówkowym stdio.h zdefiniowana jest stała o nazwie NULL. Jej wartością jest 0 rzutowane na typ wskaźnikowy.!żadna funkcja służąca do przydziału (alokacji) pamięci, nie zwróci tej wartości, jeśli pamięć już została przydzielona.!wskaźnik, którego wartość jest równa NULL nie wskazuje na żaden obszar pamięci, wartość ta służy do informowania, że wskaźnik jest pusty i pamięć nie jest przydzielona.

Alokacja zerowanej pamięci: calloc()!uogólniony format funkcji: #include <stdlib.h> void *calloc(size_til_elem, size_trozm_elem);!funkcja calloc() alokuje dane na stercie w jednym ciągłym obszarze.!rezerwuje pamięć jak malloc() i dodatkowo powoduje wyzerowanie bajtów.!zawartość pamięci, zarezerwowanej malloc() należy traktować jako nieprzewidywalną!!!

Ponowna alokacja pamięci: realloc( )!Funkcja pozwala na zmianę rozmiaru bloku w obszarze, już przyporządkowanym dynamicznie: void *realloc(void*block, size_t size);!dane, które znajdowały się w poprzednim obszarze pozostają nie zmienione. realloc(null, 10*sizeof(float)); /* to jest równoważne stosowaniu funkcji malloc(10*sizeof(float)) */ realloc(ptr, 0); // równoważne free(ptr);