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

Podobne dokumenty
Informatyka. Wy-02 Tablice, wskaźniki, warunki i pętle. mgr inż. Krzysztof Kołodziejczyk

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

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

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

Uzupełnienie dot. przekazywania argumentów

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

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:

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

Informatyka. Wy-05 Struktury, unie, organizacja pól struktur w pamięci

Informatyka. Wy-08 Klasy. mgr inż. Krzysztof Kołodziejczyk

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

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

DYNAMICZNE PRZYDZIELANIE PAMIECI

Struktury czyli rekordy w C/C++

Tablice, funkcje - wprowadzenie

Wskaźniki. Programowanie Proceduralne 1

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

Podstawy programowania komputerów

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

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

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Bardzo szybkie podsumowanie: wykład 3

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.

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

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

Programowanie Proceduralne

Stałe, tablice dynamiczne i wielowymiarowe

Zaawansowane programowanie w języku C++ Biblioteka standardowa

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

Tablice, funkcje, wskaźniki - wprowadzenie

Podstawy programowania w języku C++

Wskaźniki. Pamięć dynamiczna

Programowanie w języku C++

Podstawy programowania w języku C++

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

Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory

Lab 9 Podstawy Programowania

Podstawy programowania w języku C++

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

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

Pobieranie argumentów wiersza polecenia

Tablice deklaracja, reprezentacja wewnętrzna

Język ANSI C tablice wielowymiarowe

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

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

Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Podstawy programowania 1

Ghost in the machine

Programowanie I C / C++ laboratorium 01 Organizacja zajęć

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

Wskaźniki w C. Anna Gogolińska

Wskaźniki. Pamięć dynamiczna

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

Struktury. Przykład W8_1

Programowanie Proceduralne

Wprowadzenie do języka Java

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

Shared memory and messages. Functions. process 0. process 1. program 0. program 0. data 0. data 1. program 1. data 0. data 1.

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

Podstawy programowania w języku C++

Funkcje zawarte w bibliotece < io.h >

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

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

Język C zajęcia nr 11. Funkcje

Pliki. Informacje ogólne. Obsługa plików w języku C

Wstęp do programowania

Wskaźniki. Informatyka

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

Funkcje zawarte w bibliotece < io.h >

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

Microsoft IT Academy kurs programowania

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

Wprowadzenie do programowania w języku C

Języki i paradygmaty programowania 1 studia stacjonarne 2018/19. Lab 9. Tablice liczbowe cd,. Operacje na tablicach o dwóch indeksach.

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

Podstawy programowania. Wykład Co jeszcze... Przypomnienia, uzupełnienia. Krzysztof Banaś Podstawy programowania 1

Tworzenie aplikacji w języku Java

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

Podstawy programowania w języku C++

Podstawy programowania w języku C++

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

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

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

Podstawy Programowania.

Zmienne, stałe i operatory

Wstęp do programowania 1

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

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

Część 4 życie programu

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

C compiler (Linux) Cześć 01 - Ćwiczenia strona 2 z 9

Funkcja, argumenty funkcji

C++ język nie dla ludzi o słabych nerwach. Małgorzata Bieńkowska

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

ŁAŃCUCHY W JĘZYKU C/C++

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

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

Transkrypt:

Informatyka Wy-03 Dynamiczna alokacja pamięci, wyjątki mgr inż. Krzysztof Kołodziejczyk krzysztof.m.kolodziejczyk@pwr.edu.pl 13.03.2019

Strona kursu http://w12.pwr.wroc.pl/inf/

Konsultacje Piątek 13:00 C2/111a

Konspekt 1 W poprzednim odcinku... 2 man 3 Dynamiczna alokacja pamięci

Konspekt 1 W poprzednim odcinku... Stałe i zmienne Wskaźniki Tablice Arytmetyka wskaźników 2 man

Stałe 42 42.0 4 "42"

Stałe 42 42.0 4 "42" 42L 0xBUL 0.0F 0.0L 0777 \n \0x20

Zmienne char int, short int, long int float, double, long double signed / unsigned array *

