Dynamischer Speicher

Ähnliche Dokumente
Zeiger. C-Kurs 2012, 2. Vorlesung. Tino Kutschbach 10.

Übungspaket 29 Dynamische Speicherverwaltung: malloc() und free()

Vorlesung Programmieren

C/C++-Programmierung

Dynamische Speicherverwaltung

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

Dynamisches Speichermanagement

9 Zeiger (Pointer). Dynamischer Speicher

10 Die Programmiersprache C99: Zusammenfassung

Speicherverwaltung in C

einlesen n > 0? Ausgabe Negative Zahl

Einführung in die Programmierung zusammengesetzte Datentypen, dynamischer Speicher

F Zeiger, Felder und Strukturen in C

Programmieren in C. Speicher anfordern, Unions und Bitfelder. Prof. Dr. Nikolaus Wulff

Arrays (Felder/Vektoren)

Die Programmiersprache C99: Zusammenfassung

Zeiger in C und C++ Zeiger in Java und C/C++

Grundlagen der OO- Programmierung in C#

Advanced Programming in C

C- Kurs 08 Zeiger. Dipl.- Inf. Jörn Hoffmann leipzig.de. Universität Leipzig Ins?tut für Informa?k Technische Informa?

C++ Teil 5. Sven Groß. 8. Mai IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 8. Mai / 16

PROGRAMMIEREN MIT C. }, wird kompiliert mit dem Befehl. (-o steht für output) und ausgeführt mit dem Befehl

Grundlagen der Informatik 11. Zeiger

Hydroinformatik I: Referenzen und Zeiger

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Crashkurs C++ - Teil 1

8. Referenzen und Zeiger

Dynamische Speicherverwaltung

Algorithmen und Datenstrukturen

Zugriff auf die Modul-EEPROMs

Deklarationen in C. Prof. Dr. Margarita Esponda

6 Speicherorganisation

Programmierung mit C Zeiger

Zeiger, Arrays und Strings in C und C++

INE1 Speicherverwaltung und zweidimensionale Arrays. Speicherorganisation Dynamischer Speicher in C Zweidimensionale Arrays

Übungen zu Systemprogrammierung 1 (SP1)

Praxis der Programmierung

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Programmierkurs C++ Datenstrukturen Seite 1

U4-1 Aufgabe 3: einfache malloc-implementierung

Repetitorium Informatik (Java)

Programmieren in C. Rekursive Strukturen. Prof. Dr. Nikolaus Wulff

Einführung in die Programmiersprache C

Einführung in die Programmiersprache C

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

Zeichenketten (Strings) in C

Arrays. Einleitung. Deklarieren einer Array Variablen

Die Sprache C# Datentypen, Speicherverwaltung Grundelemente der Sprache. Dr. Beatrice Amrhein

Funktionen, Zeiger und Arrays in C Software Entwicklung 1

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

Praxisorientierte Einführung in C++ Lektion: "Dynamische Speicherverwaltung"

Grundlagen der Programmierung in C++ Arrays und Strings, Teil 1

DAP2-Programmierpraktikum Einführung in C++ (Teil 2)

RO-Tutorien 3 / 6 / 12

Variablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes

Dr. Monika Meiler. Inhalt

Pointer. Variablen. Pointer. Ein elementares Beispiel. Pointer in C

Ein- und Ausgabe. C - Kurs Mario Bodemann. 15. September 2010

C++ - Einführung in die Programmiersprache Funktionen. Leibniz Universität IT Services Anja Aue

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Übersicht. Speichertypen. Speicherverwaltung und -nutzung. Programmieren in C

Betriebssysteme. Tafelübung 4. Speicherverwaltung. Olaf Spinczyk.

Betriebssysteme. Agenda. Tafelübung 4. Speicherverwaltung. Olaf Spinczyk.

Programmierkurs C++ Variablen und Datentypen

2. Programmierung in C

Kapitel 6: Dynamische Speicherverwaltung

Speicherklassen (1) Lokale Variablen

