ROB BOWDEN: Cześć, jestem Rob Bowden, i porozmawiajmy o quiz0. Więc pierwsze pytanie. To jest pytanie, gdzie potrzebne do kodowania numeru 127 w żarówki binarnych. Jeśli chcesz, możesz zrobić regularnej konwersji z bi-- lub z przecinku na binarne. Ale to prawdopodobnie będzie podjąć wiele czasu. To znaczy, można dowiedzieć się, że OK 1 to tam, 2 jest tam 4 znajduje się tam, 8 jest w środku. Łatwiejszy sposób, 127 128 minus jeden. Że żarówka świeci od lewej 128-bit. Więc 127 jest tak naprawdę wszystko innych żarówek, ponieważ jest to najbardziej wysunięta na lewo żarówka minus 1. To wszystko na to pytanie. Pytanie pierwsze. Więc z 3 bitów można reprezentują osiem różnych wartości. Dlaczego więc jest 7 największym nieujemną dziesiętną liczbą całkowitą można reprezentować? Cóż, jeśli tylko możemy reprezentują osiem różnych wartości, to co mamy zamiar być reprezentujących wartości od 0 do 7. 0 wykonuje się jedną z tych wartości. Pytanie drugie. Z n bitów, ile odrębne wartości można reprezentować? Tak, z n bitów, masz 2 Możliwe wartości dla każdego bitu. Więc mamy 2 możliwe wartości pierwszy bit, 2 możliwe wartości na sekundę, 2 możliwe do trzeciej. I tak to jest 2 razy 2 razy 2 i ostatecznie odpowiedź jest 2 do n. Pytanie trzy. Co 0x50 binarnie? Więc pamiętaj, że ma bardzo heksadecymalny prosta konwersja do pliku binarnego. Więc, po prostu trzeba spojrzeć na 5 i 0 niezależnie. Więc co jest 5 w formacie binarnym? 0101, to 1 bit i 4 bit. Co znajduje się 0 w binarnym? Nie trudne. 0000. Więc po prostu umieścić je razem, a to pełny numer w formacie binarnym. 01010000. A jeśli chciał mógłbyś zdjąć ten skrajnie lewy zero. To bez znaczenia. Tak więc alternatywnie co jest 0x50 w przecinku? Jeśli chcesz, możesz could-- jeśli jesteś bardziej komfortowo z pliku binarnego, można przyjąć, że odpowiedź binarny i przekonwertować na dziesiętną. Albo może po prostu pamiętam że szesnastkowym. Tak, że 0 jest na 0-te miejsce, a 5 znajduje się w 16 w pierwszym miejscu. Więc tutaj mamy 5 razy 16 do pierwsze, plus 0 razy 16 do zera, 80. A jeśli spojrzał na Tytuł na pytanie, było CS 80, który był swego rodzaju wskazówkę do odpowiedzi na ten problem. Pytanie pięć. Mamy skrypt podstaw, które jest 4 razy powtarzając masło orzechowe galaretki. Jak więc teraz kod w C? Cóż, mamy here-- część w śmiały jest tylko część, którą miał do wykonania. Mamy więc cztery pętli pętli 4, który jest Czasy, printf-ing galaretki masło orzechowe, z nowej linii jako problem prosi. Pytanie sześć, inny problem Scratch. Widzimy, że jesteśmy na zawsze w pętli. Mówimy zmienna i a następnie zwiększając io 1. Teraz chcemy to zrobić w C. Są wiele sposobów mogliśmy zrobić tego. Tu stało się zakodować zawsze jako pętla while (true). Więc zadeklarować zmienną i, po prostu jak mieliśmy zmienną I w Scratch. Deklaracja zmiennej i, i na wieki while (true), to mówimy, zmienną i. Więc printf% ja-- lub można używałem% d. Mówimy, że zmienna i następnie zwiększać ją, i ++. Pytanie siedem. Teraz chcemy zrobić coś bardzo podobnego Mario dot c od problemu ustawione. Chcemy, aby wydrukować te hashtags, chcemy wydrukować pięć przez trzy prostokąta z tych skrótów. Więc jak mamy zamiar to zrobić? Cóż, dajemy Ci całe czek kodu, i po prostu wypełnić w funkcji siatki druku. Więc co PrintGrid wyglądać? Dobrze, że jesteś obok Szerokość i wysokość. Mamy więc zewnętrznej 4 pętla, która jest zapętlenie przez wszystkie wiersze tego siatki, które chcemy wydrukować. Następnie mamy 4 między zagnieżdżonych pętli, to jest drukowanie na każdej kolumnie. Więc dla każdego wiersza, drukujemy na każda kolumna, jeden hash. Następnie na końcu rzędu się drukowanie pojedyncza linia, aby przejść do następnego wiersza. I to dla całej sieci. Pytanie osiem. Funkcja jak PrintGrid mówi się, wystąpiły działania niepożądane, ale nie powrotu wartość. Wyjaśnij różnicę. Więc to zależy od ciebie pamiętać czego efektem ubocznym jest. Cóż, powrót value-- wiemy PrintGrid nie ma wartość zwracaną, ponieważ tu mówi nieważne. Więc wszystko, co zwraca void Naprawdę nic nie zwróci. Tak więc to, co jest efektem ubocznym? Cóż, skutkiem ubocznym jest coś, jakby nie ustępuje po zakończeniu czynności że nie tylko wrócił, i to nie tylko z wejść. Tak więc, na przykład, moglibyśmy zmienić wartość zmiennej globalnej. To byłby efekt uboczny. W tym konkretnym przypadku, bardzo ważnym skutkiem ubocznym drukuje na ekranie. Więc to jest efekt uboczny że PrintGrid ma. Drukujemy te rzeczy na ekranie. I można myśleć że jako efekt uboczny ponieważ jest to coś, co nie ustępuje po zakończeniu tej funkcji. To jest coś poza zakresem tej funkcji, które ostatecznie ulega zmianie, Zawartość ekranu. Pytanie dziewięć. Rozważmy program poniżej, do których numery linii zostały dodane sake dyskusji. Tak więc w tym programie mamy tylko dzwoniąc getString, przechowywanie go Do tej zmiennej s, a następnie wydrukowaniem zmiennej s. OK. Więc dlaczego jedna linia jest obecna. #include CS50 kropka h. Dlaczego musimy #include CS50 dot h? Cóż my dzwoniąc Funkcję getString, i GetString jest zdefiniowana w bibliotece CS50. Więc jeśli nie mamy #include CS50 kropka h, byśmy się, że ukryte oświadczenie błędu funkcji GetString od kompilatora. Więc musimy zawierać library-- musimy dołączyć plik nagłówka, bo kompilator nie będzie uznają, że GetString istnieje. Wyjaśnij, dlaczego druga linia jest obecna. Tak więc standardowe io punkt h. To jest dokładnie to samo jak w poprzednim problemu chyba zamiast zajmować się GetString, mówimy o printf. Tak więc, jeśli nie powiedzieć, musimy zawierać standardowe io dot h, wtedy nie będzie w stanie użycie funkcji printf, ponieważ kompilator nie wie o tym. Why-- jakie jest znaczenie o unieważnienie zgodnie cztery? Mamy tu więc int main (void). To się po prostu mówiąc, że nie otrzymujesz żadnej linii poleceń argumenty do głównej. Pamiętaj, że możemy powiedzieć, int Główne int argc wsporniki ciąg ARGV. Więc po prostu powiedzieć, powiedzieć, że nieważne ignorują argumenty wiersza poleceń. Wyjaśnić w odniesieniu do pamięci dokładnie co GetString zgodne sześć powraca. GetString wraca blok pamięci, tablica znaków. To naprawdę powrót wskaźnik do pierwszego znaku. Należy pamiętać, że łańcuch jest gwiazdą char. Tak s jest wskaźnikiem do pierwszego znaków w ciąg jest co że użytkownik wszedł na klawiaturze. I że pamięć dzieje się malloced, tak, że pamięć jest w kupie. Pytanie 13. Rozważmy poniższy program. Więc cały ten program robi jest printf-ing 1 podzielonej przez 10. Więc po opracowaniu i wykonywane, program ten wyjścia 0.0, chociaż 1 podzielone przez 10 0.1. Więc dlaczego jest to 0.0? Cóż, to dlatego, od całkowitej podziału. 1 więc całkowita, 10 jest liczbą całkowitą. Więc 1 podzielone przez 10, wszystko jest traktowane jako liczby całkowite, i C, gdy robimy podział liczby całkowitej, możemy obciąć dowolny punkt dziesiętny. Tak więc 1 jest podzielona przez 10 0, a następnie próbujemy drukowanie, że pływak, tak zera drukowane float wynosi 0,0. I dlatego mamy 0,0. Rozważmy poniższy program. Teraz mamy do drukowania 0,1. Więc nie ma dzielenia całkowitego, jesteśmy po prostu drukowania 0,1, ale jesteśmy drukowanie do 28 miejsc po przecinku. I mamy to 0,1000, cała masa zer, 5 5 5, bla bla bla. Więc pytanie, dlaczego to robi drukowanie, że zamiast dokładnie 0,1? Więc tu jest teraz powodem zmiennoprzecinkowych niedokładności. Pamiętaj, że pływak jest tylko 32 bitów. Więc możemy reprezentować tylko skończoną ilość od wartości zmiennoprzecinkowe z tych 32 bity. Cóż tam ostatecznie nieskończenie wiele liczb zmiennoprzecinkowych, i nie ma nieskończenie wiele pływające Wartości zadane w zakresie od 0 do 1, i jesteśmy oczywiście w stanie stanowią nawet więcej wartości niż to. Mamy więc do poświęceń, aby było w stanie stanowić większość wartości. Więc wartość jak 0.1, najwyraźniej nie może stanowić, że dokładnie. Więc zamiast reprezentujących 0,1 robimy Najlepsze, co możemy reprezentować ten 0.100000 5 5 5. I to jest bardzo blisko, ale dla wielu zastosowań musisz się martwić zmiennoprzecinkowych niedokładności, dlatego, że po prostu nie może stanowić wszystkie pływające punkty dokładnie. Pytanie 15. Rozważmy poniższy kod. Jesteśmy po prostu drukowania 1 plus 1. Więc nie ma tu sztuczka. 1 plus 1 ma wartość 2, a to, że mamy do drukowania. To po prostu drukuje dwa. Pytanie 16. Teraz mamy do drukowania charakter 1 plus znak 1. Więc dlaczego nie wydrukować to samo? Cóż znak znak 1 plus 1, postać 1 ma wartość ASCII 49. Więc to jest naprawdę mówi 49 oraz 49, a ostatecznie to będzie drukować 98. Więc to nie drukuje 2. Pytanie 17. Zakończenie wdrażania nieparzystych poniżej w taki sposób, że funkcja zwraca true, jeśli n jest nieparzyste i false jeśli n jest parzyste. To jest wielki cel dla operatora mod. Więc bierzemy argument n, jeśli n mod 2 jest równa 1, oraz oznacza to, że n podzielony przez 2 miał resztę. Jeśli n dzieli się przez 2 miał resztę, że Oznacza to, że n jest nieparzyste, więc wracamy prawda. Indziej return false. Ty też mógł to zrobić n mod 2 równych zero, return false, w przeciwnym wypadku zwraca wartość true. Rozważmy funkcję rekurencyjną poniżej. Tak więc, jeśli n jest mniejsze niż lub równej 1, powrót 1 else return n razy f n minus jeden. Więc co to jest funkcja? Cóż, to jest po prostu silnia funkcja. To jest ładnie reprezentowany jak n silnia. Więc pytanie 19 teraz, chcemy skorzystać z tej funkcji rekurencyjnej. Chcemy, aby to wielokrotnie. Więc jak to zrobić? Cóż dla pracowników rozwiązanie, i znowu tam wiele sposobów mogłeś zrobić że zaczynamy z tego produktu int jest równa 1. I przez to pętli, będziemy być pomnożenie produkt ostatecznie skończyć z pełnym silni. Więc dla int i równa się dwa, i to mniejsza lub równa n, i ++. Można się zastanawiać, dlaczego i równa się dwa. Cóż, należy pamiętać, że mamy tu do upewnij się, że w naszym przypadku bazą jest prawidłowe. Tak więc, jeśli n jest mniejszy niż lub równy 1, jesteśmy po prostu wraca jeden. Więc tutaj, że zaczynają się i równa się dwa. Cóż, gdybym był jeden, potem the-- lub jeśli n były 1, to dla pętli nie wykonywać w ogóle. I tak po prostu Produkt zwrot, który jest jeden. Podobnie, jeśli brak było coś mniej niż 1-- gdyby było 0, ujemne 1, whatever-- my nadal powrocie 1, który jest dokładnie to, co wersja rekurencyjna robi. Teraz, gdy n jest większe niż 1, wtedy będziemy zrobić co najmniej jeden iteracji pętli. Więc powiedzmy, n wynosi 5, a następnie jesteśmy zrobi razy produktu wynosi 2. Teraz produkt jest 2. Teraz mamy zamiar zrobić Czasy produktu wynosi 3. Teraz jest 6. Czasy produktu wynosi 4, teraz jest 24. Czasy produktu wynosi 5, teraz jest 120. Tak więc ostatecznie, mamy powrót 120, który jest prawidłowo 5 silni. Pytanie 20. To jest jeden, gdzie trzeba wypełnić W tabeli z dowolnym algorytmie wszystko, co widzieliśmy, że wpisuje te algorytmicznego bieg Czasy te asymptotyczne czasów pracy. Więc co jest algorytm, który jest omega 1, ale duże O n? Więc nie może być nieskończenie wiele odpowiedzi tutaj. Który widzieliśmy prawdopodobnie najbardziej często jest tak liniowa wyszukiwarek. Tak więc w najlepszym wypadku Scenariusz, poz jesteśmy szukasz jest w początku listy i tak w omega z krokiem 1, Pierwszą rzeczą, którą sprawdzić, po prostu natychmiast wrócić że znaleźliśmy ten element. W najgorszym przypadku, Element jest na końcu, lub element nie ma na liście w ogóle. Musimy więc szukać Cała lista, wszystkie n elementy, a to dlatego, że to o n. Więc teraz jest to coś, co jest zarówno omega n log n, a duże O n log n. Cóż, co najbardziej istotne widzieliśmy tutaj jest połączyć rodzaju. Więc połączyć rodzaj, pamiętaj, jest ostatecznie Theta log n, gdzie n jest zdefiniowane theta gdy oba omega i duże O są takie same. Zarówno n log n. Co znajduje się coś, co jest omega N, i O, n kwadratu? Cóż, znowu nie ma wiele możliwych odpowiedzi. Tu stanie powiedzieć, sortowanie bąbelkowe. Sortowanie przez wstawianie tutaj również działa. Pamiętaj, że sortowanie bąbelkowe tam gdzie ma to optymalizacja, jeśli jesteś w stanie uzyskać przez całą listę bez konieczności zrobić wszelkie swapy, to dobrze, możemy od razu wrócić, że Lista została posortowana na początku. Tak więc w najlepszym przypadku, to tylko omega n. Jeśli to nie jest po prostu ładnie posortowana lista na początek, następnie mamy O n kwadratu swapy. I wreszcie mamy wyboru rodzaju dla n do kwadratu, jak i duże O. omega Pytanie 21. Co znajduje się liczba całkowita przepełnienia? Wyzdrowieć, podobnie jak powyżej, mamy tylko skończenie wiele bitów z oznacza liczbę całkowitą, Może więc 32 bitów. Powiedzmy, że mamy podpisaną całkowitą. Wtedy ostatecznie najwyższa liczba dodatnia możemy reprezentować wynosi od 2 do 31 minus 1. Więc co się dzieje, gdy próbujemy następnie zwiększyć tę liczbę całkowitą? Cóż, mamy zamiar przejść od 2 do 31 minus 1, w dół do negatywnej 2 do 31. Tak więc jest to całkowita przepełnienia kiedy trzymasz zwiększając, i ostatecznie nie można nic wyższa i to właśnie owija całą drogę wokół do wartości ujemnej. Co o przepełnienie bufora? Więc bufor overflow-- pamiętam, co jest bufor. To tylko fragment pamięci. Coś w tablicy jest bufor. Tak jest w przypadku przepełnienia bufora próby uzyskania dostępu do pamięci poza końcem tablicy. Więc jeśli masz tablica rozmiarów 5 i Ciebie próby uzyskania dostępu wspornik tablicy 5 lub 6 lub wspornik wspornik 7 czy coś poza koniec, lub nawet coś Uchwyt tablicy below-- negatywne 1-- wszystkie z nich są przepełnienia bufora. Jesteś dotykania pamięci w złych sposobów. Pytanie 23. Więc w tym jednym trzeba wdrożyć strlen. I powiedzieć, że można Zakładamy, e nie będzie pusty, więc nie masz do wykonywać żadnej czek na null. I istnieje wiele sposobów można tego zrobić. Tu po prostu wziąć prosty. Zaczynamy z licznikiem, n. n jest liczenie, ile znaków jest. Więc zaczynamy od 0, a potem iteracji przez całą listę. S jest równe 0 wspornik znak null terminator? Pamiętaj szukamy znak null terminator aby określić, jak długo nasz łańcuch jest. Że ma zamiar zakończyć wszelkie istotne ciąg. Więc jest równa s wspornik 0 do terminator null? Jeśli nie jest, to będziemy spojrzeć na ów uchwyt wspornika 1, s 2. Wciąż tu, dopóki nie znaleźć NUL. Kiedy już go znajdziesz, to n zawiera Całkowita długość łańcucha, a może po prostu wrócić, że. Pytanie 24. Więc to jest ten, w którym trzeba zrobić kompromis. Więc jedno jest dobre w jednym sposób, ale w jaki sposób to jest złe? Więc, ma tendencję do scalania sortowania szybciej niż sortowanie bąbelkowe. Mimo, that-- dobrze, tutaj jest kilka odpowiedzi. Ale głównym z nich jest to, że sortowanie bąbelkowe jest omega n na liście sortowane. Pamiętaj, że stół właśnie widzieliśmy wcześniej. Więc bańka sortuje omega n, najlepszy scenariusz jest to w stanie po prostu przejść nad Lista raz, określić hej, to jest to już klasyfikowane i powrotu. Sortowanie przez scalanie, bez względu na to, co zrobić, to omega n log n. Więc dla posortowanej listy, bańki rodzaj będzie szybciej. Co teraz o związane list? Tak powiązana lista może rosnąć i kurczyć aby zmieścić tak wiele elementów, ile potrzeba. Mimo, that-- tak zwykle bezpośrednie porównanie będzie związane listy z tablicy. Dlatego, mimo że tablice mogą łatwo rosnąć i kurczyć aby zmieścić tak wiele elementów w razie potrzeby, wykaz związane porównaniu z an array-- tablica ma swobodny dostęp. Możemy w dowolnym indeksu zwłaszcza element tablicy. Tak dla połączonej listy, nie możemy wystarczy przejść do piątego elementu, musimy przechodzić od początku aż dojdziemy do piątego elementu. I to się dzieje, aby powstrzymać nas od robi coś takiego wyszukiwania binarnego. Mówiąc o poszukiwaniu binarnego, wyszukiwania binarnego wydaje się być szybszy od wyszukiwania liniowego. Mimo, that-- tak, jedną z możliwych rzeczy jest to, że nie można zrobić binarne szukaj na połączonych list można tylko zrobić na tablicach. Ale chyba ważniejsze, nie możesz zrobić wyszukiwanie binarne na tablicy, która nie jest posortowane. Z góry może trzeba uporządkować tablicy, a dopiero potem można zrobić wyszukiwanie binarne. Więc jeśli coś nie jest sortowane, aby rozpocząć, to wyszukiwarka liniowy może być szybciej. Pytanie 27. Więc rozważyć poniżej program, co będzie w następnym slajdzie. I to jest jeden, gdzie jesteśmy będzie chciał, aby jednoznacznie stwierdzić, wartości różnych zmiennych. Więc spójrzmy na to. Więc linii jeden. Mamy int x jest równa 1. To jedyna rzecz, która się stało. Tak więc w pierwszej linii, widzimy w naszym Stół, że y, a, b, i tmp są zaciemnione. Więc co jest x? Cóż, po prostu ustawić go na wartość 1. A potem druga linia, dobrze, możemy zobaczyć, że Y jest ustawiony na 2, i tabela jest już wypełnione dla nas. Tak x oznacza 1, y oznacza 2. Teraz linia trzy, teraz jesteśmy wewnątrz funkcji swap. Co możemy przejść do wymiany? Minęliśmy ampersand x dla , oraz handlowego y dla b. Gdy problem wcześniej stwierdził, że adres x jest 0x10 i adres y jest 0x14. Tak więc i b są równe 0x10 i 0x14, odpowiednio. Teraz w linii trzech, jakie są X i Y? Cóż, nic się nie zmieniło o x i y w tym momencie. Mimo, że są one wewnątrz ramy głównej stos arkuszy nadal mają takie same Wartości przedtem. Nie modyfikować żadnej pamięci. Tak x oznacza 1, y oznacza 2. Dobrze. Więc teraz powiedzieliśmy int tmp równa gwiazda. Więc w linii cztery, wszystko są identyczne, z wyjątkiem tmp. Nie zmieniły się żadnych wartości niczego z wyjątkiem tmp. Wyznaczamy tmp równą gwiazda. Co to jest gwiazda? No, a punkty x, więc gwiazda ma równej x, który oznacza 1. Więc wszystko jest kopiowany w dół, a tmp jest ustawiony na 1. Teraz następna linia. Gwiazda gwiazda równa się b. Więc po linii five-- dobrze znowu wszystko to samo z wyjątkiem, co gwiazda jest. Co to jest gwiazda? Cóż, po prostu powiedziała gwiazda jest x. Więc zmieniamy x równego gwiazdkowy b. Co to jest gwiazda b? y. Punkty B do y. Tak gwiazda b jest r. Więc ustawiamy x równe y, i wszystko inne jest takie samo. Widzimy więc, w następnym rzędzie, że x jest teraz 2, a reszta jest po prostu kopiowane. Teraz w następnej linii, gwiazda b równa tmp. Cóż, po prostu powiedziała gwiazda b jest y, więc ustawiamy y równa tmp. Wszystko inne jest takie samo, więc wszystko zostanie skopiowane w dół. Jesteśmy ustawienie y równą PZT, który jest jeden, a wszystko inne jest takie samo. Teraz wreszcie linia siedem. Jesteśmy z powrotem w głównej funkcji. Jesteśmy po zakończeniu wymiany. Straciliśmy A, B, i tmp, ale w końcu mamy nie zmieniając żadnych wartości nic w tym momencie, po prostu skopiować X i Y w dół. I widzimy, że X i Y są teraz 2 i 1, a nie 1 i 2. Swap z powodzeniem realizowane. Pytanie 28. Załóżmy, że możesz napotkać komunikaty o błędach poniżej w godzinach pracy w przyszłym roku jako CA lub TF. Doradzić, jak rozwiązać każdy z tych błędów. Tak nieokreślone odniesienie do getString. Dlaczego można zobaczyć? No cóż, jeśli student korzysta GetString w kodzie, Hash one prawidłowo ujęte CS50 kropka h zawierać bibliotekę CS50. Cóż, co one trzeba naprawić ten błąd? Muszą zrobić lcs50 kreska na wiersz poleceń, gdy są kompilacji. Więc jeśli nie przejdzie dzyń kreska lcs50, są nie będzie mieć rzeczywisty Kod, który implementuje getString. Pytanie 29. Pośrednio deklarując Funkcja biblioteki strlen. No to teraz, nie mają zrobić właściwego mieszania obejmują. W tym konkretnym przypadku, nagłówek pliku muszą to jest ciąg kropka h, i tym smyczkowy dot h, obecnie student-- teraz kompilator ma dostęp do deklaracje strlen, i wie, że kod używa poprawnie strlen. Pytanie 30. Więcej procent konwersji niż argumentów danych. Więc co to jest? Dobrze pamiętam, że to procent signs-- jak są one istotne dla printf. Więc w printf możemy percent-- możemy wydrukować coś jak procent i interpretacja odwrotnego ukośnika n. Albo możemy drukować jak procent i, Przestrzeń, procent i, przestrzeń, procent i. Tak więc dla każdego z tych procent objawy, musimy przekazać zmienną na końcu printf. Więc jeśli mówimy nawias printf procent i interpretacja odwrotnego ukośnika n bliskie paren, dobrze, możemy powiedzieć, że jesteśmy zamiar wydrukować liczbę całkowitą, ale potem nie przechodzą printf całkowita rzeczywiście wydrukować. Więc tutaj więcej procent konwersje niż argumentów danych? To mówi, że mamy cała masa procentach, i nie mamy wystarczająco dużo zmiennych rzeczywiście wypełnienie tych procentach. I to na pewno, na pytanie 31, zdecydowanie stracił 40 bajtów w jednym bloków. Więc to jest błąd Valgrind. Ten mówi, że gdzieś w kodzie, masz przydział, który jest 40 bajtów duży więc malloced 40 bajtów, i nigdy nie uwolnił go. Najprawdopodobniej wystarczy znaleźć jakiś wyciek pamięci, i dowiedzieć się, gdzie trzeba uwolnić ten blok pamięci. I pytanie 32, nieważny zapis wielkości 4. Znowu jest to błąd Valgrind. To nie musi robić z wycieków pamięci teraz. Jest to najbardziej likely-- To znaczy, że to jakiś nieprawidłowych praw pamięci. I najprawdopodobniej jest to jakiś rodzaju przepełnienia bufora. Gdzie masz tablicę, może Tablica całkowita, i niech mówią, że to od rozmiaru 5, a spróbuj dotknąć wspornik tablicy 5. Więc jeśli próbujesz pisać, że wartość, to nie jest bułka z pamięci że faktycznie mają dostęp do, i więc masz zamiar uzyskać ten błąd, mówiąc, nieprawidłowy zapis wielkości 4. Valgrind będzie rozpoznać, że jesteś próbując dotknąć pamięci niewłaściwie. I to dla quiz0. Jestem Rob Bowden, a to jest CS50.