Zasięg zmiennej i n t plus2 ( i n t a ){ i n t x=2; a += x ; return a ; } void main ( void ){ i n t a=5; i n t b=plus2 ( a ) ; p r i n t f ( "%d %d\n", a, b ) ; // 5 7 p r i n t f ( "%d\n", x ) ; // e r r o r : x undeclared }

Zasięg zmiennej void main ( void ){ i n t a=5; i n t b=6; { i n t a=7; b=8; } p r i n t f ( "%d %d\n", a, b ) ; // 5 8 p r i n t f ( "%d\n", x ) ; // e r r o r : x undeclared }

Zasięg zmiennej void main ( void ){ i n t a ; f o r ( i n t i =0; i <10; i ++) { a = i ; } audytoriumf ( "%d\n", a ) ; audytoriumf ( "%d\n", i ) ; }

Zasięg zmiennej void main ( void ){ i n t a ; i n t i ; f o r ( i =0; i <10; i ++) { a = i ; } z a p l u s a f ( "%d %d\n", a, i ) ; }

Zasięg zmiennej void main ( void ){ f o r ( i n t i =0; i <2; i ++) { f o r ( i n t i =0; i <3; i ++) { p r i n t f ( "%d ", i ) ; } } }

Zasięg zmiennej void main ( void ){ i n t i ; i n t i ; // e r r o r : r e d e c l a r a t i o n o f i }

Wskaźniki f0c1be80 [80]00 00 00[80]00 00 00 f0c1be88 00 00 00 00 00 00 00 00 f0c1be90 00 00 00 00 00 00 00 00 f0c1be98 [84]be c1 f 0 00 00 00 00 i n t a=192; i n t b=204; i n t p_a ; p_a=&a ; //p_a = f0c1be80 p_a = 128; p_a=&b ; //p_a = f0c1be84 p_a = 128;

Tablice jednowymiarowe f0c1be80 02 00 00 00 08 00 00 00 f0c1be88 20 00 00 00 80 00 00 00 f0c1be90 00 02 00 00 00 08 00 00 f0c1be98 [80 be c1 f0]00 00 00 00 i n t a [ ] = { 2, 8, 3 2, 1 2 8, 5 1 2, 2 0 4 8 } ; i n t p_a = a ; &a [ 0 ] == a == p_a a [ 0 ] == p_a

Tablice dwuwymiarowe f0c1be80 01 02 03 04 07 06 08 09 f0c1be88 04 08 01 05 00 00 00 00 f0c1be90 [80 be c1 f0 84 be c1 f0] f0c1be98 [88 be c1 f0]00 00 00 00 char b [ 3 ] [ 4 ] = { { 1, 2, 3, 4 }, { 7, 6, 8, 9 }, {4,8,1,5} } ;

Tablice dwuwymiarowe f0c1be80 01 02 03 04 07 06 08 09 f0c1be88 04 08 01 05 00 00 00 00 f0c1be90 [80 be c1 f0 84 be c1 f0] f0c1be98 [88 be c1 f0]00 00 00 00 char b [ 3 ] [ 4 ] = { { 1, 2, 3, 4 }, { 7, 6, 8, 9 }, {4,8,1,5} } ; b == b [ 0 ] [ 0 ] == ( b [ 0 ] )

Arytmetyka wskaźników f0c1be80 02 00 00 00 08 00 00 00 f0c1be88 20 00 00 00 80 00 00 00 f0c1be90 00 02 00 00 00 08 00 00 f0c1be98 00 00 00 00 00 00 00 00 i n t a [ ] = { 2, 8, 3 2, 1 2 8, 5 1 2, 2 0 4 8 } ; a [ 2 ] == ( a+2) == 32 &a [ 2 ] == a + 2 s i z e o f ( i n t ) == f0c1be88

Arytmetyka wskaźników f0c1be80 01 02 03 04 07 06 08 09 f0c1be88 04 08 01 05 00 00 00 00 f0c1be90 [80 be c1 f0 84 be c1 f0] f0c1be98 [88 be c1 f0]00 00 00 00 char b [ 3 ] [ 4 ] = { { 1, 2, 3, 4 }, { 7, 6, 8, 9 }, {4,8,1,5} } ; b [ 2 ] == f0c1be88 ( ( b+2) + 1) == b [ 2 ] [ 1 ] == 8

Arytmetyka wskaźników i n t a = 258; char p_a = ( char )&a ; p_a [ 1 ] ; //1 p_a [ 0 ] ; //2

Konspekt 1 W poprzednim odcinku... 2 man

man man nazwa_strony

man man nazwa_strony man numer_sekcji nazwa_strony

man man nazwa_strony man numer_sekcji nazwa_strony man printf #printf(1) Ta strona podręcznika man opisuje polecenie printf w wersji GNU.

man man nazwa_strony man numer_sekcji nazwa_strony man printf #printf(1) Ta strona podręcznika man opisuje polecenie printf w wersji GNU. man 3 printf #printf(3) Linux Programmer s Manual

man pages 1 komendy ogólne 2 wywołania systemowe 3 funkcje biblioteki C 4 pliki specjalne 5 formaty plików 6 gry komputerowe i wygaszacze ekranu 7 różne 8 administracja systemem i daemony

Why does man print gimme gimme gimme at 00:30? We ve noticed that some of our automatic tests fail when they run at 00:30 but work fine the rest of the day. They fail with the message gimme gimme gimme in stderr, which wasn t expected. Why are we getting this output? https://unix.stackexchange.com/questions/405783

Konspekt 3 Dynamiczna alokacja pamięci malloc/calloc free realloc memcpy

malloc i n t a = 5 ; i n t p_a = &a ;

malloc #i n c l u d e <s t d l i b. h> (... ) i n t p_a = malloc ( s i z e o f ( i n t ) ) ; p_a = 5 ;

malloc i n t p_a = malloc ( s i z e o f ( i n t ) ) ; p_a = 5 ;

malloc i n t p_a = malloc ( s i z e o f ( i n t ) ) ; p_a = 5 ;

calloc i n t a [ 1 0 ] ; i n t p_a = a ; p_a = a ;

calloc i n t p_a = malloc (10 s i z e o f ( i n t ) ) ;

calloc i n t p_a = c a l l o c (10, s i z e o f ( i n t ) ) ;

calloc i n t a [ 1 0 ] ; i n t p_a = malloc (10 s i z e o f ( i n t ) ) ; i n t p_a = c a l l o c (10, s i z e o f ( i n t ) ) ;

free void memory( void ) { char napis ; napis = malloc ( 1 0 2 4 ) ; }

i n t main ( void ){ char p l i k [ 1 6 ] ; char buf [ 6 4 ] ; FILE wsk_pliku ; while ( 1 ) { p r i n t f ( "Nazwa p l i k u : " ) ; g e t s ( p l i k ) ; i f ( ( wsk_pliku=fopen ( p l i k, " r " ) )!= NULL) { while ( f g e t s ( buf, 6 4, wsk_pliku ) ) { p r i n t f ( "%s ", buf ) ; } } } free #i n c l u d e <s t d i o. h> #i n c l u d e <s t d l i b. h>

free 1 #i n c l u d e <s t d i o. h> 2 #i n c l u d e <s t d l i b. h> 3 #i n c l u d e <s t r i n g. h> 4 5 void main ( void ){ 6 char buf=null; char p l i k [ 1 6 ] ; 7 long l e n =0; FILE wsk_pliku=null; 8 while ( 1 ) { 9 p r i n t f ( "Nazwa p l i k u : " ) ; f g e t s ( p l i k, 1 6, s t d i n ) ; 10 p l i k [ s t r l e n ( p l i k ) 1]=0; 11 i f ( ( wsk_pliku=fopen ( p l i k, " r " ) )!= NULL) { 12 while ( g e t l i n e (&buf,& len, wsk_pliku )!= 1) { 13 p r i n t f ( "%s ", buf ) ; 14 } 15 f c l o s e ( wsk_pliku ) ; 16 } 17 }

realloc void *realloc(void *ptr, size_t size); ptr==null > malloc size==0 > free move

memcpy char a [ ] = " H e l l o world! " ; a = "Goodbye world! " ; // e r r o r : assignment to e x p r e s s i o n with array type

memcpy char a = malloc ( 3 2 ) ; p r i n t f ( "%p\n", a ) ; a = " Test1 " ; p r i n t f ( "%p\n", a ) ; a = " Test2 " ; p r i n t f ( "%p\n", a ) ; a = " Test1 " ; p r i n t f ( "%p\n", a ) ; / 0 x557ce5ab6260 0 x557ce540a808 0 x557ce540a80e 0 x557ce540a808 /

memcpy 1 #i n c l u d e <s t d i o. h> 2 #i n c l u d e <s t d l i b. h> 3 #i n c l u d e <s t r i n g. h> 4 i n t main ( void ){ 5 char a = " Hello world! " ; 6 p r i n t f ( "%p\n", a ) ; 7 strncpy ( a, "Goodbye! ", 1 3 ) ; 8 p r i n t f ( "%p %s \n", a, a ) ; 9 return 0 ; 10 } 11 / 0 x55cc60220814 12 segmentation f a u l t ( core dumped) /

memcpy 1 #i n c l u d e <s t d i o. h> 2 #i n c l u d e <s t d l i b. h> 3 #i n c l u d e <s t r i n g. h> 4 i n t main ( void ){ 5 char a = malloc ( 1 3 ) ; 6 strncpy ( a, " H e l l o world! ", 1 3 ) ; 7 p r i n t f ( "%p %s \n", a, a ) ; 8 strncpy ( a, "Goodbye! ", 1 3 ) ; 9 p r i n t f ( "%p %s \n", a, a ) ; 10 return 0 ; 11 } 12 / 13 0 x55d22b4b8260 Hello world! 14 0 x55d22b4b8260 Goodbye! 15 /

memcpy 1 #i n c l u d e <s t d i o. h> 2 3 char t e s t ( void ) { 4 char a [ ] = " t e s t 1 " ; 5 return a ; 6 } 7 void main ( void ) { 8 char a = t e s t ( ) ; 9 p r i n t f ( "%s \n", a ) ; 10 11 } 12 13 warning : f u n c t i o n r e t u r n s address o f l o c a l v a r i a b l e 14 segmentation f a u l t ( core dumped)

Funkcje zakazane gets() strcpy() strcat() *sprintf("%s")

Bibliografia http://lmgtfy.com/?q=man+fgets https://linux.die.net/man/3/realloc http://robert.wojcik.staff.iiar.pwr.wroc.pl/dydaktyka/wyklad_c/inz/ https://pl.wikibooks.org/wiki/c/błędy#obsługa_błędów_i_wyjątków

Koniec Dziękuję za uwagę!