Datentypen: Enum, Array, Struct, Union

C++ - Objektorientierte Programmierung Vererbung

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

GI Vektoren

Klassen als Datenstrukturen

Tag 4 Repetitorium Informatik (Java)

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Felder. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Teil 5: Zeiger, Felder, Zeichenketten Gliederung

Welche Informatik-Kenntnisse bringen Sie mit?

Einstieg in die Informatik mit Java

Grundlagen und Konzepte von C Datenstrukturen

Transkript:

Dynamischer Speicher C-Kurs 2012, 3. Vorlesung Tino Kutschbach tino.kutschbach@campus.tu-berlin.de http://wiki.freitagsrunde.org 13. September 2012 This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 License. 1 / 16

Inhaltsverzeichnis 1 Zeichenketten 2 Speicherreservierung 3 Modularisierung 4 Pfeiloperator 2 / 16

Inhaltsverzeichnis 1 Zeichenketten 2 Speicherreservierung 3 Modularisierung 4 Pfeiloperator 3 / 16

Char-Arrays C bietet keinen eigenen Datentyp für Zeichenketten/Strings an Strings sind Arrays von einzellnen char-zeichen Deklaration einer Zeichenkette: char string [10]; (1) Besonderheit: Das Ende eines Strings wird durch das Nullzeichen (\0) markiert Da das Nullzeichen immer mitgespeichert werden muss, kann der in (1) deklarierte String höchstens 9 Zeichen aufnehmen 4 / 16

Initialisierung von Strings Listing 1: src/init.c 1 // Den Zeichen l a s s e n s i c h n a c h e i n a n d e r e i n z e l n e Werte z u r o r d n e n 2 char s t r i n g [ 1 0 ] = { Z, e, i, c, h, e, n, k, e, t, t, e, \0 } ; 3 4 // Es i s t j e d o c h bequemer e i n e n l i t e r a l e n S t r i n g zu verwenden 5 char s t r i n g [ 1 0 ] = Z e i c h e n k e t t e ; 6 7 // H i e r wird a u t o m a t i s c h e i n Array mit der r i c h t i g e n G r o e s s e e r z e u g t 8 char s t r i n g [ ] = Z e i c h e n k e t t e ; 5 / 16

Stringspeicher zur Kompilierzeit festlegen Ist die nötige Größe für ein String im Vorfeld bekannt, so kann man die Arrays in gewohnter Weise deklarieren/definieren: char botschaft [20] erzeugt einen String mit fester Anzahl an Elementen char botschaft = Veni, vidi, vici erzeugt einen String mit fester Anzahl an Elementen und initialisiert diesen In Situationen wo vorher unbekannt ist wie lang ein String sein muss, weil er beispielsweise von einer Nutzereingabe abhängig ist, ist diese Vorgehensweise ungeeignet C bietet Möglichkeiten zur Reservierung von Speicher zur Laufzeit des Programms 6 / 16

Inhaltsverzeichnis 1 Zeichenketten 2 Speicherreservierung 3 Modularisierung 4 Pfeiloperator 7 / 16

Stack und Heap Stack Lokale Variablen von Funktionen und Übergabeparameter werden auf dem Stack abgespeichert Vorteil des Stack ist, dass er vom Programm selbst verwaltet wird und durch die einfache Struktur keinerlei zusätzlicher Verwaltungsaufwand nötig ist Datenfelder, die auf dem Stack angelegt werden, sind, sobald sie einmal reserviert sind, fest Der Zugriff auf Daten im Stack muss auf einen zulässigen Stackframe erfolgen Heap Der Heap ist eine Ergänzung zum Stack um einen dynamischen Speicher zur Verfügung zu haben Der Heap ist ein Speicherbereich aus dem zur Laufzeit zusammenhängende Speicherabschnitte angefordert und in beliebiger Reihenfolge wieder freigegeben werden können Für den Heap ist eine Instanz für die Verwaltung von Speicheranfragen und Speicherfreigaben notwendig Diese Verwaltungsinstanz ist Teil des Betriebssystems 8 / 16

