[Playlisten] [Impressum und Datenschutzerklärung]

09C.2 Arbeit mit Zeigern, Speicherreservierung, malloc


CC-BY-NC-SA 3.0

Tempo:

Anklickbares Transkript:

alserstes will ich was mit ihnen auf Zeiger umarbeitendannbekommt er zwar hinschreiben ohne Zeiger und dann nach und nachumstrittenesZeiger werdenangenommen ich habe eine Zeichenketteso eine Zeichenketteundich möchte jetzt dass sie die umarbeitendass die in Großbuchstabenerscheint alle Kleinbuchstabensollen GroßbuchstabenwerdenUmlaute ignorieren ??alle Kleinbuchstabenzu Großbuchstaben dafür gibt auf Funktion gewonnen aber eine selberschreiben Sie das mal hin dass es im ersten Anlauf höchst wahrscheinlich noch ohne Zeigermachen das dann mehr und mehr mit Zeigern erst mal und zeigen Zweifelsfall schrammte meine Schleife so das alleKleinbuchstabenin dieser Zeichenkette zu GroßbuchstabendieGroßbuchstabensollen GroßbuchstabenwerdenPunktund zahlen was auch immer sollen auch Punkte Zahlen bleiben nur die Kleinbuchstabendie üblichen ?? Buchstaben von A bis Zdie Umlaute ignorieren Sie die üblichen Kleinbuchstaben von klein A bis klein Z soll groß A bis groß Z werdenunddas Semikolon hinter ??sooffensichtlich eine for-Schleife die Frage kam warum keine while-Schleifees geht auch Wienerwaldschleifeder Ärger ist minder while-Schleife müssen Sie dieLaufvariablevorher anlegendas nervt mich an der Waldschleifeübernimmt eine Laufvariable haben in der Schleifedann muss die vorher angelegt seinund das heißt wenn sie vorangehestist dass sie auch nach der Schleife sichtbar ist die verschmutzte mein Programm sozusagen das mag ich nicht an der Stelle an der Waldschleife deshalb lieber eine for-Schleifeweil dieses in wie hier in der for-Schleife verborgen bleibtdie Abbruchbedingungich wirklich einfach zählennebenbei die Leerzeichensind natürlich auch Zeichengibt ein Zeichencodefür das Leerzeichenauch das Leerzeichen ist ein Zeichen also Kleinbuchstabenich will jetzt hier nicht erzählen sondern auf die null am Ende achtenalso so lange wiedas aktuelle Zeichennichtdie null istentweder durchwas ist ein Kleinbuchstabe Ndieser einfachen Varianteein Kleinbuchstabe Sein Buchstabe zwischen den Clientszwischen klein A und dem klein Zalso ist der aktuelle Buchstabe größer gleich dem kleinen A die Nummer des aktuellen Buchstaben ist die größer gleich klein Aund ist sie kleiner gleichdem der Nummer soll ich sagen der Nummer des klein Zso etwas es ist ein Kleinbuchstaben?? zu hinter schreibenweil das ?? nicht ganz offensichtlich ist für den Profi schon aber freute sich so offensichtlich wenn es keine schlechte Idee das dann hinter sich zu schreiben als KommentarKleinbuchstabenanwenn es ein Kleinbuchstabe Iist möchte ich den Song Großbuchstabenmachen und der Trick waram sind teilweise gesehenich addierezu den Buchstabendie Nummer des großen Armund subtrahierendie Nummer des kleinen Arkann ein Test machen was ist wenn ich das kleine A habewenn das das klein A istich super hier das kleine Aalen habe ich null und ich addiere das große Aden habe ich das groß Aund die übrigen Buchstaben sicher netterweise auch immer im selben Abstand wird dann auf funktionierensoweit man dasdirekt hingeschrieben ohne Zeigersollteman bisschen dichter machen ?? Komma nicht mehrich fürs jetzt mal direkt aus bis zu dem Returnokay sieht so ausdies ist wieder schon Großbuchstabendies ist ein Test der Punkt ?? überlebte Leerzeichen haben überlebtdass sie zwar plausibel ausso der nächste Schrittsollte eine ganze Zeiger sein sie sehen jetzt von seiner noch nicht die Rede sollte etwas mit Zeigern sei der nächste Schritt bauen Sie das jetzt mal umso das sie nicht die LaufvariableI haben sondern dass sie ein Zeigerspeicherein Zeiger auf den Buchstaben D Anzeige auf den BuchstabenI und so weiter Sie gehen das mit einem Zeiger durch der fängt anbei dem die ?? und endetbei der null dir nicht dahinten geschrieben ist als mit Anzeiger formuliert und wenn sie das schon habenprobieren Sie eine neue Zeichenkette anzulegendie genauso lang ist wie diese hier aber wir müssen vorher nicht gelang sie istmanueller Geld eine neue Zeichenkette anzulegen und diese neue Zeichenkette zu füllen dass die alte Zeichenkette bestehen bleibtwenn das mit den Zeiger schon habenaber vorherFrançoise for-Schleife um auf Zeigergesehen das sieht dann teilweisevielleicht sogar eleganter aus schwieriger zu verstehen ?? Sitten wissen eleganter ausKomma kommt sie der Sache macht ist es dann vielleicht sogar effizienterProvinz Ismaning zu kriegen den aufzeige ?? zu schreibendas mal vor das ist schon eine Nummer heftigerich kann Sie trösten dass das Schlimmste an C versus Semester drankommtdas ist auch alles was man damit sie hateffektiv habe ich glaube ichachtzig Prozent der Sprache C gezeigt was über neunzig Prozentdie Zeiger sind das schlimmstewarendiese Schlaf jetzt mal umgestricktauf Zeiger der Gedanke ist ein Zeiger zu haben statt dieser Laufvariableein Zeiger der erstensauf das D zeigte dann auf der Si und so weiter Anzeige denn durchwandertwurde es meine Zeigervariablekeine Laufvariablemit der ganzen Zahl sondern Zeigervariablenhier sagen sie eine Variablen Si und solch ganze Zahl sein auf null gesetzt werden jetzt brauche ich ein Zeigerauf Buchstabennatürlich ein Zeiger auf ganze Zahlen ein Zeiger auf Buchstabenich nenne ihn Pund setze ihnauf den Anfang der Zeichenkette nicht auf Null sondern auf den Anfang der Zeichenkette esder Name der Zeichenketteist der gleichzeitigdie Adressevon dem ersten Zeichendas jetzt Initialisierungsbauereine Zeigervariable?? Sternchenzeigervariablenfür zwei Zeichenzeigerder aufzeige zeigt der die Presse von Zeichen speichertdeshalb auch in zwei Schritten weiter geht nicht in zwei Byteschrittenund Treiber Anfang rein was sie Anfangsadresseunserer ZeichenkettePunktso ist heute nicht mehr es von ihr das mache ich mit den Zeigerich gehe so lange weiter wie der Inhalt von meinemvon dieser Adresse ungleich null iststets zeigtauf den Sohn zu finden Buchstabenund Sternchen P ist der Soundsovielbuchstabeder Inhalt das Ding was an der Stelle stehtund das voranschreitenmit plus plus den Zeiger ein zweiter Stern so sehr das auses ist haarsträubend um sich dann gewöhnen dass diese Wochen zum ersten Mal sehen weiß ich dass das schwierig ist es eigentlich banal aber muss ich erst mal dran gewöhnen zu großen Schreibweisen auchWoche mit Sternchen wurde Kaufmannsund hinalso nun habe ich ein Zeigerder auf die einzelnen Buchstaben zeigt von vorne bis hintengeht er jeden einzelnen Buchstaben durchund hier will ich jetzt gucken ob der Buchstabe Deine Stelle stehtP ist der Zeiger auf den BuchstabenSternchen ist das was drin steht ob der Buchstabe zwischen A und Z klein geschriebenliegtund wenn der Buchstabe zwischen A und Z klein geschrieben Punktmöchte ich groß Aaddieren und klein A abziehenso sehr das jetzt mit Zeiger aussehen ob ich auch kein Unsinn erzählt habedassieht gut aus ?? subventionierthättewarumreichte klein Aabziehen großer addiert und für jeden Buchstaben des Elbeabstandes wenn sie groß Bminus klein B nehmendenselben Abstand in der Tabelle wie groß A und klein A oder groß Z und klein Z alle Buchstabenklein die groß haben immer denselben AbstandBeistrich den Abstand ja ein für alle Mal Beistrich nur für das Ainwiefern ist das besser als die Lösung mit der Zählvariablensehr gute Frageinin gewisser Weise kann es schneller sein dieser Zugriff vieristim Zweifelsfalllangsamermuss von deren Rating jeden Eintrag bestimmen was er macht ist in die Anfangsadressevon dem Gerätund addiert dann ihm mal zwei draufdas passierte hier im Hintergrundund was hier passiert ist hat die Adresse schon Musik gar nicht ausrechnen guckt nur noch nachrein theoretisch ist das hier schnellerbei dieser Funktion ist das ziemlich egal ob das schneller ist oder nichtmit Milliarden Anträgen pro Sekunde durchführen wollen dann wird es allmählich spannend solche Unterschiede zu beachten als es ist theoretisch ein Hauch schnellerich muss gestehen dass das ist nicht der übliche Grund wofür man Zeiger braucht der WM jetzt drauf hinausübliche Grund Komma Zeitablaufbraucht in C und C plus plusist die Speicherverwaltungdas hier kann man mit Zeiger machennett das man es mit Zeiger machen kann und es wird Zweifelsfallschnellerwenn es wirklich drauf an käme das ?? schnell ist hier nichtder eigentliche Grund ist ein anderer der eigentliche Grund ist das ich Speicherverwaltungbetreiben muss und dass wir die Speicherverwaltungzeige reicht und nichts andersdas ist eine auch die ideale Überleitung ?? ich nehme den hier mal wieder Weg weisenmir bisschen zu viel Zeiger wirdamhiereinemitich nehme die Zeigervariantemal wieder weg und nehme nur mal die Originalvariantewieder reinwasich nun hätte und das ist jetzt der wahre Grund weshalb mandie Zeigerreiso häufig braucht in C und C plus plus ist Speicherverwaltungich hätte gernein eine neue Zeichenkettediese Zeichenketteaber in Großbuchstabender muss jetzt eine neue Zeichenkette im Fluge anlegenPlatz reservieren für eine neue Zeichenkettekam sie mal zusammen was sie wissen über die FunktionenMemorypagedie muss jetzt vorkommen?? ich reservierte Speicher ich sage das Systemgibt mir mal soundsoviel Bytes an Speicher und ?? gibt in das System ein Zeiger auf den frischen speicherich brauchefrischen Speicher das ist das ersteich will nicht in diese selbe Zeichenkette rein schreibe ich auch eine neue Zeichenketteund wenn ich so tue als ob ich nicht wüsste was da drin steht zum Beispiel wenn es die Eingabe eines Benutzers sein und es könnte die Eingabe seiner Datei gelesen wird wenn ich nicht weiß was da drin steht weiß ich nicht wie viel Platz ich brauche für die neue Zeichenketteund die Lösungdie man klassische Zeh hat und die man in C plus plus hatistman reserviert Speicherdafür gezielte Funktion manueller Katedie sagen wir System auch gib mir doch mal zwei vierzig Bytesein Zeiger auf zweiundvierzig BytesScharsterncheneiniges war er sowasdamit sagen siezwei vierzig Bytes reservieren?? und ein Zeiger zurück auf das vorderste von den Bytes und das speichere ich mir hier in dieser variablenNamens erimmer wieder LockheedSpeicher Aluzierspeicherreservieren ?? glaube ich eher deutschenLücke ist Dichtefunktionüber Integrationdafür und die steht im Standardlippin Cloudgehört zum System spitze KlammernCityPunkt warsoich will aber ich zwei vierzig Bytes reservierenich möchte so viel Bytes reservierenwie diese Zeichenkette lang istplus einssowie vier Bytes diese Zeichenkette langes Plus einzig wenn sie das Hin für die weiteste Zeichenkette langdringt ein JahrSDR LER indie Länge dieser Zeichenkette und dafür brauchen wir nicht nur Standardwerk sondern auch noch String kamdort zu trinken Punkt Haar dabei String längst drinist ?? längst gibt Indizdie Zahl der echten Zeichen endlich mit Leerzeichen Polizei Leerzeichen aber nicht die null am Ende deshalb ihr Plus einsdamit ich Platz habe für die nulljetzt habe ich so viel Speicherplatz reserviertvom System wie diese Zeichenkette braucht oder dann auch die Zeichenkette mitGroßbuchstabenes kann passieren dass das System sacht Pech gehabt ich habe so viel Platz dann kommt hier ein Nullzeigerzurück das müssen es einig Abfragen zeigt dieser Zeiger hier auf nullnull ist in C und C plus plus ein verbotener eine verboten Adressewenn immer sie was versuchenzu schreiben oder zu lesen von der Adresse null endet das Programmanmit null würde man das würde mir das System sagen wenn es keinen Platz gefunden hatten wird es hier null zurück liefern als Adressedas ignoriere ich jetzt mal steinig böse aber wir haben noch viel Minuten das ignoriere ich jetzt mal ?? du mal so als ob das immer funktionieren würdeähmoder schaut es mit dazudas müssen Institut ist nachTestsaufnullder Zeit der Nullzeigerinnerhalb neunter der Zeigerauf die Adresse nullder fehlt nochKomma der vor TodoHauptsachein ihrem ausgelieferten Programm steht das nicht an ?? drin das muss ?? verschwunden seindamit habe ich jetzt genug Speicherplatzund jetzt würde ich sagen okay ich gehe die alte Zeichenkette durch es war dasich gucke nach ob in der alten Zeichenkette ein Kleinbuchstabenstehtes muss hier noch was anders passierenwas müssen sie es tatsächlich tunich muss es auchaus es lesen ist okay aber ich muss es in eher reinschreibenwas muss hier jetztstattfindenichzeichne ?? was im Regelfall passiert mit dem Els wenn es kein Kleinbuchstabe Swenn es ein normaler Buchstabe RGroßbuchstabe SPrinzen Satzzeichen ist etwas andersalsokein Kleinbuchstabenwenn es kein Kleinbuchstabe Smöchte ich einfach kopierenich möchte das aktuelle Zeichenaus der alten Zeichenkette nehmenund kopieren in die neueer ist ein Zeiger auf einen Buchstabenauf den ersten Buchstaben in der neuen Zeichenkettekommt das überraschende er ist ein Zeiger sie können ein Zeiger in Sieger so behandeln als ob der Name eines Geräts wärees reich dassie könnten auch schreibenSternchenR plus dieGI Schritte weiter von dem Zeiger und dann gibt mir die Speicherstelleden Inhalt dass sich mit dem Inhalt der Speicherstelle redendass wir eine Alternativeaber typischerweise wird man verschreiben er vonder Zeiger fungiertwieeinein Name eines RS IS ist der Name eines Arrays und Jesus ein Zeigerund eine Stelle sind sie gar nicht mehr den Unterschiedso schreibe ich den da rein persönliche oben natürlich auch das richtige machen sie sehen wenn es ein Kleinbuchstabe Iist was schreibe ich rein dann schreibe ich rein was vorher drin gestanden hatplus Aplus groß A minus klein AeineGeschichte fehlt jetzt nochgenau der Zeichenkette fehlt noch ?? null am Endeund jetzt ist der Punkt glaube ich an dem ich sagen würde okay wir machen doch die Waldschleifewenndie for-Schleife endet hier wenn wir da die null erreicht habenBeistrich dass die nicht mehr wenn ich das mit der while-Schleifemacheund ich nehme dass sie nach vornedann kriege ich noch mal den Wertsolange wie der aktuelle nichtsnull ist Komma welche die while-Schleifegehe dann einen Schritt weiter sosieht das dann aus die for-Schleife umformuliert in eine Warteschleifenur der Witz ist jetzt wenn ich durch die Wahlschleife durch bin ich eben gesagt das SI verschmutztman meinen Programmier sozusagenaber jetzt will ich noch den Effekt habe nicht durch while-Schleife durch bin weiß ich das ich auf der null stehe das er nämlich die Abbruchbedingungkann ich nämlich jetzt sagen okay was an der Stelle stehtjetzt darauf nullüber Skype wardas einzig hundert Prozent sicher wenn sie irgendwelcheSachen auf Webservern programmieren bitte nicht so haarsträubenddass sie funktioniertwenn kein böswilliger dazwischen Punktmal sehenob es funktioniertzwinkerndes Gesichtich setze mal einenden Cursor hinten hin und das laufenunglaublichund die Zeichenkette endet aber er muss sie auf der er muss sie auf das erloschene Wesen aha okayjetzt ist das Entwicklungssystemso dumm das es nicht weiß wie lang er ist siebter er ist ein Zeiger aber weiß nicht wie lang die Geschichte wird es ?? muss ich jetzt doch wiedermir dasmit den Speicherauszug hier angucken??wir sind bei zwo null achtzwo null achtnach sommernachtsAuge legalisiert mit Lesen netterweise sie sehen wenn man den Speicherauszughat würden typischerweise noch daneben geschrieben was es in Buchstaben ist das jetzt meine neue Zeichenkette dies ist ein TestdieLeerzeichenzwei null ESTLeerzeichenE I N LeerzeichenC E S Cupsdas Ersatz Punkt es ist doch richtig das der Satz Punkt es hätte nicht gar zwei E ist der Punkt vom Satz und dann kommt die abschließende nullnull eingeschrieben?? aber jetzt so Ausrufezeichenreserviertnämlich so viel wie die alte ZeichenketteAnzeichen hatte und eines mehr weiterhinnoch immer ?? null dann stehtsie Zeichenkettennull terminierte Zeichenkettenerrichtet Zeichenkettejetzt Platz für die Zeichenkette geschaffen?? Platz für die Zeichenkette geschaffenfür dieamwas wird jetzt eigentlich noch am Ende wenn man's ganz korrekt machen willgefällt das was man gerne mal vergisstund der Normannen das Problem das dann ganze Speicher reserviert ist man gar nicht mehr brauchtfree also wenn Sie sagen ?? MR Lok sollten Sie auch irgendwo sagen freein dieser Formdahinterstehenwenn ich den Speicher wirklich brauche bis das Programm fertig ist dann muss ich eigentlich nicht sagensofern es ist ?? bisschen grünmäßigwenn ich sie jetzt dazu schreibedas Programm hier beendet ist das es ja Return aus der Mainfunktiondas Programm da beendet es wird sowieso aufgeräumt?? deshalb ist es eigentlich da jetzt nicht nötig aber stellen sich vor jemandhätte das nicht darindas Vieh und würde jetzt hier noch über andere Sachen machenundhätte dann das Problem dass dieser Speicherplatz eben immer noch vergeben wäre deshalb will ich sicherheitshalber immer der dazu schreibenden wissen alledas an der Stelle wirklich was freigegeben werden mussdiesesFreigeben ist ein Drama in C und C plus pluswenn sie vergessenes freizugebenheißt dass das ?? weniger Speicherplatz zur Verfügung haben für andere Sachenwenn dies freigebenund danach drauf zugreifendannpassiert es im Zweifelsfallgrößerer Blödsinnaneiner Atem an sich sind bisschenabsichern kann ist das man sagt okay wir setzen jetzt diesen Zeiger auf nulldann kann ich nicht mehr drauf zugreifen wenn ich jetzt was probiere von wegen Sternchen eher ?? oder von wegen er von null dann heißt das für zehn das ist illegal ??Projekt auf diesem Embedded Controllermüsse man gucken was wirklich passiert offen große System wenn sie das dann probierenmit einem Nullzeigergibt's was auf die Finger und das Programm endet zwangsweisealso die beiden kommen paarweiseimmerbeim LockheedMR Lokund welchen Speicher nicht mehr brauche free Arbeitslose müssen vorsichtig sein dasganz üblicheProblem stellen AC Programm und C plus plus Programm in C plus plus gibt es historisches als auch Manuel okay und Freeman wird es nicht benutzenin C plus pluswürde man Schreibensscharsternchener es gleichnun Schareckige Klammernund Wasser hinten drin stehtals in C++ kriegen sie tatsächlich den Speicher schonreserviert für einen bestimmten Typsehen in C geben sie nicht den Typ an ich sage wie viele Bytes ich haben will dieser Typ hat jetzt ein weit das es ja so definiert Schar hat ein weitbei ihnen muss ich aufpassendass ich eben doppelt so viele reservieren doppelt so viele Bytes auf dieser Maschine doppelt so viele Beistrich in Trudering wird in C++sagen sie direkt welchen Typ sie haben ?? das ist dann so geschrieben wie anderean der Stellemit einem Luther vorundstatt free sagen siein C++die eckige Klammerneherwenn sie so mit eckigen Klammern reserviert haben C++ positioniert die niedrige Klammer eher sagen umseine ?? wieder freizugeben die Bedeutung ist weitgehenddieselbe?? könnte in C++auch free und Manuel okay verwendensieht etwas historisch aus passt auch zu dem Rest von C plus plus nicht dazu