1 00:00:00,000 --> 00:00:00,410 2 00:00:00,410 --> 00:00:03,130 >> David J. MALAN: Okazuje się, że kopiowanie ciąg nie jest tak 3 00:00:03,130 --> 00:00:05,750 proste jak kopiowanie prymitywne, jak int lub float. 4 00:00:05,750 --> 00:00:09,190 Wszakże pod maską ciąg jest ciągiem znaków. 5 00:00:09,190 --> 00:00:13,130 Więc kopiowanie ciąg, dlatego musi obejmować kopiowanie że całą sekwencję 6 00:00:13,130 --> 00:00:14,240 znaków. 7 00:00:14,240 --> 00:00:17,470 >> Zwróćmy uwagę, że z powrotem do Ostatnia realizacja i wyrwać to 8 00:00:17,470 --> 00:00:21,470 linia, łańcuch t jest równe S, który wyraźnie nie był wystarczający. 9 00:00:21,470 --> 00:00:24,440 Załóżmy, wymień go na linii, która wygląda, a nie, jak to. 10 00:00:24,440 --> 00:00:34,020 String t dostaje malloc długości string S Plus 1 razy rozmiar char. 11 00:00:34,020 --> 00:00:36,320 >> Teraz jest cytat nieco dzieje na w tej linii kodu. 12 00:00:36,320 --> 00:00:39,330 Po pierwsze, malloc, krótki dla pamięci alokacji, a 13 00:00:39,330 --> 00:00:40,700 funkcja właśnie to robi. 14 00:00:40,700 --> 00:00:44,740 Biorąc pod uwagę całkowitą, zwraca się do ciebie z adres kawałkiem pamięci 15 00:00:44,740 --> 00:00:45,960 że wiele bajtów. 16 00:00:45,960 --> 00:00:50,090 Tymczasem długość łańcuch s oraz 1 ma oznaczać, że ma co 17 00:00:50,090 --> 00:00:54,690 jak wiele bajtów, a zajmuje już w tym jego terminator zerowej 18 00:00:54,690 --> 00:00:57,050 odwrotny ukośnik 0 na końcu łańcucha. 19 00:00:57,050 --> 00:01:00,170 >> Tymczasem ja nie muszą pamiętać jak duży char jest, nawet 20 00:01:00,170 --> 00:01:04,340 choć w większości systemów jest to po prostu 1 bajt, więc zadzwonię do rozmiaru char 21 00:01:04,340 --> 00:01:08,210 dowiedzieć się, jak duże dynamicznie indywidualny charakter jest. 22 00:01:08,210 --> 00:01:12,550 Po pomnożone razem, wrócę Całkowita liczba bajtów, które muszę. 23 00:01:12,550 --> 00:01:14,680 >> Ale co, jeśli nie malloc przywrócić pamięć musimy? 24 00:01:14,680 --> 00:01:16,730 Chciałbym za to najlepiej sprawdzić w następujący sposób. 25 00:01:16,730 --> 00:01:23,330 Jeśli t jest równe NULL, to ja pierwszy będzie do bezpłatnych s, pamięć powróciła przez GET 26 00:01:23,330 --> 00:01:27,120 łańcuch, a następnie zamierzam zwraca 1, oznaczać błąd. 27 00:01:27,120 --> 00:01:30,360 >> Ale jeśli wszystko jest dobrze, mam zamiar kontynuować użycie czterech pętli i iteracyjne 28 00:01:30,360 --> 00:01:31,110 w następujący sposób. 29 00:01:31,110 --> 00:01:36,000 Dla int i dostać 0, n wynosi Długość ciąg s. 30 00:01:36,000 --> 00:01:40,350 Mam zamiar to zrobić, tak długo, jak jest mniejsza lub równa n, tak że 31 00:01:40,350 --> 00:01:44,460 iteracyjne się poprzez włącznie wartość null kończący znaków w s.. 32 00:01:44,460 --> 00:01:47,450 >> I na każdej iteracji, jestem zamierza zwiększyć i.. 33 00:01:47,450 --> 00:01:52,496 Tymczasem wewnątrz tej pętli, kopiować y jest i-ty znak w T i-th 34 00:01:52,496 --> 00:01:59,310 lokalizacja, wystarczy zrobić t Uchwyt i dostaje ów wspornik i.. 41 00:01:59,320 --> 00:02:02,750 >> Załóżmy teraz zapisać, skompilować i uruchomić ten nowy program. 42 00:02:02,750 --> 00:02:06,690 Dodać 1 kropka slash kopia kopii 1. 43 00:02:06,690 --> 00:02:09,460 I powiem coś Witaj w całej małe. 44 00:02:09,460 --> 00:02:12,280 I na szczęście, tym razem moja oryginalne pozostaje niezmienione. 45 00:02:12,280 --> 00:02:13,660 Witaj w całej małe. 46 00:02:13,660 --> 00:02:15,540 Ale kopia jest, rzeczywiście, kapitalizowane. 47 00:02:37,120 --> 00:02:38,963