1 00:00:00,000 --> 00:00:00,410 2 00:00:00,410 --> 00:00:03,130 >> DAVID J. Malan: Dus het blijkt dat het kopiëren van een string is lang niet zo 3 00:00:03,130 --> 00:00:05,750 eenvoudig als het kopiëren van een primitieve, zoals een int of float. 4 00:00:05,750 --> 00:00:09,190 Immers, onder de motorkap een string is een reeks tekens. 5 00:00:09,190 --> 00:00:13,130 Zo kopieert een string derhalve moet gaan om het overschrijven dat hele reeks van 6 00:00:13,130 --> 00:00:14,240 karakters. 7 00:00:14,240 --> 00:00:17,470 >> Laten we onze aandacht weer op dat laatste implementatie en rip uit dit 8 00:00:17,470 --> 00:00:21,470 lijn, koord t gelijk s, die was duidelijk niet voldoende. 9 00:00:21,470 --> 00:00:24,440 Laten we vervangen door een lijn die ziet er, in plaats daarvan, zoals deze. 10 00:00:24,440 --> 00:00:34,020 String t krijgt malloc van de string lengte van s plus 1 keer de grootte van een char. 11 00:00:34,020 --> 00:00:36,320 >> Nu is er citaat een beetje gaan in deze regel code. 12 00:00:36,320 --> 00:00:39,330 Ten eerste, malloc, kort voor het geheugen toewijzing, en de 13 00:00:39,330 --> 00:00:40,700 functie doet precies dat. 14 00:00:40,700 --> 00:00:44,740 Gegeven een integer, keert het terug naar de adres van een stuk van het geheugen van 15 00:00:44,740 --> 00:00:45,960 dat veel bytes. 16 00:00:45,960 --> 00:00:50,090 Ondertussen, de lengte van de string van s plus 1 is bedoeld om aan te geven dat we willen als 17 00:00:50,090 --> 00:00:54,690 bytes als s al bezet, inclusief de null-terminator, de 18 00:00:54,690 --> 00:00:57,050 backslash 0 aan het einde van een koord. 19 00:00:57,050 --> 00:01:00,170 >> Ondertussen weet ik niet per se herinneren hoe groot een char is, zelfs 20 00:01:00,170 --> 00:01:04,340 hoewel op de meeste systemen is het gewoon 1 byte, dus ik zal de grootte van char bellen om 21 00:01:04,340 --> 00:01:08,210 erachter te komen hoe groot dynamisch een individueel karakter. 22 00:01:08,210 --> 00:01:12,550 Eenmaal bij elkaar vermenigvuldigd, krijg ik weer de totale aantal bytes dat ik nodig heb. 23 00:01:12,550 --> 00:01:14,680 >> Maar wat als malloc nalaat het geheugen moeten we terugkeren? 24 00:01:14,680 --> 00:01:16,730 Ik zou best vraagt ​​dat als volgt. 25 00:01:16,730 --> 00:01:23,330 Als t gelijk is aan nul, dan ga ik eerst naar om gratis s, het geheugen teruggegeven door get 26 00:01:23,330 --> 00:01:27,120 snaar, en dan ga ik naar return 1, om fout betekenen. 27 00:01:27,120 --> 00:01:30,360 >> Maar als het goed is, ga ik verder een vier lus gebruiken en herhalen 28 00:01:30,360 --> 00:01:31,110 als volgt. 29 00:01:31,110 --> 00:01:36,000 Voor int krijg ik 0, n gelijken de string lengte van s. 30 00:01:36,000 --> 00:01:40,350 Ik ga dit doen zolang ik is minder dan of gelijk aan n, zodat ik 31 00:01:40,350 --> 00:01:44,460 herhalen omhoog door en met de null afsluitende karakter in s. 32 00:01:44,460 --> 00:01:47,450 >> En op elke iteratie, ik ben naar i verhogen. 33 00:01:47,450 --> 00:01:52,496 Ondertussen, de binnenkant van deze lus, kopiëren s i-ste karakter in t i-th 34 00:01:52,496 --> 00:01:59,310 locatie, volstaat het om t te doen beugel i krijgt s beugel i. 41 00:01:59,320 --> 00:02:02,750 >> Laten we nu nog redden, compileren, en run dit nieuwe programma. 42 00:02:02,750 --> 00:02:06,690 Maak kopie 1 dot slash kopie 1. 43 00:02:06,690 --> 00:02:09,460 En ik zal iets zeggen als hello in alle kleine letters. 44 00:02:09,460 --> 00:02:12,280 En gelukkig, deze keer mijn origineel blijft ongewijzigd. 45 00:02:12,280 --> 00:02:13,660 hello in alle kleine letters. 46 00:02:13,660 --> 00:02:15,540 Maar de kopie is, inderdaad, gekapitaliseerd. 47 00:02:37,120 --> 00:02:38,963