1 00:00:00,000 --> 00:00:00,410 2 00:00:00,410 --> 00:00:03,130 >> DAVID J. Malan: Tak to dopadá, že kopírovanie reťazec nie je zďaleka tak 3 00:00:03,130 --> 00:00:05,750 jednoduché ako kopírovanie primitívne, ako int alebo float. 4 00:00:05,750 --> 00:00:09,190 Koniec koncov, pod kapotou reťazec je postupnosť znakov. 5 00:00:09,190 --> 00:00:13,130 Takže kopírovanie reťazec, preto musí zahŕňa kopírovanie, že celá sekvencia 6 00:00:13,130 --> 00:00:14,240 znaky. 7 00:00:14,240 --> 00:00:17,470 >> Poďme obrátiť svoju pozornosť späť k tomu posledná realizácia a vytrhnúť to 8 00:00:17,470 --> 00:00:21,470 linka, reťazec t rovná s, čo zjavne nebolo dostatočné. 9 00:00:21,470 --> 00:00:24,440 Poďme ho nahradiť riadok, ktorý vyzerá, namiesto toho, ako je to. 10 00:00:24,440 --> 00:00:34,020 String t dostane malloc dĺžky struny S plus 1 krát veľkosť char. 11 00:00:34,020 --> 00:00:36,320 >> Teraz je tu citát trochu deje Na tejto riadku kódu. 12 00:00:36,320 --> 00:00:39,330 Po prvé, malloc, krátky pre pamäť alokácie, a 13 00:00:39,330 --> 00:00:40,700 funkcie robí len to. 14 00:00:40,700 --> 00:00:44,740 Vzhľadom k tomu, celé číslo, vráti sa vám na adresa kus pamäti 15 00:00:44,740 --> 00:00:45,960 že veľa bytov. 16 00:00:45,960 --> 00:00:50,090 Medzitým, dĺžka reťazca s plus 1 je potrebné uviesť, že chceme ako 17 00:00:50,090 --> 00:00:54,690 veľa bajtov ako s už zaberá, vrátane terminátora null, 18 00:00:54,690 --> 00:00:57,050 lomítko 0 na konci reťazca. 19 00:00:57,050 --> 00:01:00,170 >> Medzitým som sa nemusí nutne pamätať ako veľký znak je, aj 20 00:01:00,170 --> 00:01:04,340 aj keď na väčšine systémov je to proste 1 byte, tak zavolám veľkosť char na 21 00:01:04,340 --> 00:01:08,210 zistiť, dynamicky, ako veľký individuálny charakter je. 22 00:01:08,210 --> 00:01:12,550 Akonáhle sa násobí spolu, ja sa vrátim celkový počet bajtov, ktoré potrebujem. 23 00:01:12,550 --> 00:01:14,680 >> Ale čo keď malloc zlyhá vrátiť pamäť, ktorú potrebujeme? 24 00:01:14,680 --> 00:01:16,730 Ja by som najlepšie skontrolovať, že takto. 25 00:01:16,730 --> 00:01:23,330 Je-li t sa rovná null, potom som prvýkrát bude na voľné s, pamäť vrátená get 26 00:01:23,330 --> 00:01:27,120 reťazec, a potom budem vráti 1, znamenať chybu. 27 00:01:27,120 --> 00:01:30,360 >> Ale ak je všetko v poriadku, budem pokračovať použiť štyri slučky a iteráciu 28 00:01:30,360 --> 00:01:31,110 nasledujúcim spôsobom. 29 00:01:31,110 --> 00:01:36,000 Pre int i dostať 0, n rovná dĺžka reťazca s 30 00:01:36,000 --> 00:01:40,350 Budem to robiť tak dlho, ako som ich menšia než alebo sa rovná n tak, že som 31 00:01:40,350 --> 00:01:44,460 iterácii nahor a vrátane null ukončovacie znak v s. 32 00:01:44,460 --> 00:01:47,450 >> A v každej iterácii, som bude zvyšovať i 33 00:01:47,450 --> 00:01:52,496 Medzitým, vnútri tejto slučky, skopírujte s je i-tý znak do T i-teho 34 00:01:52,496 --> 00:01:59,310 umiestnenie, postačí na to t držiak aj dostane y držiak i 41 00:01:59,320 --> 00:02:02,750 >> Poďme teraz uložiť, skompilovať, a spustiť tento nový program. 42 00:02:02,750 --> 00:02:06,690 Urobiť kópie 1 bodka lomítko kópiu 1. 43 00:02:06,690 --> 00:02:09,460 A ja poviem niečo ako: ahoj vo všetkých malými písmenami. 44 00:02:09,460 --> 00:02:12,280 A našťastie, tentoraz my pôvodné zostáva bezo zmeny. 45 00:02:12,280 --> 00:02:13,660 ahoj vo všetkých malými písmenami. 46 00:02:13,660 --> 00:02:15,540 Ale kópie sú naozaj veľké. 47 00:02:37,120 --> 00:02:38,963