1 00:00:00,000 --> 00:00:00,410 2 00:00:00,410 --> 00:00:03,130 >> DAVID J. MALAN: Så det visar sig att kopiera en sträng är inte alls lika 3 00:00:03,130 --> 00:00:05,750 enkelt som att kopiera en primitiv, som en int eller float. 4 00:00:05,750 --> 00:00:09,190 När allt under huven en sträng är en sekvens tecken. 5 00:00:09,190 --> 00:00:13,130 Så kopierar en sträng, därför måste involverar kopiera hela den sekvens av 6 00:00:13,130 --> 00:00:14,240 tecken. 7 00:00:14,240 --> 00:00:17,470 >> Låt oss vända vår uppmärksamhet tillbaka till den förra genomförande och slita ut detta 8 00:00:17,470 --> 00:00:21,470 linje, sträng t är lika med s, vilket klart inte var tillräcklig. 9 00:00:21,470 --> 00:00:24,440 Låt oss byta ut den mot en linje som ser, i stället, som den här. 10 00:00:24,440 --> 00:00:34,020 String t får malloc av stränglängd s plus 1 gånger storleken på en röding. 11 00:00:34,020 --> 00:00:36,320 >> Nu finns det citat lite går på denna rad kod. 12 00:00:36,320 --> 00:00:39,330 Först, malloc, kort för minne fördelning, och 13 00:00:39,330 --> 00:00:40,700 Funktionen gör just det. 14 00:00:40,700 --> 00:00:44,740 Givet ett heltal, återgår den till dig adressen för en bit av minnet av 15 00:00:44,740 --> 00:00:45,960 att många bytes. 16 00:00:45,960 --> 00:00:50,090 Samtidigt stränglängd s plus 1 är tänkt att visa att vi vill ha som 17 00:00:50,090 --> 00:00:54,690 många bytes som ar redan upptar, inklusive dess null terminator, den 18 00:00:54,690 --> 00:00:57,050 snedstreck 0 vid slutet av en sträng. 19 00:00:57,050 --> 00:01:00,170 >> Samtidigt tror jag inte nödvändigtvis ihåg hur stor en röding är, till och med 20 00:01:00,170 --> 00:01:04,340 även om de flesta system är det helt enkelt en byte, så jag ska ringa storlek röding till 21 00:01:04,340 --> 00:01:08,210 räkna ut dynamiskt hur stor särprägel är. 22 00:01:08,210 --> 00:01:12,550 När multipliceras ihop, jag får tillbaka den Totalt antal byte som jag behöver. 23 00:01:12,550 --> 00:01:14,680 >> Men vad händer om malloc inte tillbaka minnet som vi behöver? 24 00:01:14,680 --> 00:01:16,730 Jag skulle bäst kontrollera det på följande sätt. 25 00:01:16,730 --> 00:01:23,330 Om t är lika med noll, då jag först gå till fria s, minnet återvände från get 26 00:01:23,330 --> 00:01:27,120 sträng, och sedan ska jag tillbaka 1, för att beteckna fel. 27 00:01:27,120 --> 00:01:30,360 >> Men om allt är bra, jag kommer att fortsätta att använda en fyra slinga och iterera 28 00:01:30,360 --> 00:01:31,110 enligt följande. 29 00:01:31,110 --> 00:01:36,000 För int jag får 0, n jämlikar stränglängd s. 30 00:01:36,000 --> 00:01:40,350 Jag ska göra det så länge som jag är mindre än eller lika med n så att jag 31 00:01:40,350 --> 00:01:44,460 iterera upp genom och med null avslutande tecken i talet. 32 00:01:44,460 --> 00:01:47,450 >> Och på varje iteration, jag är kommer att öka i.. 33 00:01:47,450 --> 00:01:52,496 Samtidigt, inne i denna slinga, kopiera s s i: te tecknet i t s i: te 34 00:01:52,496 --> 00:01:59,310 plats, räcker det att göra t Bracket I får s Bracket I. 41 00:01:59,320 --> 00:02:02,750 >> Låt oss nu spara, kompilera, och kör detta nya program. 42 00:02:02,750 --> 00:02:06,690 Gör kopia 1 dot snedstreck exemplar 1. 43 00:02:06,690 --> 00:02:09,460 Och jag ska säga något som hej i gemener. 44 00:02:09,460 --> 00:02:12,280 Och tack och lov, denna gång min originalet är oförändrad. 45 00:02:12,280 --> 00:02:13,660 hej i gemener. 46 00:02:13,660 --> 00:02:15,540 Men kopian är faktiskt aktiveras. 47 00:02:37,120 --> 00:02:38,963