1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:01,395 [Musikwiedergabe] 3 00:00:01,395 --> 00:00:05,590 4 00:00:05,590 --> 00:00:07,940 >> DOUG LLOYD: OK, so ein Vorschlag vor dem Start hier. 5 00:00:07,940 --> 00:00:11,660 Wenn Sie das Video auf nicht beobachtet haben Zeiger könnten Sie so zuerst tun. 6 00:00:11,660 --> 00:00:15,860 Weil dieses Video ist ein weiterer Arbeitsweise mit Zeigern. 7 00:00:15,860 --> 00:00:17,574 >> Also, es wird zu sprechen über einige Konzepte 8 00:00:17,574 --> 00:00:19,490 dass wir in der Deckung Zeiger-Video, und wir sind 9 00:00:19,490 --> 00:00:21,948 gehen jetzt über sie zu beschönigen, davon aus, dass sie bereits 10 00:00:21,948 --> 00:00:23,090 Art verstanden. 11 00:00:23,090 --> 00:00:25,440 Also das ist nur Ihre faire Warnung dass, wenn Sie das Video zu sehen, 12 00:00:25,440 --> 00:00:27,814 und Sie nicht gesehen haben die Zeiger Video, könnte es eine Art 13 00:00:27,814 --> 00:00:29,610 Fliegen über dem Kopf ein wenig. 14 00:00:29,610 --> 00:00:32,080 Und so könnte es besser sein um es in dieser Reihenfolge zu beobachten. 15 00:00:32,080 --> 00:00:34,710 >> So haben wir schon einen gesehen Weg, um mit Zeigern arbeiten, 16 00:00:34,710 --> 00:00:37,810 was erklären wir einen variabel, und dann werden wir 17 00:00:37,810 --> 00:00:42,160 erklären, eine weitere Variable, einen Zeiger variable Punkte, die zu ihm. 18 00:00:42,160 --> 00:00:44,870 Also wir erstellt haben ein Variable mit einem Namen, haben wir 19 00:00:44,870 --> 00:00:48,480 erstellt eine zweite Variable mit einem Namen, und wir zeigen, dass zweite Variable 20 00:00:48,480 --> 00:00:50,220 in diesem ersten. 21 00:00:50,220 --> 00:00:52,370 Diese Art von einen Problem ist aber, weil es 22 00:00:52,370 --> 00:00:54,650 erfordert, dass wir genau wissen, wieviel Speicher wir sind 23 00:00:54,650 --> 00:00:57,600 gehen, um den Moment brauchen unser Programm kompiliert wird. 24 00:00:57,600 --> 00:00:58,220 >> Warum ist das so? 25 00:00:58,220 --> 00:01:03,338 Denn wir müssen in der Lage zu nennen, oder Identifizierung aller möglichen Variablen 26 00:01:03,338 --> 00:01:04,129 Wir stoßen könnten. 27 00:01:04,129 --> 00:01:07,910 Wir könnten ein Array, das sein könnte haben in der Lage, eine Vielzahl von Informationen zu halten, 28 00:01:07,910 --> 00:01:10,110 aber es ist immer noch nicht genau, präzise genug. 29 00:01:10,110 --> 00:01:12,640 Was wäre, wenn wir nicht wissen, was ist, wenn wir nicht wissen, 30 00:01:12,640 --> 00:01:14,370 wie sehr wir bei der Kompilierung benötigen? 31 00:01:14,370 --> 00:01:17,020 Oder was, wenn unser Programm Lauf für eine wirklich lange Zeit, 32 00:01:17,020 --> 00:01:19,810 Annahme von verschiedenen Benutzer Daten, und wir können nicht wirklich 33 00:01:19,810 --> 00:01:23,170 abschätzen, ob wir sind gehen, um 1.000 Einheiten müssen? 34 00:01:23,170 --> 00:01:26,060 >> Es ist nicht wie wir können, sagen, in der Befehlszeile 35 00:01:26,060 --> 00:01:28,040 Geben Sie, wie viele Artikel Sie denken, Sie brauchen. 36 00:01:28,040 --> 00:01:31,100 Nun was ist, wenn die Vermutung ist falsch? 37 00:01:31,100 --> 00:01:34,300 Dynamische Speicherzuweisung Art ermöglicht uns den Weg 38 00:01:34,300 --> 00:01:36,867 um diesem Problem zu erhalten. 39 00:01:36,867 --> 00:01:38,700 Und die Art, wie sie es tut ist die Verwendung von Zeigern. 40 00:01:38,700 --> 00:01:42,140 >> Wir können Zeiger zu verwenden, erhalten Sie Zugriff auf dynamisch 41 00:01:42,140 --> 00:01:45,710 zugewiesenen Speicher, Speicher, der ist wie Ihr Programm zugewiesen läuft. 42 00:01:45,710 --> 00:01:48,290 Es ist nicht während der Kompilierung zugewiesen. 43 00:01:48,290 --> 00:01:51,570 Wenn Sie dynamisch zuzuweisen Speicher es aus einem Pool kommt 44 00:01:51,570 --> 00:01:53,795 Speicher bekannt als der Haufen. 45 00:01:53,795 --> 00:01:56,420 Zuvor der gesamte Speicher wir haben wurde mit im Laufe der Arbeit 46 00:01:56,420 --> 00:01:59,920 wurde aus einem Pool worden kommen Speicher bekannt als der Stapel. 47 00:01:59,920 --> 00:02:02,470 Eine gute Möglichkeit, in der Regel halten in mind-- und dieser Regel 48 00:02:02,470 --> 00:02:04,720 nicht immer zutreffen, aber so ziemlich fast 49 00:02:04,720 --> 00:02:09,940 gilt immer true-- ist, dass jede Mal, wenn Sie einen Variablennamen geben 50 00:02:09,940 --> 00:02:12,090 lebt wahrscheinlich auf den Stapel. 51 00:02:12,090 --> 00:02:14,650 Und immer wenn Sie dies nicht tun geben eine Variable einen Namen, 52 00:02:14,650 --> 00:02:19,160 die Sie mit dynamischen Speicher tun können Allokation, lebt es auf dem Heap. 53 00:02:19,160 --> 00:02:22,190 >> Jetzt bin ich Art präsentieren dies als wenn es diese beiden Speicherpools. 54 00:02:22,190 --> 00:02:24,740 Aber man kann dies gesehen haben Diagramm, das im Allgemeinen 55 00:02:24,740 --> 00:02:27,290 eine Darstellung von Welche Speicher aussieht, 56 00:02:27,290 --> 00:02:30,373 und wir werden nicht über all Pflege der Stoff, an der Spitze und der Unterseite. 57 00:02:30,373 --> 00:02:33,580 Was uns interessiert, ist dieser Teil in der mittlere hier, Heap und Stack. 58 00:02:33,580 --> 00:02:35,570 Wie Sie sehen können, Blick in diesem Diagramm 59 00:02:35,570 --> 00:02:38,390 diese tatsächlich nicht zwei separate Pools Speicher. 60 00:02:38,390 --> 00:02:42,757 Es ist einer gemeinsamen Pool von Speicher wo Sie beginnen, in diesem visuellen 61 00:02:42,757 --> 00:02:44,590 Sie am unteren Rand beginnen und starten Sie füllt sich 62 00:02:44,590 --> 00:02:48,040 von unten mit dem Stapel, und Sie Start an der Spitze und starten Auffüllen 63 00:02:48,040 --> 00:02:50,072 von oben nach unten mit dem Heap. 64 00:02:50,072 --> 00:02:51,780 Aber es ist wirklich die gleichen Pool, es ist einfach 65 00:02:51,780 --> 00:02:56,050 verschiedenen Spots, verschiedene Standorte in Speicher, der zugeordnet sind. 66 00:02:56,050 --> 00:02:59,060 Und Sie können aus ausführen Speicher entweder mit 67 00:02:59,060 --> 00:03:01,240 der Haufen gehen den ganzen Weg nach unten, oder 68 00:03:01,240 --> 00:03:05,440 der Stapel gehen den ganzen Weg an die Spitze, oder mit dem Heap und den Stapel 69 00:03:05,440 --> 00:03:06,740 treffen aufeinander. 70 00:03:06,740 --> 00:03:09,500 Alle diese können Bedingungen dass Ihr Programm verursachen 71 00:03:09,500 --> 00:03:11,030 um über genügend Arbeitsspeicher ausgeführt. 72 00:03:11,030 --> 00:03:11,952 So sollte man das im Hinterkopf. 73 00:03:11,952 --> 00:03:13,660 Wenn wir reden der Heap und der Stapel 74 00:03:13,660 --> 00:03:17,880 Wir sind wirklich über die Gespräche gleichen allgemeinen Teil des Speichers, nur 75 00:03:17,880 --> 00:03:21,930 verschiedene Abschnitte dieses Speichers. 76 00:03:21,930 --> 00:03:24,910 >> Wie können wir also dynamisch erhalten in erster Linie zugewiesenen Speicher? 77 00:03:24,910 --> 00:03:27,740 Wie funktioniert unser Programm zu erhalten Speicher wie es läuft? 78 00:03:27,740 --> 00:03:32,660 Nun C bietet eine Funktion namens malloc, Speicherzuweisung, die 79 00:03:32,660 --> 00:03:36,810 Sie einen Anruf an, und Sie übergeben wie viele Bytes an Speicher, die Sie wollen. 80 00:03:36,810 --> 00:03:39,940 Also, wenn Ihr Programm läuft und Sie wollen eine ganze Laufzeit 81 00:03:39,940 --> 00:03:46,040 Sie könnten vier Bytes Mallocks Speicher, malloc Klammern vier. 82 00:03:46,040 --> 00:03:48,540 >> Mallocks durchlaufen Blick durch den Haufen, 83 00:03:48,540 --> 00:03:50,750 weil wir dynamisch sind Zuweisen von Speicher, 84 00:03:50,750 --> 00:03:53,500 und es wird an Sie zurück ein Zeiger auf diesen Speicher. 85 00:03:53,500 --> 00:03:56,180 Es gibt Ihnen nicht, dass memory-- es nicht geben Sie ihm einen Namen, 86 00:03:56,180 --> 00:03:57,950 es gibt Ihnen einen Zeiger darauf. 87 00:03:57,950 --> 00:04:00,780 Und damit ist, warum wieder sagte ich dass es wichtig ist, vielleicht 88 00:04:00,780 --> 00:04:03,770 haben die Zeiger Video angesehen bevor wir zu weit zu bekommen in diese. 89 00:04:03,770 --> 00:04:05,940 So malloc ist zu gehen geben Ihnen einen Zeiger zurück. 90 00:04:05,940 --> 00:04:08,950 >> Wenn Mallocks kann man nicht geben, Speicher weil Sie erschöpft haben, 91 00:04:08,950 --> 00:04:10,645 es wird Ihnen wieder einen Null-Zeiger. 92 00:04:10,645 --> 00:04:15,282 Erinnern Sie sich an, was passiert, wenn wir versuchen und Dereferenzierung eines Null-Zeiger? 93 00:04:15,282 --> 00:04:17,019 Wir leiden, eine seg Fehler, nicht wahr? 94 00:04:17,019 --> 00:04:18,060 Das ist wahrscheinlich nicht gut. 95 00:04:18,060 --> 00:04:21,579 >> Also jedes Mal, wenn Sie einen Anruf machen um Ihnen immer malloc, immer 96 00:04:21,579 --> 00:04:25,270 müssen Sie prüfen, ob die Zeiger gab es Sie zurück ist null. 97 00:04:25,270 --> 00:04:28,800 Wenn ja, um Ihr Programm zu beenden müssen Sie weil, wenn Sie versuchen, dereferenzieren 98 00:04:28,800 --> 00:04:31,360 der Null-Zeiger Sie gehen einen Segmentierungsfehler leiden 99 00:04:31,360 --> 00:04:34,380 und Ihr Programm sowieso abstürzen. 100 00:04:34,380 --> 00:04:37,190 Wie können wir also statisch eine ganze Zahl zu erhalten? 101 00:04:37,190 --> 00:04:37,730 >> int x. 102 00:04:37,730 --> 00:04:40,010 Wir haben wahrscheinlich das getan ein paar Mal, nicht wahr? 103 00:04:40,010 --> 00:04:43,480 Es wird eine Variable namens x, die auf dem Stapel lebt. 104 00:04:43,480 --> 00:04:46,190 Wie können wir dynamisch eine ganze Zahl zu erhalten? 105 00:04:46,190 --> 00:04:50,010 Int Sterne px gleich malloc 4. 106 00:04:50,010 --> 00:04:53,050 >> Oder passender wir sagen würden int Sterne px 107 00:04:53,050 --> 00:04:57,680 gleich malloc Größe int, um nur einige wenige zu werfen 108 00:04:57,680 --> 00:04:59,740 magischen Zahlen rund um unser Programm. 109 00:04:59,740 --> 00:05:04,140 Das wird für uns zu erhalten vier Byte, aus dem Haufen, 110 00:05:04,140 --> 00:05:06,720 und der Zeiger wir bekommen zurück, um es genannt wird px. 111 00:05:06,720 --> 00:05:08,430 Und dann, so wie wir haben zuvor wir getan 112 00:05:08,430 --> 00:05:13,966 kann dereferenzieren px zu auf diesen Speicher zugreifen. 113 00:05:13,966 --> 00:05:15,590 Wie können wir eine ganze Zahl von Benutzer zu bekommen? 114 00:05:15,590 --> 00:05:17,970 Wir können sagen, int x gleich zu int. 115 00:05:17,970 --> 00:05:19,930 Das ist ziemlich einfach. 116 00:05:19,930 --> 00:05:24,030 Was, wenn wir um ein Array erstellen möchten von x Schwimmer, die auf dem Stack zu leben? 117 00:05:24,030 --> 00:05:28,210 schweben stack_array-- das ist der Name unserer array-- eckigen Klammern x. 118 00:05:28,210 --> 00:05:32,419 Das wird für uns ein Array zu erstellen X Schwimmer, der auf dem Stapel zu leben. 119 00:05:32,419 --> 00:05:34,960 Wir können eine Reihe von Schwimmern zu erstellen daß wohnt auf dem Heap, auch. 120 00:05:34,960 --> 00:05:37,330 Die Syntax aussehen könnte ein etwas umständlich, 121 00:05:37,330 --> 00:05:41,740 aber wir können sagen, float Sterne heap_array gleich 122 00:05:41,740 --> 00:05:44,360 malloc x mal die Größe des Schwimmers. 123 00:05:44,360 --> 00:05:48,160 Ich muss genug Platz, um zu halten x Fließkommazahlen. 124 00:05:48,160 --> 00:05:51,560 Also sage ich brauche 100 Schwimmer, oder 1.000 Schwimmern. 125 00:05:51,560 --> 00:05:54,810 So dass in diesem Fall wäre es 400 Bytes für 100 Wagen, 126 00:05:54,810 --> 00:05:59,080 oder 4.000 Bytes für 1.000 Wagen, weil jeder Schwimmer nimmt 127 00:05:59,080 --> 00:06:01,230 vier Bytes Speicherplatz. 128 00:06:01,230 --> 00:06:05,110 >> Nach dem Handeln dies kann ich das verwenden eckigen Klammer-Syntax auf heap_array. 129 00:06:05,110 --> 00:06:08,970 Gerade als ich auf stack_array, I können ihre Elemente einzeln zugreifen 130 00:06:08,970 --> 00:06:11,590 Verwendung heap_array Null heap_array ein. 131 00:06:11,590 --> 00:06:15,800 Aber erinnern an den Grund, warum wir das tun können ist, weil der Name eines Arrays in C 132 00:06:15,800 --> 00:06:19,990 ist wirklich ein Zeiger auf erste Element, das Arrays. 133 00:06:19,990 --> 00:06:23,480 Also die Tatsache, dass wir erklären ein Reihe von Schwimmern auf dem Stapel hier 134 00:06:23,480 --> 00:06:24,810 ist eigentlich etwas irreführend. 135 00:06:24,810 --> 00:06:27,600 Wir sind wirklich in der zweite Codezeile gibt 136 00:06:27,600 --> 00:06:32,360 schafft auch einen Zeiger auf einen Batzen Speicher, die wir dann einige Arbeit mit. 137 00:06:32,360 --> 00:06:35,620 >> Hier ist das große Problem mit dynamisch zugewiesenen Speicher aber, 138 00:06:35,620 --> 00:06:38,360 und aus diesem Grund ist es wirklich wichtig, einige gute Gewohnheiten zu entwickeln 139 00:06:38,360 --> 00:06:39,800 wenn Sie mit arbeiten daran. 140 00:06:39,800 --> 00:06:43,060 Im Gegensatz zu statisch deklariert Gedächtnis, Ihr Gedächtnis 141 00:06:43,060 --> 00:06:46,790 wird nicht automatisch an die zurück System, wenn Ihre Funktion ist getan. 142 00:06:46,790 --> 00:06:49,280 Wenn wir also Haupt und Haupt ruft eine Funktion 143 00:06:49,280 --> 00:06:53,860 f, wenn f Oberflächen, was auch immer er tut und gibt die Steuerung des Programms 144 00:06:53,860 --> 00:06:58,810 zurück zur Hauptansicht, der gesamte Speicher dass f verwendet wird zurück gegeben. 145 00:06:58,810 --> 00:07:01,250 Es kann wieder verwendet werden von einem anderen Programm, 146 00:07:01,250 --> 00:07:04,250 oder eine andere Funktion, wird später im Haupt genannt. 147 00:07:04,250 --> 00:07:06,970 Es kann das gleiche Speicher immer wieder zu verwenden. 148 00:07:06,970 --> 00:07:09,620 >> Wenn Sie dynamisch Speicher zuweisen, obwohl 149 00:07:09,620 --> 00:07:14,380 Sie müssen also explizit sagen, die System, dass Sie damit fertig sind. 150 00:07:14,380 --> 00:07:18,370 Es wird auf die für Sie zu halten, der konnte führen zu einem Problem von euch laufen 151 00:07:18,370 --> 00:07:19,290 des Speichers. 152 00:07:19,290 --> 00:07:22,179 Und in der Tat haben wir manchmal beziehen dies als ein Speicherleck. 153 00:07:22,179 --> 00:07:24,970 Und manchmal sind diese Speicherlecks kann eigentlich wirklich verheerend sein 154 00:07:24,970 --> 00:07:27,020 für die Systemleistung. 155 00:07:27,020 --> 00:07:31,120 >> Wenn Sie häufig Internet-Benutzer sind Sie können bestimmte Web-Browser verwenden, 156 00:07:31,120 --> 00:07:35,630 und ich werde Namen hier nicht nennen, aber gibt es einige Web-Browser da draußen 157 00:07:35,630 --> 00:07:39,150 , die berüchtigt für tatsächlich mit sich Speicherlecks, die nicht festgelegt zu tun bekommen. 158 00:07:39,150 --> 00:07:44,570 Und wenn Sie Ihren Browser offen lassen für eine sehr lange Zeitdauer, Tage 159 00:07:44,570 --> 00:07:48,060 und Tage oder Wochen, Sie manchmal vielleicht, dass Ihr System feststellen, 160 00:07:48,060 --> 00:07:49,790 ist wirklich läuft, wirklich langsam. 161 00:07:49,790 --> 00:07:54,640 Und der Grund dafür ist, dass der Browser Speicher zugewiesen, 162 00:07:54,640 --> 00:07:57,320 aber dann das System nicht gesagt, dass es damit fertig. 163 00:07:57,320 --> 00:08:01,000 Und so, dass weniger Speicher verlässt für alle anderen Programme zur Verfügung 164 00:08:01,000 --> 00:08:04,480 zu haben, um zu teilen, weil Sie leaking-- dass Web-Browser 165 00:08:04,480 --> 00:08:06,755 Programm ist undicht Speicher. 166 00:08:06,755 --> 00:08:08,880 Wie kommen wir zu geben Speicher zurück wenn wir mit ihr geschehen? 167 00:08:08,880 --> 00:08:10,838 Nun zum Glück ist es ein sehr einfache Möglichkeit, es zu tun. 168 00:08:10,838 --> 00:08:11,710 Wir befreien es einfach. 169 00:08:11,710 --> 00:08:15,020 Es gibt eine Funktion frei genannt, es nimmt einen Zeiger auf eine Speicher, 170 00:08:15,020 --> 00:08:16,010 und wir sind gut zu gehen. 171 00:08:16,010 --> 00:08:18,310 >> Also lassen Sie uns sagen, dass wir in der du mitten in unserem Programm, 172 00:08:18,310 --> 00:08:21,970 wir wollen zu 50 Zeichen malloc. 173 00:08:21,970 --> 00:08:25,710 Wir wollen, um ein Array, das kann malloc der Lage ist, 50 Zeichen. 174 00:08:25,710 --> 00:08:29,109 Und wenn wir einen Zeiger zurück zu dass dieser Zeiger ist der Name das Wort. 175 00:08:29,109 --> 00:08:30,900 Wir tun, was wir sind gehen, um mit Wort zu tun, 176 00:08:30,900 --> 00:08:33,440 und dann, wenn wir getan wir frei es einfach. 177 00:08:33,440 --> 00:08:37,460 Und jetzt haben wir jene 50 zurück Byte des Speichers an das System zurück. 178 00:08:37,460 --> 00:08:40,147 Einige andere Funktion können sie benutzen. 179 00:08:40,147 --> 00:08:43,480 Wir müssen nicht über das Leiden ein Sorgen Speicherleck, weil wir das Wort befreit. 180 00:08:43,480 --> 00:08:46,639 Wir haben die Erinnerung zurück gegeben, so dass wir fertig sind mit ihm arbeiten. 181 00:08:46,639 --> 00:08:48,430 So gibt es drei goldenen Regeln Das sollte 182 00:08:48,430 --> 00:08:51,700 im Auge behalten, wenn Sie werden, die dynamische Zuweisung von Speicher 183 00:08:51,700 --> 00:08:52,990 mit malloc. 184 00:08:52,990 --> 00:08:56,480 Jeder Speicherblock, Sie müssen malloc befreit werden 185 00:08:56,480 --> 00:08:58,430 bevor Ihr Programm Ausführung beendet. 186 00:08:58,430 --> 00:09:02,029 Jetzt wieder in das Gerät oder in die IDE diese Art der Fall für Sie auf jeden Fall 187 00:09:02,029 --> 00:09:04,820 wenn Sie-- dies trotzdem geschehen, wenn Ihr Programm beendet wird, 188 00:09:04,820 --> 00:09:06,880 der gesamte Speicher wird freigegeben. 189 00:09:06,880 --> 00:09:10,750 Aber es ist in der Regel eine gute Codierung Praxis, immer, wenn Sie fertig sind, 190 00:09:10,750 --> 00:09:13,810 zu befreien, was Sie mallocd haben. 191 00:09:13,810 --> 00:09:16,690 >> Das heißt, nur Dinge, die Sie haben mallocd sollte befreit werden. 192 00:09:16,690 --> 00:09:19,880 Wenn Sie statisch deklarieren integer, int x Semikolon 193 00:09:19,880 --> 00:09:23,500 daß wohnt auf dem Stapel, die Sie dann nicht wollen x befreien. 194 00:09:23,500 --> 00:09:25,970 So einzigen Dinge, die Sie haben, mallocd sollte befreit werden. 195 00:09:25,970 --> 00:09:28,960 >> Und schließlich, nicht frei etwas zweimal. 196 00:09:28,960 --> 00:09:31,170 Das kann dazu führen, eine weitere seltsame Situation. 197 00:09:31,170 --> 00:09:33,530 Also alles, was Sie haben, mallocd muss befreit werden. 198 00:09:33,530 --> 00:09:36,000 Nur Dinge, die Sie haben, malloc sollte befreit werden. 199 00:09:36,000 --> 00:09:38,730 Und nicht frei etwas zweimal. 200 00:09:38,730 --> 00:09:43,660 >> Also lassen Sie uns durch ein Beispiel gehen Sie hier von dem, was einige dynamisch zugewiesen 201 00:09:43,660 --> 00:09:46,122 Speicher könnte wie gemischte aussehen in mit einigen statischen Speicher. 202 00:09:46,122 --> 00:09:47,080 Was könnte hier geschehen? 203 00:09:47,080 --> 00:09:48,913 Sehen Sie, wenn Sie folgen können, entlang und erraten, was ist 204 00:09:48,913 --> 00:09:51,720 passieren, wie wir gehen durch alle diese Zeilen Code. 205 00:09:51,720 --> 00:09:53,980 >> Also sagen wir int m. 206 00:09:53,980 --> 00:09:54,840 Was passiert hier? 207 00:09:54,840 --> 00:09:56,339 Gut, das ist ziemlich einfach. 208 00:09:56,339 --> 00:09:59,650 Ich erstelle eine Integer-Variable namens m. 209 00:09:59,650 --> 00:10:01,400 I Farbe es Grün, denn das ist die Farbe 210 00:10:01,400 --> 00:10:03,730 dass ich, wenn ich rede zu Integer-Variablen. 211 00:10:03,730 --> 00:10:05,160 Es ist eine Box. 212 00:10:05,160 --> 00:10:08,400 Es heißt m, und Sie können Shop Zahlen darin. 213 00:10:08,400 --> 00:10:12,400 >> Was, wenn ich dann sage int a star? 214 00:10:12,400 --> 00:10:13,530 Nun, das ist ziemlich ähnlich. 215 00:10:13,530 --> 00:10:15,780 Ich erstelle eine Box genannt. 216 00:10:15,780 --> 00:10:19,100 Es ist in der Lage, Halte int Sterne, Zeigern auf Integer. 217 00:10:19,100 --> 00:10:21,570 Also werde ich es Färbung grün-ish auch. 218 00:10:21,570 --> 00:10:24,140 >> Ich weiß, es hat etwas mit einer Ganzzahl machen, 219 00:10:24,140 --> 00:10:25,852 aber es ist nicht selbst eine ganze Zahl. 220 00:10:25,852 --> 00:10:27,310 Aber es ist so ziemlich das gleiche Idee. 221 00:10:27,310 --> 00:10:28,101 Ich habe eine Box erstellt. 222 00:10:28,101 --> 00:10:30,070 Beides rechts leben jetzt auf dem Stapel. 223 00:10:30,070 --> 00:10:32,520 Ich habe sie beide Namen angegeben. 224 00:10:32,520 --> 00:10:36,750 >> int star b gleich malloc Größe des int. 225 00:10:36,750 --> 00:10:38,560 Dieses könnte ein wenig schwierig sein. 226 00:10:38,560 --> 00:10:44,110 Nehmen Sie sich die Zeit und überlegen Sie, was Sie würde erwarten, dass in diesem Diagramm passieren. 227 00:10:44,110 --> 00:10:50,210 int star b gleich malloc Größe des int. 228 00:10:50,210 --> 00:10:51,940 >> Gut, das ist nicht nur eine Box zu erstellen. 229 00:10:51,940 --> 00:10:53,800 Das schafft eigentlich zwei Boxen. 230 00:10:53,800 --> 00:10:58,670 Und es bindet, sie legt auch ein Punkt in einer Beziehung. 231 00:10:58,670 --> 00:11:02,240 Wir haben nur einen Block zugeordnet Speicher auf der Halde. 232 00:11:02,240 --> 00:11:05,940 Beachten Sie, dass das Feld oben rechts es hat keinen Namen. 233 00:11:05,940 --> 00:11:06,760 >> Wir mallocd es. 234 00:11:06,760 --> 00:11:08,050 Es gibt auf dem Heap. 235 00:11:08,050 --> 00:11:10,090 Aber b hat einen Namen. 236 00:11:10,090 --> 00:11:11,950 Es ist eine Zeigervariable namens b. 237 00:11:11,950 --> 00:11:13,910 Die das Leben auf dem Stapel. 238 00:11:13,910 --> 00:11:18,250 >> So ist es ein Teil des Speichers Das deutet auf einen anderen. 239 00:11:18,250 --> 00:11:21,840 b enthält die Adresse dieser Speicherblock. 240 00:11:21,840 --> 00:11:23,757 Es macht keinen Namen anders. 241 00:11:23,757 --> 00:11:24,590 Aber darauf zeigt. 242 00:11:24,590 --> 00:11:29,760 Wenn wir also sagen int star b gleich malloc Größe int, dass genau dort, 243 00:11:29,760 --> 00:11:33,490 dass Pfeil, der oben auf dem geknallt rechten Seite gibt, dass ganze Sache, 244 00:11:33,490 --> 00:11:36,740 Ich werde es scheinen, wieder ist, was passiert. 245 00:11:36,740 --> 00:11:39,341 All das passiert in dass einzige Zeile Code. 246 00:11:39,341 --> 00:11:41,340 Jetzt werden wir etwas mehr bekommen einfach erneut. 247 00:11:41,340 --> 00:11:43,330 a gleich Et-Zeichen m. 248 00:11:43,330 --> 00:11:46,280 Wissen Sie, was ein Rückruf gleich Ampersand m? 249 00:11:46,280 --> 00:11:48,920 Nun, das ist ein bekommt m Adresse. 250 00:11:48,920 --> 00:11:54,150 Oder setzen mehr schematisch, ein Punkte auf m. 251 00:11:54,150 --> 00:11:56,360 >> a gleich b. 252 00:11:56,360 --> 00:11:57,560 OK also hier ist eine andere. 253 00:11:57,560 --> 00:11:59,230 A gleich b. 254 00:11:59,230 --> 00:12:02,260 Was wird passieren auf das Diagramm dieses Mal? 255 00:12:02,260 --> 00:12:04,330 >> Nun erinnern, dass die Zuweisungsoperator Werke 256 00:12:04,330 --> 00:12:08,960 durch Zuweisung des Wertes auf die Rechts auf dem Wert auf der linken Seite. 257 00:12:08,960 --> 00:12:14,820 Anstatt also eine Zeige zu m, a jetzt zeigt auf der gleichen Stelle, dass b Punkten. 258 00:12:14,820 --> 00:12:18,900 a zeigt nicht auf B, A Punkte, an denen b Punkten. 259 00:12:18,900 --> 00:12:25,280 >> Wenn ein spitzen zu, dass B freut waren ein kaufmännisches Und gleich b. 260 00:12:25,280 --> 00:12:28,150 Aber anstatt a gleich b gerade bedeutet, und b sind jetzt 261 00:12:28,150 --> 00:12:31,770 Hinweis an die gleiche Adresse, denn Innere b ist nur eine Adresse. 262 00:12:31,770 --> 00:12:35,004 Und nun Innenseite a die gleiche Adresse. 263 00:12:35,004 --> 00:12:37,170 m gleich 10 ist, wahrscheinlich die Die einfachste Sache, 264 00:12:37,170 --> 00:12:38,690 wir in ein wenig getan. 265 00:12:38,690 --> 00:12:40,460 Legen Sie die 10 in der Box. 266 00:12:40,460 --> 00:12:45,640 Stern b gleich m sowie 2, erinnern von unsere Zeigern Video Was star b bedeutet. 267 00:12:45,640 --> 00:12:50,230 Wir sind zu dereferenzieren b und legte los einige Wert in dieser Speicherstelle. 268 00:12:50,230 --> 00:12:51,860 In diesem Fall 12. 269 00:12:51,860 --> 00:12:55,300 >> Also, wenn wir dereferenzieren Punkt erinnern wir uns nur die Reise nach unten auf den Pfeil. 270 00:12:55,300 --> 00:12:58,205 Oder anders ausgedrückt, wir gehen Sie zu dieser Speicheradresse 271 00:12:58,205 --> 00:12:59,580 und wir manipulieren in irgendeiner Weise. 272 00:12:59,580 --> 00:13:00,830 Wir haben einen gewissen Wert in es. 273 00:13:00,830 --> 00:13:03,960 In diesem Fall Sterne-b gleich m plus 2 ist nur 274 00:13:03,960 --> 00:13:08,230 gehen Sie auf die Variable, auf die durch b, gehen Sie zu dem Speicher, auf den b, 275 00:13:08,230 --> 00:13:11,750 und legte m plus 2 drin, 12. 276 00:13:11,750 --> 00:13:14,970 >> Kostenlos I b. 277 00:13:14,970 --> 00:13:16,490 Was passiert, wenn ich frei b? 278 00:13:16,490 --> 00:13:18,800 Denken Sie daran, was ich gesagt habe freie Mittel. 279 00:13:18,800 --> 00:13:21,920 Was sage ich, wenn ich frei b? 280 00:13:21,920 --> 00:13:23,410 >> Ich bin fertig mit ihm arbeiten, nicht wahr? 281 00:13:23,410 --> 00:13:25,702 Ich gebe im wesentlichen den Speicher. 282 00:13:25,702 --> 00:13:26,910 Ich gebe es an das System zurück. 283 00:13:26,910 --> 00:13:33,010 Ich brauche das nicht mehr ist was ich ihnen zu sagen, OK? 284 00:13:33,010 --> 00:13:37,390 >> Nun, wenn ich sage, ein Sterne- gleich 11 können Sie wahrscheinlich 285 00:13:37,390 --> 00:13:40,460 jetzt schon sagen, dass etwas Schlimmes wird hier passieren, oder? 286 00:13:40,460 --> 00:13:44,160 Und in der Tat, wenn ich versuchte, dass ich wahrscheinlich würde einen Segmentation Fault zu leiden. 287 00:13:44,160 --> 00:13:47,140 Denn jetzt, wenn auch zuvor, dass Teil des Speichers 288 00:13:47,140 --> 00:13:50,220 war etwas, das ich hatte Zugang zu diesem Zeitpunkt 289 00:13:50,220 --> 00:13:54,590 jetzt bin ich den Zugriff auf Speicher, ist nicht legal für mich zu öffnen. 290 00:13:54,590 --> 00:13:57,330 >> Und so werden wir wahrscheinlich erinnern, wenn wir auf Speicher 291 00:13:57,330 --> 00:14:00,000 dass wir sollen nicht zu berühren, das ist die häufigste Ursache 292 00:14:00,000 --> 00:14:01,860 eines Segmentierungs Fehler. Und so mein Programm 293 00:14:01,860 --> 00:14:05,170 würde abstürzen, wenn ich versuchte, dies zu tun. 294 00:14:05,170 --> 00:14:09,910 Also noch einmal, es ist eine gute Idee, eine gute zu bekommen Praxis und gute Gewohnheiten verwurzelt 295 00:14:09,910 --> 00:14:12,920 bei der Arbeit mit malloc und free, so dass Sie die Segmentierung nicht leiden 296 00:14:12,920 --> 00:14:15,310 Fehler, und dass Sie verwenden Ihre dynamisch zugewiesenen 297 00:14:15,310 --> 00:14:17,370 Speicher verantwortlich. 298 00:14:17,370 --> 00:14:20,300 >> Ich bin Doug Lloyd dies CS50. 299 00:14:20,300 --> 00:14:21,947