C-Funktionen zur Speicherreservierung C stellt vier Funktionen für die Speicherreservierung auf dem Heap bereit: void malloc( size t groesse) reserviert einen Speicherblock, der die in groesse angegebene Anzahl von Bytes umfasst bei Erfolg wird ein Zeiger auf den Speicherblock zurückgegeben, andernfalls NULL der Speicher wird nicht initialisiert void calloc ( size t num, size t size ) reserviert ebenfalls Speicher num ist die Anzahl der gewünschten Elemente und size die Größe eines Elements der komplette reservierte Speicherbereich wird mit Nullen initialisiert Für alle ist das einbinden der stdlib.h notwendig 9 / 16

C-Funktionen zur Speicherreservierung void realloc (void ptr, size t size ) ändert die Größe eines Speicherblocks, der vorher mit malloc oder calloc reserviert wurde muss wegen Platzmangel ein neuer Speicherblock angelegt werden, so wird der Inhalt des alten Speicherblocks in den neuen kopiert und die Adresse zu dem neuen Block zurückgegeben der Speicher wird nicht initialisiert void free (void ptr) gibt Speicherbereiche frei, die zuvor mit malloc, calloc oder realloc reserviert wurden Für alle ist das einbinden der stdlib.h notwendig 10 / 16

Beispiel: Dynamische Stringspeicher-Reservierung 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 char s t r i n g ; 4 5 i n t main ( v o i d ) { Listing 2: src/stringmalloc.c 6 s t r i n g = m a l l o c (27) ; // S p e i c h e r f u e r 26 Zeichen 7 i f ( s t r i n g == NULL ) { 8 puts ( F e h l e r b e i der S p e i c h e r z u w e i s u n g. ) ; 9 r e t u r n 1 ; 0 } 1 f o r ( i n t i = 0 ; i < 2 6 ; i ++) // S t r i n g b e s c h r e i b e n 2 ( s t r i n g+i ) = 65+ i ; 3 4 ( s t r i n g +26) = \0 ; // S t r i n g e n d e Zeichen 5 puts ( s t r i n g ) ; // Ausgabe 6 r e t u r n 0 ; 7 } 11 / 16

Inhaltsverzeichnis 1 Zeichenketten 2 Speicherreservierung 3 Modularisierung 4 Pfeiloperator 12 / 16

Modularisierung Die Lösung großer Probleme ist oft mit einer hohen Komplexität verbunden Um die Komplexität in den Griff zu bekommen ist eine Aufspaltung des Problems in mehrere Teilprobleme nötig Jedes Teilproblem wird dann von einem eigenen Modul bearbeitet Hiding-Prinzip: Die Funktionalität eines Moduls wird durch seine Schnittstelle spezifiziert (bei C: *.h-datei) Programme, welche das Modul nutzen können die in der Schnittstelle definierten Funktionen und Datentypen verwenden Wie jedoch eine Funktionalität im Detail implementiert ist geht aus der Schnittstelle nicht hervor und bleibt verborgen 13 / 16

Inhaltsverzeichnis 1 Zeichenketten 2 Speicherreservierung 3 Modularisierung 4 Pfeiloperator 14 / 16

Pfeiloperator Verfügt man über einen Zeiger, der auf eine Struct-Variable zeigt, so kann man mit dem Pfeiloperator >, direkt von dem Zeiger aus, auf die Unterelemente des Structs zugreifen Der Ausdruck p >whatever ist dabei äquivalent zu ( p). whatever 15 / 16

Pfeiloperator - Beispiel 1 s t r u c t type { 2 i n t a l p h a ; 3 double beta ; 4 } ; 5 6 i n t main ( ) 7 { 8 s t r u c t type y ; 9 s t r u c t type p ; 0 1 p = &y ; 2 y. a l p h a = 3 3 ; Listing 3: src/arrow.c 3 p >beta = 2. 2 5 ; // das g l e i c h e wie y. beta = 2.25 4 5 r e t u r n 0 ; 6 } 16 / 16