dynamiczny przydział pamięci

Slides:



Advertisements
Podobne prezentacje
Tablice 1. Deklaracja tablicy
Advertisements

C++ wykład 2 ( ) Klasy i obiekty.
C++ wykład 4 ( ) Przeciążanie operatorów.
Język C/C++ Funkcje.
Klasa listy jednokierunkowej Przekazywanie parametrów do funkcji
Standardowa biblioteka języka C++
Programowanie obiektowe
1 Wskaźniki w C Podstawy podstaw podstaw podstaw.....
Prowadzący: mgr inż. Elżbieta Majka
Systemy rozproszone W. Bartkiewicz
Języki programowania C++
typy całkowite (całkowitoliczbowe)
Opisy funkcji Adres strony WWW : html /html_node/libc_528.html.
argumenty wiersza poleceń: getopt
Dziel – Rządź - Złącz.
Uzupełnienie dot. przekazywania argumentów #include struct nowa { int f; char line[20000]; int k; } reprezentant; int main() { void funkcja7( struct nowa.
formatowanie kodu źródłowego
Funkcje Modularyzacja : program główny , funkcje Funkcje :
Zakres i zasięg deklaracji Zakres : obszar programu, w którym identyfikator może być użyty zakres globalny : cały program zakres lokalny : definicja pojedynczej.
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
Struktury.
Tablice.
1 Dygresja: cztery płyty główne…. 2 Dygresja: osobliwości C /* cos o nieistniejacym typie Boolean */ /* oraz o operatorze przecinkowym */ #include int.
Wykład 1: Wskaźniki Podstawy programowania Programowanie w C
Podstawy programowania PP – WYK2 Wojciech Pieprzyca.
Zachodniopomorskie Centrum Edukacyjne Zadanie domowe.
Tablice tablica jest sekwencją elementów tego samego typu (prostego lub obiektowego) w Javie tablice są obiektami, a zmienne tablicowe przechowują referencję
Typy wskaźnikowe, dynamiczne struktury danych
nowe operatory & . (kropka) * operator rzutowy -> , (przecinek)
Podstawy programowania II
Programowanie obiektowe III rok EiT
Informatyka I Wykład 10 WSKAŹNIKI I ADRESY Jerzy F. Kotowski.
GOSPODARKA PAMIĘCIĄ, STRUMIENIE (i nie tylko)
TABLICE C++.
Jerzy F. Kotowski1 Informatyka I Wykład 11 STRUKTURY I UNIE.
Podstawy programowania
sortowanie na bazie – wykorzystanie sortowania ze zliczaniem
Jerzy F. Kotowski1 Informatyka I Wykład 8 STRUKTURA PROGRAMU n Funkcje n Klasy zmiennych n Projekt.
Automatyka i Robotyka Systemy czasu rzeczywistego Wykład 4.
Programowanie obiektowe III rok EiT
Podstawy programowania w języku C i C++
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład VIII.
Programowanie strukturalne i obiektowe
Jerzy F. Kotowski1 Informatyka I Wykład 14 DEKLARATORY.
Programowanie obiektowe III rok EiT
Tablice. Tablica struktura danych, służy do przechowywania danych tego samego typu, zapisana w pamięci w sposób ciągły. Deklaracja tablicy PascalC++,
C# Platforma .NET CZ.3 Kuba Ostrowski.
Podstawy informatyki 2013/2014
jeszcze dygresja o macierzach...
Kurs języka C++ – wykład 3 ( )
Programowanie strukturalne i obiektowe C++
Kurs języka C++ – wykład 4 ( )
K URS JĘZYKA C++ – WYKŁAD 1 ( ) Łagodne wprowadzenie do języka C++
1 Zagadnienia na egzamin. 2 Język C podsumowanie Struktura programu w języku C Zmienne, Stałe Operacje arytmetyczne Operatory logiczne Priorytety operatorów.
1 dynamiczny przydział pamięci malloc() free() realloc() calloc() memset() memcpy( ) mempcpy( ) memmove() (wskaźniki!! )
Programowanie proceduralne Podstawy Programowania dla geoinformatyków Wykład 3 Rafał Witkowski, 2015.
1 Uzupełnienie dot. przekazywania argumentów #include struct nowa { int f; char line[20000]; int k; } reprezentant; int main() { void funkcja7( struct.
Podstawy informatyki Tablice Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Wstęp do programowania Wykład 2 Dane, instrukcje, program.
1 Opisy funkcji Adres strony WWW : html (należy odszukać hyperlink Function Index) (
1 Czy procesor musi się grzać? Np. dodawanie 2 liczb 1-bitowych. Możliwych stanów początkowych: cztery Możliwych stanów końcowych: dwa to można opisać.
Czy procesor musi się grzać?
Wskaźniki Elżbieta Labocha.
PODSTAWY INFORMATYKI Wykład 4.
Opisy funkcji Adres strony WWW :
Uzupełnienie dot. przekazywania argumentów
nowe operatory & . (kropka) * operator rzutowy -> , (przecinek)
Przykładowy algorytm geometryczny (geometria płaska)
dynamiczny przydział pamięci
Zapis prezentacji:

dynamiczny przydział pamięci malloc() free() realloc() calloc() memset() memcpy( ) mempcpy( ) memmove() (wskaźniki!! )

pointer.c To, że wskaźnik wskazuje na jakiś adres nie gwarantuje tego, że pod tym adresem przechowywane jest coś sensownego z punktu widzenia wykonującego się programu. Przykładowy program: np. pointerb.c , http://users.uj.edu.pl/~ufrudy (wystarczy np., że wskaźnik został załadowany adresem zmiennej, której czas życia minął, gdyż była zmienna klasy auto w jakiejś funkcji)

ile pamięci zaalokował malloc? jak uzyskać informację? #include <malloc.h> struct mallinfo alex; alex=mallinfo ( ); /* wywołanie funkcji */ /* alex.arena alex.hblkhd całkowita ilość pamięci w bajtach alokowana przez malloc przez sbrk oraz przez mmap */

struct mallinfo www. gnu struct mallinfo www.gnu.org/software/libc/manual/html_node/Statistics-of-Malloc.html int arena This is the total size of memory allocated with sbrk by malloc, in bytes. int ordblks This is the number of chunks not in use. (The memory allocator internally gets chunks of memory from the operating system, and then carves them up to satisfy individual malloc requests) int smblks This field is unused. int hblks This is the total number of chunks allocated with mmap.

struct mallinfo www. gnu struct mallinfo www.gnu.org/software/libc/manual/html_node/Statistics-of-Malloc.html hblks This is the total number of chunks allocated with mmap. int hblkhd This is the total size of memory allocated with mmap, in bytes. int usmblks This field is unused. int fsmblks

struct mallinfo www. gnu struct mallinfo www.gnu.org/software/libc/manual/html_node/Statistics-of-Malloc.html int uordblks This is the total size of memory occupied by chunks handed out by malloc. int fordblks This is the total size of memory occupied by free (not in use) chunks. int keepcost This is the size of the top-most releasable chunk that normally borders the end of the heap (i.e. the high end of the virtual address space's data segment).

struct mallinfo, mallinfo() przykład użycia #include <stdio.h> /* przykład mallinfo () */ #include <stdlib.h> #include <malloc.h>

struct mallinfo, mallinfo() przykład użycia #include <stdio.h> /* przykład mallinfo () */ #include <stdlib.h> #include <malloc.h>

struct mallinfo, mallinfo() przykład użycia struct st { float buf[1000*1000*10]; } *p1; struct mallinfo alex; main() {/* w tej funkcji main jest użyta funkcja mallinfo */

struct mallinfo, mallinfo() przykład użycia while(1) { p1=malloc( sizeof(struct st) ); if(p1==NULL) { printf("..brak pamieci..\n"); break; } alex=mallinfo(); printf("\n main alex.arena=%d alex.ordblks=%d alex.hblks=%d", alex.arena, alex.ordblks, alex.hblks); printf("\n alex.hblkhd=%ld alex.uordblks=%d", alex.hblkhd, alex.uordblks); printf("\n alex.fordblks=%d alex.keepcost=%d\n", alex.fordblks, alex.keepcost); printf("\n"); } } /* koniec funkcji main */

struct mallinfo, mallinfo() przykład użycia main poczatek alex.arena=0 alex.ordblks=1 alex.hblks=0 alex.hblkhd=0 alex.uordblks=0 alex.fordblks=0 alex.keepcost=0 .................................................... main po alex.arena=0 alex.ordblks=1 alex.hblks=12 alex.hblkhd=480018432 alex.uordblks=0 ..................................................... (aż w końcu program wypisze) ..brak pamieci..

Jak czytać skomplikowane deklaracje. (”Symfonia C++” J. Grębosz, 8. 17 1. Zaczynamy czytanie od nazwy ”tego co jest deklarowane” . 2. Od tej nazwy posuwamy się w prawo. To dlatego, że tam mogą stać najmocniejsze (jeśli chodzi o priorytet) operatory: operator wywołania funkcji (....) bądź operator indeksowania tablicy [] . 3. Jeśli w prawo już nic nie ma, lub natkniemy się na zamykający nawias – wówczas zaczynamy czytanie w lewo. Kontynuujemy tak długo, dopóki wszystkiego nie przeczytamy, lub dopóki nie natkniemy się na zamykający nawias. 4. Jeśli napotkamy taki nawias, to wychodzimy z czytaniem na zewnątrz nawiasu. Znowu zaczynamy czytać w prawo, czyli wracamy do punktu 2. 5. I tak dalej, dopóki nie przeczytamy wszystkiego w tej deklaracji.

* jest wskaźnikiem mogącym pokazywać na... Jak czytać skomplikowane deklaracje? (”Symfonia C++” J.Grębosz, 8.17.1) Jak czytamy? Słownik! * jest wskaźnikiem mogącym pokazywać na... (typ1,typ2,...) jest funkcją wywoływaną z argumentami typ1, typ2..... [n] jest n-elementową tablicą......

char * tan (float p, int s); /* funkcja.....*/ Jak czytać skomplikowane deklaracje? (”Symfonia C++” J.Grębosz, 8.17.1) float * fp; char * tan (float p, int s); /* funkcja.....*/ char (* tas ) (float p, int s); /* wskaźnik do funkcji...*/ char * (* tas) (float p, int s); /* wskaźnik do funkcji....*/

int ( * (*fw) (int a, char * b) ) [2] ; Jak czytać skomplikowane deklaracje? (”Symfonia C++” J.Grębosz, 8.17.1) int ( * (*fw) (int a, char * b) ) [2] ; fw jest wskaźnikiem do funkcji posiadającej dwa argumenty, pierwszy typu int, drugi typu wskaźnik do char, funkcja ta zwraca wskaźnik do dwuelementowej tablicy typu int int * warka[5](float,float); warka jest 5-elementowa macierzą funkcji zwracających wskaźnik do typu int (uwaga - kompilator nie rozumie)

Jak czytać skomplikowane deklaracje? struct kos { float as; int k[10000] } kos1; struct kos * (*fp4[6])( struct kos *a, struct kos (*b)(void) ); fp4 jest 6-elementową tablicą wskaźników do funkcji, która ma dwa argumenty (struct kos * oraz struct kos (*b)(void) ) , a zwracającą wskaźnik do zmiennej typu struct kos

argumenty wiersza poleceń funkcja main ma dwa argumenty main(int argc, char * argv [ ] ) (tak sa zwyczajowo nazywane, choć nie są to nazwy obowiązujące)

argumenty wiersza poleceń #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main (int argc, char *argv[] ) /* albo int main( int argc, char **argv) */ { int n; for(n=0;n<argc; ++n) { printf("\n n=%d param= %s",n, argv[n]); printf("\n to samo... n=%d param= %s",n, *(argv+n) ); printf("\n"); } exit(0); } /* koniec funkcji main */

argumenty wiersza poleceń: getopt #include <stdio.h> /* getopt2.c */ #include <stdlib.h> #include <unistd.h> /* niezbędne */ int main(int argc, char *argv[]) { int n; int opt;

argumenty wiersza poleceń: getopt printf("\n argc=%d\n",argc); for(n=0;n<argc;++n) { printf(" *argv[%d] %s\n",n, argv[n]); } printf("\n");

argumenty wiersza poleceń: getopt while( (opt=getopt(argc,argv,"a:b:")) != -1 ) { switch (opt) { case 'a' : printf("case \'a\'\n"); printf(" optarg=%s=\n",optarg); break; case 'b' : printf("case \'b\'\n"); } } /* koniec while */ } /* koniec main */

argumenty wiersza poleceń: getopt przykład: a.out -a45 -b789 argc=3 *argv[0] a.out *argv[1] -a45 *argv[2] -b789 case 'a' optarg=45= case 'b' optarg=789=

kwalifikator volatile volatile int alfa; int volatile alfa;