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

Podobne dokumenty
Uzupełnienie dot. przekazywania argumentów

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

Czy procesor musi się grzać?

Pobieranie argumentów wiersza polecenia

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

Programowanie Proceduralne

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.

nowe operatory &. (kropka) * operator rzutowy ->, (przecinek) sizeof

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

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

Wskaźniki. Informatyka

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

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

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

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.

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Język ANSI C tablice wielowymiarowe

Wskaźniki. Programowanie Proceduralne 1

Struktury czyli rekordy w C/C++

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

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.

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

Wstęp do programowania 1

Podstawy programowania komputerów

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

Opisy funkcji /html_node/libc_528.html

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

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

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

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

SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)

Dariusz Chaberski. UMK Toruń

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

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

Wstęp do programowania 1

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

Wskaźniki. Pamięć dynamiczna

Bardzo szybkie podsumowanie: wykład 3

Ghost in the machine

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:

Struktury. Przykład W8_1

Podstawy programowania w języku C++

Podstawy programowania w języku C++

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

Wskaźniki w C. Anna Gogolińska

3. Identyfikacja. SKŁADNIA #include <sys/socket.h> int getpeername(int socket, struct sockaddr *addr, int *addrlen);

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

Wstęp do Programowania, laboratorium 02

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

Gniazda BSD. komunikacja bezpołączeniowa

Stałe, tablice dynamiczne i wielowymiarowe

Krótkie wprowadzenie do korzystania z OpenSSL

Wstęp do programowania

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

Sieciowa komunikacja procesów - XDR i RPC

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

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

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.

Podstawy Programowania. Tablice i wskaźniki cd., argumenty wywołania programu, reguły stylu programowania, asercje

Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.

Tablice deklaracja, reprezentacja wewnętrzna

Argumenty wywołania programu, operacje na plikach

Tablice, funkcje - wprowadzenie

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Języki i metody programowania I

Alokacja pamięci dla tablicy dwuwymiarowej

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Tablice wielowymiarowe. Przykład tablica 2-wymiarowa. Przykład. Przykład 3-wymiarowy. Tak naprawdę nie istnieją w C! Rozważmy tablicę o rozmiarze 3x2

Sygnały. 7. Sygnały (2005/2006)

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

Procesy. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 9 października 2011

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

WYKŁAD 4, 5 i 6. Wprowadzenie do języka C Mój pierwszy, drugi,..., n-ty program w języku C. Programy: c1_1.c... c1_9.c.

x szereg(x)

Wstęp do wskaźników i dynamicznej alokacji pamięci w językach ANSI C i C++

Wstęp. #define include include include include include include

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

Wyklad 7 Funkcje (c.d.). Tablice jednowymiarowe znaków

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

Wskaźniki. Pamięć dynamiczna

Programowanie w języku C++

1. Utwórz blok pamięci współdzielonej korzystając z poniższego kodu:

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

ISO/ANSI C klasy pamięci ISO/ANSI C. ISO/ANSI C klasy pamięci. ISO/ANSI C klasy pamięci. Pamięć programu. ISO/ANSI C klasy pamięci

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

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

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

Literatura uzupełniająca: W. Richard Stevens, Programowanie zastosowań sieciowych w systemie Unix WNT 1998

PODSTAW PROGRAMOWANIA WYKŁAD 6 WSKAŹNIKI

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

Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach

PODSTAW PROGRAMOWANIA WYKŁAD 7 ŁAŃCUCHY

1. Ustanawianie ograniczeń na użycie zasobów

Wykład 6_1 Abstrakcyjne typy danych stos Realizacja tablicowa i za pomocą rekurencyjnych typów danych

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

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

Transkrypt:

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

dynamiczny przydział pamięci void * memccpy (void * to, void * from, int c, int size) funkcja kopiuje nie więcej niż size bajtów z miejsca wskazywanego przez from do miejsca wskazywanego przez to, zatrzyma się jeśli napotka bajt zgodny z c; zwraca wskaźnik do miejsca docelowego jeden bajt za miejscem gdzie c zostało skopiowane; jeśli błąd, to zwraca wskaźnik NULL 2

#include <stdio.h> #include <stdlib.h> #include <string.h> dynamiczny przydział pamięci void * wsk; char a[7]={'0','1','2','3','4','5','6'}; char b[7]={'a','b','c','d','e','f','g'}; int main() { int n; printf("\n a[2]=%1c b[2]=%1c\n", a[2], b[2] ); wsk = (void *) memccpy(b, a, (int)'3', 10); 3

dynamiczny przydział pamięci for(n=0;n<=10;++n) { printf(" %c",b[n]); } printf("\n *wsk=%c\n", *((char*)wsk) ); exit(0); }/* koniec main */ 4

dynamiczny przydział pamięci a[2]=2 b[2]=c 0 1 2 3 e f g *wsk=e 5

pointerb.c Przypomnienie: 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) 6

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 */ 7

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. 8

hblks struct mallinfo www.gnu.org/software/libc/manual/html_node/statistics-of- Malloc.html 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 This field is unused. 9

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). 10

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

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

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

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 printf("\n printf("\n printf("\n"); alex.arena=%d alex.ordblks=%d alex.hblks=%d", alex.arena, alex.ordblks, alex.hblks); alex.hblkhd=%u alex.uordblks=%d", alex.hblkhd, alex.uordblks); alex.fordblks=%d alex.keepcost=%d\n", alex.fordblks, alex.keepcost); } } /* koniec funkcji main */ 14

main struct mallinfo, mallinfo() przykład użycia alex.arena=0 alex.ordblks=1 alex.hblks=1 alex.hblkhd=40001536 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 alex.fordblks=0 alex.keepcost=0... (aż w końcu program wypisze)..brak pamieci.. 15

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) 16

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 */ 17

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; 18

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"); 19

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"); printf(" optarg=%s=\n",optarg); break; } } /* koniec while */ } /* koniec main */ 20

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