1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:01,395 [მუსიკის დაკვრა] 3 00:00:01,395 --> 00:00:05,590 4 00:00:05,590 --> 00:00:07,940 >> DOUG LLOYD: OK ისე წინადადება დაწყებამდე აქ. 5 00:00:07,940 --> 00:00:11,660 თუ თქვენ არ უყურებს ვიდეო პოინტერები დაგვჭირდება ამის გაკეთება პირველი. 6 00:00:11,660 --> 00:00:15,860 იმის გამო, რომ ეს ვიდეო არის კიდევ ერთი გზა სამუშაო მითითებას. 7 00:00:15,860 --> 00:00:17,574 >> ასე რომ, ის აპირებს გაიგო ზოგიერთი ცნებები 8 00:00:17,574 --> 00:00:19,490 რომ ჩვენ საფარი პოინტერები ვიდეო, და ჩვენ 9 00:00:19,490 --> 00:00:21,948 აპირებს სიპრიალის ახლა, თუ გავითვალისწინებთ, რომ ისინი უკვე 10 00:00:21,948 --> 00:00:23,090 ერთგვარი ესმოდა. 11 00:00:23,090 --> 00:00:25,440 ასე რომ, მხოლოდ თქვენი სამართლიანი გაფრთხილება რომ, თუ თქვენ ხედავს ამ ვიდეო 12 00:00:25,440 --> 00:00:27,814 და თქვენ არ მინახავს პოინტერები ვიდეო, შესაძლოა, ერთგვარი 13 00:00:27,814 --> 00:00:29,610 ფრენა მეტი თქვენი უფროსი ცოტა. 14 00:00:29,610 --> 00:00:32,080 ასე რომ, ეს შეიძლება იყოს უკეთესი უყურებს, რომ ამ მიზნით. 15 00:00:32,080 --> 00:00:34,710 >> ასე რომ, ჩვენ უკვე ვნახეთ, ერთ-ერთი გზა მუშაობა მითითებას, 16 00:00:34,710 --> 00:00:37,810 რომელიც ვაცხადებთ ცვლადი, და მაშინ ჩვენ 17 00:00:37,810 --> 00:00:42,160 აცხადებენ, კიდევ ერთი ცვლადი, მომცეთ ცვლადი, რომელიც მიუთითებს, რომ იგი. 18 00:00:42,160 --> 00:00:44,870 ასე რომ, ჩვენ შევქმენით ცვლადი ერთად სახელი, ჩვენ 19 00:00:44,870 --> 00:00:48,480 ის მეორე ცვლადი ერთად სახელი, და ჩვენ აღვნიშნო, რომ მეორე ცვლადი 20 00:00:48,480 --> 00:00:50,220 რომ პირველი. 21 00:00:50,220 --> 00:00:52,370 ეს ერთგვარი აქვს პრობლემა, თუმცა, იმის გამო, რომ 22 00:00:52,370 --> 00:00:54,650 მოითხოვს, რომ ვიცი ზუსტად რამდენი მეხსიერება ჩვენ 23 00:00:54,650 --> 00:00:57,600 აპირებთ უნდა მომენტში ჩვენი პროგრამა შედგენილი. 24 00:00:57,600 --> 00:00:58,220 >> რატომ არის, რომ? 25 00:00:58,220 --> 00:01:03,338 იმიტომ, რომ ჩვენ უნდა შეეძლოს ასახელებს და იდენტიფიცირება ყველა შესაძლო ცვლადები 26 00:01:03,338 --> 00:01:04,129 ჩვენ შეიძლება ექმნებათ. 27 00:01:04,129 --> 00:01:07,910 ჩვენ შეიძლება მასივი, რომელიც შეიძლება იყოს შეუძლია ჩაატაროს უამრავი ინფორმაცია, 28 00:01:07,910 --> 00:01:10,110 მაგრამ ეს ჯერ კიდევ არ არის ზუსტად ზუსტი საკმარისი. 29 00:01:10,110 --> 00:01:12,640 რა მოხდება, თუ ჩვენ არ ვიცით, რა მოხდება, თუ ჩვენ არ ვიცით, 30 00:01:12,640 --> 00:01:14,370 რამდენად ჩვენ უნდა კომპილირების დროს? 31 00:01:14,370 --> 00:01:17,020 ან თუ ჩვენი პროგრამა აწარმოებს ძალიან დიდი ხნის განმავლობაში, 32 00:01:17,020 --> 00:01:19,810 მიღება სხვადასხვა მომხმარებლის მონაცემები და ჩვენ ნამდვილად ვერ 33 00:01:19,810 --> 00:01:23,170 შეაფასებს თუ არა ჩვენ აპირებთ უნდა 1,000 ერთეული? 34 00:01:23,170 --> 00:01:26,060 >> ეს იმას არ ნიშნავს, რომ შეგვიძლია ამბობენ ბრძანებათა ზოლს 35 00:01:26,060 --> 00:01:28,040 შესვლის რამდენი ელემენტი როგორ ფიქრობთ, თქვენ გჭირდებათ. 36 00:01:28,040 --> 00:01:31,100 ისე რა, რომ ვხვდები, არასწორია? 37 00:01:31,100 --> 00:01:34,300 დინამიური მეხსიერების გამოყოფის ერთგვარი საშუალებას გვაძლევს გზა 38 00:01:34,300 --> 00:01:36,867 მიიღოთ დაახლოებით ამ კონკრეტული პრობლემა. 39 00:01:36,867 --> 00:01:38,700 და ისე, როგორც ეს მას გამოყენებით მითითებას. 40 00:01:38,700 --> 00:01:42,140 >> ჩვენ შეგვიძლია გამოვიყენოთ პოინტერები მიიღოთ დაშვება დინამიურად 41 00:01:42,140 --> 00:01:45,710 გამოყოფილი მეხსიერება, მეხსიერება, რომელიც არის გამოყოფილი თქვენი პროგრამა მიმდინარეობს. 42 00:01:45,710 --> 00:01:48,290 ეს არ არის გამოყოფილი კომპილირების დროს. 43 00:01:48,290 --> 00:01:51,570 როდესაც თქვენ დინამიურად გამოყოფს მეხსიერება მოდის აუზი 44 00:01:51,570 --> 00:01:53,795 მეხსიერების ცნობილია, როგორც ბევრი. 45 00:01:53,795 --> 00:01:56,420 მანამდე ყველა მეხსიერების ჩვენ მუშაობს რა თქმა უნდა, 46 00:01:56,420 --> 00:01:59,920 უკვე მოდის აუზი მეხსიერების ცნობილია, როგორც Stack. 47 00:01:59,920 --> 00:02:02,470 კარგი გზა ზოგადად შევინარჩუნოთ გონება და ეს წესი 48 00:02:02,470 --> 00:02:04,720 ყოველთვის არ ეხება, მაგრამ საკმაოდ ბევრი თითქმის 49 00:02:04,720 --> 00:02:09,940 ყოველთვის ფლობს ჭეშმარიტი, რომ ნებისმიერი დრო მისცეს ცვლადის სახელი, რომ 50 00:02:09,940 --> 00:02:12,090 ალბათ ცხოვრობს Stack. 51 00:02:12,090 --> 00:02:14,650 და ნებისმიერ დროს, თქვენ არ მისცეს ცვლადი სახელი, 52 00:02:14,650 --> 00:02:19,160 თქვენ შეგიძლიათ დინამიური მეხსიერება გამოყოფა, იგი ცხოვრობს ბევრი. 53 00:02:19,160 --> 00:02:22,190 >> ახლა მე სახის წარდგენის ეს როგორც თუ არსებობს ამ ორი აუზი მეხსიერება. 54 00:02:22,190 --> 00:02:24,740 მაგრამ თქვენ შეიძლება არ ჩანს ეს სქემა, რომელიც, როგორც წესი, 55 00:02:24,740 --> 00:02:27,290 წარმომადგენლობა რა მეხსიერების ჰგავს, 56 00:02:27,290 --> 00:02:30,373 და ჩვენ არ ვაპირებთ, რომ აინტერესებს ყველა პერსონალის ზედა და ქვედა. 57 00:02:30,373 --> 00:02:33,580 ის, რასაც ჩვენ აინტერესებს ამ მონაწილეობა შუა აქ, ბევრი და დასტის. 58 00:02:33,580 --> 00:02:35,570 როგორც ხედავთ მიერ შევხედავთ ამ სქემა, 59 00:02:35,570 --> 00:02:38,390 ეს, ფაქტობრივად, არ არის ორი ცალკე აუზი მეხსიერება. 60 00:02:38,390 --> 00:02:42,757 ეს არის ერთ ერთი საერთო აუზი მეხსიერება სადაც თქვენ დაიწყოს, ამ ვიზუალური 61 00:02:42,757 --> 00:02:44,590 თქვენ დაიწყება ბოლოში და დაიწყოს შევსება 62 00:02:44,590 --> 00:02:48,040 ბოლოში დასტის, და თქვენ იწყება ზედა და დაიწყოს შევსება 63 00:02:48,040 --> 00:02:50,072 ზემოდან ქვემოთ ერთად ბევრი. 64 00:02:50,072 --> 00:02:51,780 მაგრამ ეს ნამდვილად არის იგივე აუზი, უბრალოდ 65 00:02:51,780 --> 00:02:56,050 სხვადასხვა წერტილში, სხვადასხვა ადგილას მეხსიერებაში, რომელიც გამოიყოფა. 66 00:02:56,050 --> 00:02:59,060 და თქვენ შეგიძლიათ ამოიწურა მეხსიერების ან რომელსაც 67 00:02:59,060 --> 00:03:01,240 ბევრი წავიდეთ ყველა გზა ბოლოში, ან აქვს 68 00:03:01,240 --> 00:03:05,440 დასტის წავიდეთ ყველა გზა დაბრუნება, ან რომელსაც ბევრი და დასტის 69 00:03:05,440 --> 00:03:06,740 შეხვდება up ერთმანეთის წინააღმდეგ. 70 00:03:06,740 --> 00:03:09,500 ყველა იმ შეიძლება იყოს პირობები რომ გამოიწვიოს თქვენი პროგრამა 71 00:03:09,500 --> 00:03:11,030 ამოიწურა მეხსიერება. 72 00:03:11,030 --> 00:03:11,952 გააგრძელეთ, რომ გონება. 73 00:03:11,952 --> 00:03:13,660 როდესაც ვსაუბრობთ ბევრი და დასტის 74 00:03:13,660 --> 00:03:17,880 ჩვენ ნამდვილად ვსაუბრობთ იმავე ზოგადი ბლოკი მეხსიერება, უბრალოდ 75 00:03:17,880 --> 00:03:21,930 სხვადასხვა ნაწილი, რომ მეხსიერებაში. 76 00:03:21,930 --> 00:03:24,910 >> ასე რომ, ჩვენ კიდევ დინამიურად გამოყოფილი მეხსიერება პირველ რიგში? 77 00:03:24,910 --> 00:03:27,740 როგორ ამჯამად ჩვენი პროგრამის მისაღებად მეხსიერება, როგორც ეს გაშვებული? 78 00:03:27,740 --> 00:03:32,660 ისე C უზრუნველყოფს ფუნქცია მოუწოდა malloc, მეხსიერების Allocator, რომელიც 79 00:03:32,660 --> 00:03:36,810 ზარი, და თქვენ გაივლის რამდენი ბაიტი მეხსიერება, რომელიც გსურთ. 80 00:03:36,810 --> 00:03:39,940 ასე რომ, თუ თქვენი პროგრამა მიმდინარეობს და გსურთ რიცხვი runtime, 81 00:03:39,940 --> 00:03:46,040 თქვენ mallock ოთხი ბაიტი მეხსიერება, malloc ფრჩხილებში ოთხ. 82 00:03:46,040 --> 00:03:48,540 >> mallock გაივლიან გადახედეთ ბევრი, 83 00:03:48,540 --> 00:03:50,750 იმიტომ, რომ ჩვენ დინამიურად გამოყოფის მეხსიერება, 84 00:03:50,750 --> 00:03:53,500 და ეს დაგიბრუნდებით მომცეთ, რომ მეხსიერებაში. 85 00:03:53,500 --> 00:03:56,180 ეს არ გაძლევთ, რომ memory-- ეს არ მისცეს მას სახელი, 86 00:03:56,180 --> 00:03:57,950 ეს გაძლევთ მომცეთ იგი. 87 00:03:57,950 --> 00:04:00,780 და ამიტომაც ისევ მე ვთქვი რომ მნიშვნელოვანია, რომ, შესაძლოა, 88 00:04:00,780 --> 00:04:03,770 არ უყურებს მითითებას ვიდეო სანამ არ მივიღებთ ძალიან შორს ამ. 89 00:04:03,770 --> 00:04:05,940 ასე malloc აპირებს მოგცემთ უკან მაჩვენებელი. 90 00:04:05,940 --> 00:04:08,950 >> თუ mallock ვერ მოგცემთ ნებისმიერი მეხსიერების იმიტომ, რომ თქვენ ამოიწურა, 91 00:04:08,950 --> 00:04:10,645 ეს მოგცემთ უკან null მაჩვენებელი. 92 00:04:10,645 --> 00:04:15,282 გახსოვთ, რა მოხდება, თუ ჩვენ ცდილობენ და dereference null მაჩვენებელი? 93 00:04:15,282 --> 00:04:17,019 ჩვენ განიცდიან seg ბრალია, არა? 94 00:04:17,019 --> 00:04:18,060 ეს, ალბათ, არ არის კარგი. 95 00:04:18,060 --> 00:04:21,579 >> ასე რომ, ყოველ დროს, თქვენ მიიღოს ზარი malloc თქვენ ყოველთვის, ყოველთვის 96 00:04:21,579 --> 00:04:25,270 უნდა შეამოწმოს თუ არა მაჩვენებელი რამაც თქვენ უკან null. 97 00:04:25,270 --> 00:04:28,800 თუ ეს, თქვენ უნდა დასრულდეს თქვენი პროგრამა იმიტომ, რომ თუ თქვენ ცდილობენ და dereference 98 00:04:28,800 --> 00:04:31,360 null მაჩვენებელი თქვენ აპირებს განიცდიან სეგმენტაცია ბრალია 99 00:04:31,360 --> 00:04:34,380 და თქვენი პროგრამა აპირებს ავარიული მაინც. 100 00:04:34,380 --> 00:04:37,190 ასე რომ, ჩვენ statically მიიღოს რიცხვი? 101 00:04:37,190 --> 00:04:37,730 >> int x. 102 00:04:37,730 --> 00:04:40,010 ჩვენ, ალბათ კეთდება, რომ რამოდენიმე ჯერ, არა? 103 00:04:40,010 --> 00:04:43,480 ეს ქმნის ცვლადში x, რომელიც ცხოვრობს დასტის. 104 00:04:43,480 --> 00:04:46,190 როგორ უნდა დინამიურად მიიღოს რიცხვი? 105 00:04:46,190 --> 00:04:50,010 Int ვარსკვლავი px ტოლია malloc 4. 106 00:04:50,010 --> 00:04:53,050 >> ან მეტი სათანადოდ ჩვენ ვიტყოდი int ვარსკვლავი px 107 00:04:53,050 --> 00:04:57,680 შეადგენს malloc ზომა int, მხოლოდ იმისათვის, რომ რაღაც ნაკლები 108 00:04:57,680 --> 00:04:59,740 ჯადოსნური ნომრები გარშემო ჩვენი პროგრამა. 109 00:04:59,740 --> 00:05:04,140 ეს აპირებს მიიღოს ჩვენთვის ოთხი ბაიტი მეხსიერების საწყისი ბევრი, 110 00:05:04,140 --> 00:05:06,720 და მაჩვენებელი მივიღებთ უკან მას უწოდებენ px. 111 00:05:06,720 --> 00:05:08,430 და შემდეგ, ისევე, როგორც ჩვენ გავაკეთეთ ადრე ჩვენ 112 00:05:08,430 --> 00:05:13,966 შეგიძლიათ dereference px, რომ შეამოწმონ, რომ მეხსიერება. 113 00:05:13,966 --> 00:05:15,590 როგორ მივიღოთ რიცხვი მომხმარებელი? 114 00:05:15,590 --> 00:05:17,970 შეიძლება ითქვას, int x უდრის int. 115 00:05:17,970 --> 00:05:19,930 ეს არის საკმაოდ მარტივია. 116 00:05:19,930 --> 00:05:24,030 რა მოხდება, თუ ჩვენ გვინდა შევქმნათ მასივი საქართველოს x მოძრავი რომ ცხოვრობს დასტის? 117 00:05:24,030 --> 00:05:28,210 ათწილადი stack_array-- რომ სახელი ჩვენი მასივი კვადრატულ ფრჩხილებში x. 118 00:05:28,210 --> 00:05:32,419 რომ შევქმნით ჩვენთვის მასივი საქართველოს x მოძრავი რომ ცხოვრობს დასტის. 119 00:05:32,419 --> 00:05:34,960 ჩვენ შეგვიძლია შევქმნათ მასივი მოძრავი რომ ცხოვრობს ბევრი, ძალიან. 120 00:05:34,960 --> 00:05:37,330 სინტაქსი შეიძლება გამოიყურებოდეს ცოტა მეტი cumbersome, 121 00:05:37,330 --> 00:05:41,740 მაგრამ შეიძლება ითქვას, float ვარსკვლავი heap_array ტოლია 122 00:05:41,740 --> 00:05:44,360 malloc x ჯერ ზომა float. 123 00:05:44,360 --> 00:05:48,160 მე უნდა საკმარისი ოთახი გამართავს x მცურავი პუნქტიანი ღირებულებებს. 124 00:05:48,160 --> 00:05:51,560 ასე ვთქვათ, მე უნდა 100 მოძრავი, ან 1,000 მოძრავი. 125 00:05:51,560 --> 00:05:54,810 ასე რომ, ამ შემთხვევაში ეს იქნება 400 ბაიტი 100 მოძრავი, 126 00:05:54,810 --> 00:05:59,080 ან 4000 ბაიტი 1,000 მოძრავი, იმიტომ, რომ თითოეული float იკავებს 127 00:05:59,080 --> 00:06:01,230 ოთხი ბაიტი სივრცეში. 128 00:06:01,230 --> 00:06:05,110 >> მას შემდეგ, რაც ამით შემიძლია კვადრატული ფრჩხილი სინტაქსი heap_array. 129 00:06:05,110 --> 00:06:08,970 უბრალოდ როგორც მე stack_array, მე შეგიძლიათ თქვათ მისი ელემენტების ინდივიდუალურად 130 00:06:08,970 --> 00:06:11,590 გამოყენებით heap_array ნულოვანი, heap_array ერთი. 131 00:06:11,590 --> 00:06:15,800 მაგრამ გავიხსენოთ, იმ მიზეზით, ჩვენ შეგვიძლია გავაკეთოთ, რომ იმიტომ, რომ სახელი მასივი C 132 00:06:15,800 --> 00:06:19,990 მართლაც მომცეთ რომ მასივი პირველი ელემენტს. 133 00:06:19,990 --> 00:06:23,480 ასე რომ, ის ფაქტი, რომ ჩვენ ვაცხადებთ მასივი მოძრავი დასტის აქ 134 00:06:23,480 --> 00:06:24,810 რეალურად ცოტა დამაბნეველი. 135 00:06:24,810 --> 00:06:27,600 ჩვენ ნამდვილად არიან მეორე ხაზი კოდი არსებობს 136 00:06:27,600 --> 00:06:32,360 ასევე შექმნაში მომცეთ ბლოკი მეხსიერება, რომ ჩვენ მაშინ ნუ ზოგიერთი მუშაობა. 137 00:06:32,360 --> 00:06:35,620 >> აი დიდი პრობლემა დინამიურად გამოყოფილი მეხსიერება, თუმცა, 138 00:06:35,620 --> 00:06:38,360 და ამიტომ ეს მართლაც მნიშვნელოვანია, რომ განვითარდეს გარკვეული კარგი ჩვევების 139 00:06:38,360 --> 00:06:39,800 როდესაც თქვენ მუშაობა მას. 140 00:06:39,800 --> 00:06:43,060 განსხვავებით statically განაცხადა მეხსიერება, თქვენი მეხსიერება 141 00:06:43,060 --> 00:06:46,790 არ არის ავტომატურად უბრუნდება სისტემა, როცა თქვენი ფუნქციის კეთდება. 142 00:06:46,790 --> 00:06:49,280 ასე რომ, თუ ჩვენ გვაქვს მთავარი, და მთავარ მოუწოდებს ფუნქცია 143 00:06:49,280 --> 00:06:53,860 f, როდესაც ვ სრულდება, რასაც ის აკეთებს, და დააბრუნებს კონტროლის პროგრამა 144 00:06:53,860 --> 00:06:58,810 უკან მთავარ, ყველა მეხსიერების რომ ვ გამოიყენება ენიჭება უკან. 145 00:06:58,810 --> 00:07:01,250 ეს შეიძლება იყოს გამოყენებული ერთხელ ზოგიერთი სხვა პროგრამა, 146 00:07:01,250 --> 00:07:04,250 ან სხვა ფუნქცია, რომელიც იღებს მოუწოდა შემდეგ მთავარ. 147 00:07:04,250 --> 00:07:06,970 მას შეუძლია გამოიყენოს, რომ იგივე მეხსიერების თავიდან. 148 00:07:06,970 --> 00:07:09,620 >> თუ თქვენ დინამიურად გამოყოს მეხსიერება, თუმცა 149 00:07:09,620 --> 00:07:14,380 თქვენ უნდა მკაფიოდ ვუთხრათ სისტემა, რომელიც თქვენ გაკეთდეს ეს. 150 00:07:14,380 --> 00:07:18,370 ეს თქვენ გამართავს გადატანა იგი თქვენთვის, რამაც გამოიწვევს პრობლემა თქვენ გაშვებული out 151 00:07:18,370 --> 00:07:19,290 მეხსიერება. 152 00:07:19,290 --> 00:07:22,179 და სინამდვილეში, ჩვენ ზოგჯერ ეხება ეს, როგორც მეხსიერების გაჟონვის. 153 00:07:22,179 --> 00:07:24,970 და ზოგჯერ ეს მეხსიერების ტბები შეიძლება რეალურად იყოს ნამდვილად დამანგრეველი 154 00:07:24,970 --> 00:07:27,020 სისტემის შესრულება. 155 00:07:27,020 --> 00:07:31,120 >> თუ თქვენ ხართ ხშირი ინტერნეტ შესახებ თქვენ შეიძლება გამოიყენოთ გარკვეული ბრაუზერების, 156 00:07:31,120 --> 00:07:35,630 და მე არ ასახელებს სახელები აქ, მაგრამ არსებობს გარკვეული ბრაუზერების იქ 157 00:07:35,630 --> 00:07:39,150 რომ განთქმულნი არიან, ფაქტობრივად, რომელსაც მეხსიერების გაჟონვის, რომელიც არ დაფიქსირდა. 158 00:07:39,150 --> 00:07:44,570 და თუ თქვენ დატოვოთ თქვენი ბრაუზერი ღია ძალიან დიდი დროის განმავლობაში, დღის 159 00:07:44,570 --> 00:07:48,060 და დღის ან კვირის განმავლობაში, თქვენ ზოგჯერ ალბათ შეამჩნევთ, რომ თქვენი სისტემა 160 00:07:48,060 --> 00:07:49,790 არის გაშვებული, რეალურად, მართლაც ნელა. 161 00:07:49,790 --> 00:07:54,640 და მიზეზი ის არის, რომ ბრაუზერის გამოყო მეხსიერება, 162 00:07:54,640 --> 00:07:57,320 მაგრამ მაშინ არ უთხრა სისტემა რომ ეს გაკეთდეს ეს. 163 00:07:57,320 --> 00:08:01,000 და ისე, რომ ტოვებს ნაკლები მეხსიერება ხელმისაწვდომია ყველა თქვენი სხვა პროგრამები 164 00:08:01,000 --> 00:08:04,480 უნდა იზიარებს, იმიტომ, რომ თქვენ leaking-- რომ ბრაუზერში 165 00:08:04,480 --> 00:08:06,755 პროგრამა ჩამოდის მეხსიერება. 166 00:08:06,755 --> 00:08:08,880 როგორ ვაძლევთ მეხსიერების უკან როდესაც ჩვენ გავაკეთეთ ეს? 167 00:08:08,880 --> 00:08:10,838 ისე, საბედნიეროდ, ის ძალიან მარტივი გზა ამის გაკეთება. 168 00:08:10,838 --> 00:08:11,710 ჩვენ უბრალოდ გასათავისუფლებლად იგი. 169 00:08:11,710 --> 00:08:15,020 არსებობს ფუნქცია მოუწოდა უფასო, იგი იღებს მომცეთ მეხსიერება, 170 00:08:15,020 --> 00:08:16,010 და ჩვენ კარგი წასვლა. 171 00:08:16,010 --> 00:08:18,310 >> ასე ვთქვათ ჩვენ ვართ შუა ჩვენი პროგრამა, 172 00:08:18,310 --> 00:08:21,970 ჩვენ გვინდა malloc 50 სიმბოლო. 173 00:08:21,970 --> 00:08:25,710 ჩვენ გვინდა malloc მასივი, რომ შეუძლია ჩატარება შეუძლია 50 სიმბოლო. 174 00:08:25,710 --> 00:08:29,109 და როდესაც ჩვენ მომცეთ უკან რომ, რომ კურსორი სახელი არის სიტყვა. 175 00:08:29,109 --> 00:08:30,900 ჩვენ ამას ვაკეთებთ, რასაც ჩვენ ვაპირებთ გავაკეთოთ სიტყვა, 176 00:08:30,900 --> 00:08:33,440 და მაშინ, როდესაც ჩვენ კეთდება მხოლოდ გასათავისუფლებლად იგი. 177 00:08:33,440 --> 00:08:37,460 და ახლა ჩვენ არ დაბრუნდა იმ 50 ბაიტი მეხსიერების უკან სისტემა. 178 00:08:37,460 --> 00:08:40,147 ზოგიერთი სხვა ფუნქცია შეიძლება მათი გამოყენება. 179 00:08:40,147 --> 00:08:43,480 ჩვენ არ უნდა ფიქრი, ტანჯვა მეხსიერების გაჟონვის იმიტომ, რომ ჩვენ არ გაათავისუფლა სიტყვა. 180 00:08:43,480 --> 00:08:46,639 ჩვენ მოცემული მეხსიერების უკან, ასე რომ, ჩვენ გავაკეთეთ მუშაობა მას. 181 00:08:46,639 --> 00:08:48,430 ასე რომ, არსებობს სამი ოქროს წესი, რომელიც უნდა 182 00:08:48,430 --> 00:08:51,700 იყოს დაცული გონება ყოველთვის, როცა თქვენ დინამიურად გამოყოფის მეხსიერება 183 00:08:51,700 --> 00:08:52,990 malloc. 184 00:08:52,990 --> 00:08:56,480 ყოველი ბლოკი მეხსიერება, რომელიც თქვენ malloc უნდა გათავისუფლდეს 185 00:08:56,480 --> 00:08:58,430 სანამ თქვენი პროგრამა სრულდება გაშვებული. 186 00:08:58,430 --> 00:09:02,029 ახლა კიდევ ერთხელ, ელექტრო ან IDE ეს ერთგვარი ხდება თქვენ მაინც 187 00:09:02,029 --> 00:09:04,820 როდესაც you-- ეს მოხდება მაინც მაშინ, როდესაც წყდება, 188 00:09:04,820 --> 00:09:06,880 ყველა მეხსიერება იქნება. 189 00:09:06,880 --> 00:09:10,750 მაგრამ ეს ზოგადად კარგი კოდირების პრაქტიკა გვიჩვენებს, რომ ყოველთვის, როდესაც თქვენ გაკეთდეს, 190 00:09:10,750 --> 00:09:13,810 გასათავისუფლებლად, რა თქვენ mallocd. 191 00:09:13,810 --> 00:09:16,690 >> რომ განაცხადა, ერთადერთი რამ, რომ თქვენ mallocd უნდა გათავისუფლდეს. 192 00:09:16,690 --> 00:09:19,880 თუ თქვენ statically განაცხადოს რიცხვი, int x ნახევრად მსხვილი ნაწლავის, 193 00:09:19,880 --> 00:09:23,500 რომ ცხოვრობს დასტის, თქვენ არ მაშინ გვინდა გასათავისუფლებლად x. 194 00:09:23,500 --> 00:09:25,970 ასე რომ, ერთადერთი რამ, რომ თქვენ mallocd უნდა გათავისუფლდეს. 195 00:09:25,970 --> 00:09:28,960 >> და ბოლოს, არ უფასოდ რაღაც ორჯერ. 196 00:09:28,960 --> 00:09:31,170 რომელიც შეიძლება გამოიწვიოს სხვა უცნაური სიტუაცია. 197 00:09:31,170 --> 00:09:33,530 ასე რომ, ყველაფერი, რომ თქვენ mallocd უნდა გათავისუფლდეს. 198 00:09:33,530 --> 00:09:36,000 ერთადერთი რამ, რომ თქვენ malloc უნდა გათავისუფლდეს. 199 00:09:36,000 --> 00:09:38,730 და ამის გაკეთება არ არის თავისუფალი რაღაც ორჯერ. 200 00:09:38,730 --> 00:09:43,660 >> მოდით გავლა მაგალითი აქ რასაც ზოგიერთი დინამიურად გამოყოფილი 201 00:09:43,660 --> 00:09:46,122 მეხსიერების შეიძლება გამოიყურებოდეს შერეული წელს რამდენიმე სტატიკური მეხსიერება. 202 00:09:46,122 --> 00:09:47,080 რა შეიძლება მოხდეს აქ? 203 00:09:47,080 --> 00:09:48,913 აგრეთვე, თუ შეგიძლიათ დაიცვას გასწვრივ და ვხვდები, რა არის 204 00:09:48,913 --> 00:09:51,720 მოხდება, როგორც ჩვენ წავიდეთ ყველა ამ ხაზების კოდი. 205 00:09:51,720 --> 00:09:53,980 >> ამიტომ ვამბობთ int მ. 206 00:09:53,980 --> 00:09:54,840 რა ხდება აქ? 207 00:09:54,840 --> 00:09:56,339 ისე ეს არის საკმაოდ მარტივია. 208 00:09:56,339 --> 00:09:59,650 შევქმნა რიცხვი ცვლადში მ. 209 00:09:59,650 --> 00:10:01,400 მე ფერი მწვანე, იმიტომ, რომ ის ფერი 210 00:10:01,400 --> 00:10:03,730 რომ გამოვიყენო ვსაუბრობ შესახებ მთელი ცვლადები. 211 00:10:03,730 --> 00:10:05,160 ეს არის ყუთში. 212 00:10:05,160 --> 00:10:08,400 ეს ე.წ. მ, და თქვენ შეგიძლიათ მაღაზია რიცხვებით შიგნით მას. 213 00:10:08,400 --> 00:10:12,400 >> რა მოხდება, თუ მე ვიტყვი, int ვარსკვლავი? 214 00:10:12,400 --> 00:10:13,530 ისე, რომ საკმაოდ მსგავსია. 215 00:10:13,530 --> 00:10:15,780 მე შექმნის ყუთი მოუწოდა. 216 00:10:15,780 --> 00:10:19,100 ეს შეუძლია ჩატარების int ვარსკვლავები, მითითებას რიცხვებით. 217 00:10:19,100 --> 00:10:21,570 ასე რომ, მე შეღებვა მწვანე-ish ისევე. 218 00:10:21,570 --> 00:10:24,140 >> მე ვიცი, რომ რაღაც უნდა გავაკეთოთ რიცხვი, 219 00:10:24,140 --> 00:10:25,852 მაგრამ ეს არ არის თავად რიცხვი. 220 00:10:25,852 --> 00:10:27,310 მაგრამ ეს საკმაოდ ბევრი იგივე იდეას. 221 00:10:27,310 --> 00:10:28,101 მე შეიქმნა ყუთში. 222 00:10:28,101 --> 00:10:30,070 ორივე ეს უფლება ახლა ცხოვრობს დასტის. 223 00:10:30,070 --> 00:10:32,520 მე მოცემული მათ, როგორც სახელები. 224 00:10:32,520 --> 00:10:36,750 >> int ვარსკვლავი ბ შეადგენს malloc ზომა int. 225 00:10:36,750 --> 00:10:38,560 ეს შეიძლება იყოს პატარა სახიფათო. 226 00:10:38,560 --> 00:10:44,110 მიიღეთ მეორე და ვიფიქროთ, თუ რა მოელოდა, რომ მოხდეს ამ დიაგრამაზე. 227 00:10:44,110 --> 00:10:50,210 int ვარსკვლავი ბ შეადგენს malloc ზომა int. 228 00:10:50,210 --> 00:10:51,940 >> ისე ეს არ არის მხოლოდ შევქმნათ ერთი ყუთი. 229 00:10:51,940 --> 00:10:53,800 ეს რეალურად ქმნის ორ ყუთები. 230 00:10:53,800 --> 00:10:58,670 და ეს კავშირები, იგი ასევე ადგენს წერტილი ურთიერთობა. 231 00:10:58,670 --> 00:11:02,240 ჩვენ გამოყოფილი ერთი ბლოკი მეხსიერების შესახებ ბევრი. 232 00:11:02,240 --> 00:11:05,940 გაითვალისწინეთ, რომ ზედა მარჯვენა ყუთი იქ არ აქვს სახელი. 233 00:11:05,940 --> 00:11:06,760 >> ჩვენ mallocd იგი. 234 00:11:06,760 --> 00:11:08,050 იგი არსებობს ბევრი. 235 00:11:08,050 --> 00:11:10,090 მაგრამ ბ სახელი აქვს. 236 00:11:10,090 --> 00:11:11,950 ეს მაჩვენებელი ცვლადში ბ. 237 00:11:11,950 --> 00:11:13,910 რომ ცხოვრობს Stack. 238 00:11:13,910 --> 00:11:18,250 >> ასე რომ, ეს ნაჭერი მეხსიერების რომელიც მიუთითებს კიდევ ერთი. 239 00:11:18,250 --> 00:11:21,840 ბ ცხრილში მისამართი რომ ბლოკი მეხსიერება. 240 00:11:21,840 --> 00:11:23,757 მას არ გააჩნია სახელი მიიღო. 241 00:11:23,757 --> 00:11:24,590 მაგრამ ეს მიუთითებს, რომ იგი. 242 00:11:24,590 --> 00:11:29,760 ასე რომ, როდესაც ჩვენ ვამბობთ int ვარსკვლავი ბ უდრის malloc ზომა int, რომ იქ, 243 00:11:29,760 --> 00:11:33,490 arrow რომ გამოჩნდა, რომ მარჯვენა მხარეს, რომელიც მთელი რამ, 244 00:11:33,490 --> 00:11:36,740 მე მას, როგორც ჩანს, კიდევ ერთხელ, რა ხდება. 245 00:11:36,740 --> 00:11:39,341 ყველა რომ ხდება რომ ერთი ხაზი კოდი. 246 00:11:39,341 --> 00:11:41,340 ამჟამად ჩვენ კიდევ ცოტა მეტი პირდაპირი ერთხელ. 247 00:11:41,340 --> 00:11:43,330 შეადგენს ampersand მ. 248 00:11:43,330 --> 00:11:46,280 გახსოვთ, რა შეადგენს ampersand მ? 249 00:11:46,280 --> 00:11:48,920 ისე, რომ ის იღებს მ მისამართი. 250 00:11:48,920 --> 00:11:54,150 ან უფრო მეტი diagrammatically, ქულების მ. 251 00:11:54,150 --> 00:11:56,360 >> უდრის ბ. 252 00:11:56,360 --> 00:11:57,560 OK, ასე რომ აქ არის კიდევ ერთი. 253 00:11:57,560 --> 00:11:59,230 უდრის ბ. 254 00:11:59,230 --> 00:12:02,260 რა მოხდება რომ სქემა ამ დროს? 255 00:12:02,260 --> 00:12:04,330 >> კარგად გავიხსენოთ, რომ დავალება ოპერატორი სამუშაოები 256 00:12:04,330 --> 00:12:08,960 მინიჭებით ღირებულება უფლება ღირებულების მარცხენა. 257 00:12:08,960 --> 00:12:14,820 ასე რომ ნაცვლად მიუთითებს მ, ახლა მიუთითებს, რომ ერთსა და იმავე ადგილზე, რომ ბ რაოდენობა. 258 00:12:14,820 --> 00:12:18,900 ამჯამად არ აღვნიშნო, რომ B, მიუთითებს, სადაც ბ რაოდენობა. 259 00:12:18,900 --> 00:12:25,280 >> თუ აღნიშნა ბ რომ იქნებოდა უკვე შეადგენს ampersand ბ. 260 00:12:25,280 --> 00:12:28,150 არამედ უდრის ბ მხოლოდ იმას ნიშნავს, რომ ბ ახლა 261 00:12:28,150 --> 00:12:31,770 მიუთითებს იმავე მისამართზე, რადგან შიგნით b მხოლოდ მისამართზე. 262 00:12:31,770 --> 00:12:35,004 ახლა შიგნით არის იგივე მისამართზე. 263 00:12:35,004 --> 00:12:37,170 მ უდრის 10, ალბათ, ყველაზე პირდაპირი რამ 264 00:12:37,170 --> 00:12:38,690 ჩვენ გავაკეთეთ ცოტა. 265 00:12:38,690 --> 00:12:40,460 განათავსეთ 10 ყუთში. 266 00:12:40,460 --> 00:12:45,640 Star ბ უდრის მ + 2, გავიხსენოთ ჩვენი პოინტერები ვიდეო რა ვარსკვლავი ბ ნიშნავს. 267 00:12:45,640 --> 00:12:50,230 ჩვენ ვაპირებთ, რომ dereference ბ და დააყენა გარკვეული მნიშვნელობა, რომ მეხსიერებაში. 268 00:12:50,230 --> 00:12:51,860 ამ შემთხვევაში 12. 269 00:12:51,860 --> 00:12:55,300 >> ასე რომ, როდესაც ჩვენ dereference წერტილი გავიხსენოთ, რომ ჩვენ უბრალოდ გამგზავრება ქვემოთ arrow. 270 00:12:55,300 --> 00:12:58,205 ან დააყენა სხვა გზა, ჩვენ წასვლა რომ მეხსიერების მისამართი 271 00:12:58,205 --> 00:12:59,580 და ჩვენ მანიპულირება რამდენიმე გზა. 272 00:12:59,580 --> 00:13:00,830 ჩვენ დააყენა გარკვეული მნიშვნელობა არსებობს. 273 00:13:00,830 --> 00:13:03,960 ამ შემთხვევაში ვარსკვლავი ბ უდრის მ პლუს 2 არის მხოლოდ 274 00:13:03,960 --> 00:13:08,230 წასვლა ცვლადი აღნიშნა, რომ ბ, წასვლა მეხსიერება აღნიშნა, ბ, 275 00:13:08,230 --> 00:13:11,750 და მ პლუს 2 იქ, 12. 276 00:13:11,750 --> 00:13:14,970 >> ახლა მე გასათავისუფლებლად ბ. 277 00:13:14,970 --> 00:13:16,490 რა ხდება, როდესაც მე გასათავისუფლებლად b? 278 00:13:16,490 --> 00:13:18,800 მახსოვს რა ვთქვი უფასო საშუალებით. 279 00:13:18,800 --> 00:13:21,920 რა ვარ მე ამბობდა როდესაც მე გასათავისუფლებლად b? 280 00:13:21,920 --> 00:13:23,410 >> მე გაკეთდეს მუშაობს ის, არა? 281 00:13:23,410 --> 00:13:25,702 მე არსებითად დავთმობთ მეხსიერება. 282 00:13:25,702 --> 00:13:26,910 მე ვაძლევ მას უკან სისტემა. 283 00:13:26,910 --> 00:13:33,010 მე არ უნდა აღარ არის რა მე ვეუბნებოდი მათ, OK? 284 00:13:33,010 --> 00:13:37,390 >> ახლა თუ მე ვთქვა ვარსკვლავი ტოლია 11 თქვენ ალბათ შეუძლია 285 00:13:37,390 --> 00:13:40,460 უკვე გითხრათ, რომ რაღაც ცუდი მოხდება აქ, არა? 286 00:13:40,460 --> 00:13:44,160 მართლაც, თუ მე შევეცადე, რომ მე, ალბათ, დაიტანჯებოდა სეგმენტაცია ბრალი. 287 00:13:44,160 --> 00:13:47,140 იმის გამო, რომ ახლა, მიუხედავად იმისა, რომ ადრე რომ ბლოკი მეხსიერება 288 00:13:47,140 --> 00:13:50,220 იყო ის, რაც მე მქონდა ხელმისაწვდომობა, ამ ეტაპზე 289 00:13:50,220 --> 00:13:54,590 ახლა მე წვდომის მეხსიერება, არ არის იურიდიული ჩემთვის, რათა შეამოწმონ. 290 00:13:54,590 --> 00:13:57,330 >> და, როგორც ჩვენ, ალბათ, გავიხსენოთ, როდესაც ჩვენ მეხსიერება 291 00:13:57,330 --> 00:14:00,000 რომ ჩვენ არ უნდა შეეხოთ, ეს არის ის, ყველაზე გავრცელებული მიზეზი 292 00:14:00,000 --> 00:14:01,860 საქართველოს სეგმენტაცია ბრალია. ასე რომ, ჩემი პროგრამა 293 00:14:01,860 --> 00:14:05,170 რომ ავარიის შემთხვევაში, თუ მე შევეცადე ამის გაკეთება. 294 00:14:05,170 --> 00:14:09,910 ასე რომ კიდევ ერთხელ, რომ ეს არის კარგი იდეა, რომ მიიღოთ კარგი პრაქტიკა და კარგი ჩვევები ღრმა 295 00:14:09,910 --> 00:14:12,920 როდესაც მუშაობა malloc და თავისუფალი, ისე, რომ თქვენ არ განიცდიან სეგმენტაცია 296 00:14:12,920 --> 00:14:15,310 ხარვეზებით, და რომ თქვენ გამოიყენოთ თქვენი დინამიურად გამოყოფილი 297 00:14:15,310 --> 00:14:17,370 მეხსიერების პასუხისმგებლობით. 298 00:14:17,370 --> 00:14:20,300 >> მე Doug Lloyd ეს არის CS50. 299 00:14:20,300 --> 00:14:21,947