1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [عزف الموسيقى] 3 00:00:11,261 --> 00:00:12,640 >> J. DAVID مالان: حسنا. 4 00:00:12,640 --> 00:00:14,525 هذا هو CS50. 5 00:00:14,525 --> 00:00:16,009 وهذا هو بداية الأسبوع 5. 6 00:00:16,009 --> 00:00:18,050 وكما كنت قد لاحظت، بعض المواد 7 00:00:18,050 --> 00:00:21,050 هو الحصول على أكثر من ذلك بقليل مجمع، وأكثر كثافة قليلة. 8 00:00:21,050 --> 00:00:24,560 >> وأنه من السهل جدا، وخاصة إذا لقد كنت في العادة لبعض الوقت، 9 00:00:24,560 --> 00:00:28,600 أن تحاول خربشات أسفل أكثر أي شيء نقوم به، ونحن نقول في الصف. 10 00:00:28,600 --> 00:00:31,626 ولكن ندرك، وهذا هو ربما لا يكون النهج التربوي المثالي 11 00:00:31,626 --> 00:00:34,250 لتعلم هذا النوع من المواد، والمواد بشكل عام. 12 00:00:34,250 --> 00:00:37,250 ولذا فإننا سعداء ل يعلن الخاصة Gheng أن CS50 ل 13 00:00:37,250 --> 00:00:39,780 بدأت غونغ لإعداد مجموعة من الملاحظات الكنسي 14 00:00:39,780 --> 00:00:42,100 للدورة، على أمل وهو أن، واحد، هذه 15 00:00:42,100 --> 00:00:44,030 تخدم ليس فقط بوصفها المرجعية ومورد 16 00:00:44,030 --> 00:00:47,410 لمراجعة المواد والذهاب مرة أخرى من خلال المواد التي قد يكون لها 17 00:00:47,410 --> 00:00:51,230 هرب لك في المرة الاولى، ولكن أيضا بحيث رؤوسكم يمكن أن يكون أكثر 18 00:00:51,230 --> 00:00:53,740 يصل من أسفل، عندما يأتي الوقت لإلقاء محاضرة، 19 00:00:53,740 --> 00:00:56,960 بحيث قد المشاركة أكثر بعناية، و 20 00:00:56,960 --> 00:00:59,170 مقابل أكثر scribbly. 21 00:00:59,170 --> 00:01:02,510 >> وقال مع ذلك، ما ستجده في الموقع هو وثائق مثل هذا. 22 00:01:02,510 --> 00:01:04,660 والإشعار، في أعلى اليسار، وهناك ليس فقط جدول المحتويات، 23 00:01:04,660 --> 00:01:06,920 ولكن أيضا رموز الوقت الذي سوف تقفز لك على الفور 24 00:01:06,920 --> 00:01:09,077 إلى الجزء المناسب في الفيديو على الانترنت. 25 00:01:09,077 --> 00:01:11,410 وما قام به تشانغ هنا هو، في الأساس، وثقت 26 00:01:11,410 --> 00:01:13,340 ما حدث في هذه محاضرة معينة. 27 00:01:13,340 --> 00:01:16,370 والعديد من المحاضرات ل بالفعل حاليا مع هذا URL. 28 00:01:16,370 --> 00:01:20,110 وسوف نستمر في إضافة ما تبقى من تلك التي في نهاية هذا الاسبوع، 29 00:01:20,110 --> 00:01:22,380 لذلك الاستفادة من هذا المورد. 30 00:01:22,380 --> 00:01:25,740 >> ذلك دون مزيد من اللغط، بدأنا قشر العودة 31 00:01:25,740 --> 00:01:28,180 الطبقة التي كانت سلسلة لبعض الوقت. 32 00:01:28,180 --> 00:01:30,670 وماذا نقول سلسلة هو في الواقع الأسبوع الماضي؟ 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 نجمة شار ذلك. 35 00:01:32,900 --> 00:01:34,900 ونجم شار، حسنا، ما لم يعني ذلك حقا؟ 36 00:01:34,900 --> 00:01:37,150 حسنا، كل هذا الوقت، إذا قمنا تم استدعاء دالة، 37 00:01:37,150 --> 00:01:40,450 مثل getString، وتخزين ما يسمى عودة 38 00:01:40,450 --> 00:01:42,910 قيمة getString في variable-- انه دعا 39 00:01:42,910 --> 00:01:47,721 ق نوع string-- كنا الكتابة وسطر من التعليمات البرمجية إلى هناك أعلاه. 40 00:01:47,721 --> 00:01:49,970 وانها فقط عندما أرى بلدي الكتابة اليدوية تضخيم هنا 41 00:01:49,970 --> 00:01:51,930 يمكنني تدرك مدى بشاعة هذا. 42 00:01:51,930 --> 00:01:54,180 >> ومع ذلك، دعونا نفترض أن، على الجانب الأيمن 43 00:01:54,180 --> 00:01:57,070 هو، مع ذلك، معقول تصوير ما 44 00:01:57,070 --> 00:01:58,880 كان يحدث كل هذا الوقت مع getString. 45 00:01:58,880 --> 00:02:00,380 getString، بالطبع، يحصل على السلسلة. 46 00:02:00,380 --> 00:02:01,691 ولكن ماذا يعني ذلك حقا؟ 47 00:02:01,691 --> 00:02:04,190 وهذا يعني انه يحصل على قطعة من الذاكرة من نظام التشغيل 48 00:02:04,190 --> 00:02:06,040 بواسطة استدعاء دالة، ودعا malloc. 49 00:02:06,040 --> 00:02:07,390 ولكن أكثر على ذلك لاحقا. 50 00:02:07,390 --> 00:02:09,139 وبعد ذلك بملء أن جزءا من الذاكرة 51 00:02:09,139 --> 00:02:11,764 مع خطابات للمستخدم كتبته في، تليها، بالطبع، 52 00:02:11,764 --> 00:02:14,800 حرف فارغة، أو مائل صفر في النهاية. 53 00:02:14,800 --> 00:02:18,280 >> وفي الوقت نفسه، وعلى الجانب الأيسر من هذه القصة، كل هذا الوقت، 54 00:02:18,280 --> 00:02:20,850 لقد تم الإعلان عن المتغير، مثل ليالي. 55 00:02:20,850 --> 00:02:24,770 وهذا المتغير هو ما الآن ستبدأ استدعاء المؤشر. 56 00:02:24,770 --> 00:02:29,190 انها ليست داخل المربع منها وضعنا سلسلة، Daven، في حد ذاته، 57 00:02:29,190 --> 00:02:32,550 بل وضعنا في هذا الميدان مربع على اليسار ماذا بالضبط؟ 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 نعم؟ 60 00:02:35,390 --> 00:02:37,118 >> الجمهور: عنوان حيث انها تقع في الذاكرة. 61 00:02:37,118 --> 00:02:38,118 >> J. DAVID مالان: بالضبط. 62 00:02:38,118 --> 00:02:40,690 عنوان حيث Daven يقع في الذاكرة. 63 00:02:40,690 --> 00:02:44,650 وليس فيها كل من Daven يقع، في حد ذاته، ولكن على وجه التحديد عنوان 64 00:02:44,650 --> 00:02:45,150 لماذا؟ 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 نعم؟ 67 00:02:46,810 --> 00:02:47,460 >> الجمهور: الحرف الأول. 68 00:02:47,460 --> 00:02:50,209 >> J. DAVID مالان: الحرف الأول في Daven، والتي، في هذه الحالة، 69 00:02:50,209 --> 00:02:53,820 أنا اقترح كان تعسفيا وغير واقعي 1، OX1، 70 00:02:53,820 --> 00:02:55,910 وهو ما يعني فقط رقم سداسي عشري من 1. 71 00:02:55,910 --> 00:02:57,993 بل انه سيكون على الارجح أن يكون عدد أكبر بكثير 72 00:02:57,993 --> 00:03:01,260 أننا قد رسم مع 0X كما بادئة، 73 00:03:01,260 --> 00:03:02,806 يمثل حرف عشري. 74 00:03:02,806 --> 00:03:05,930 ولأننا لسنا في حاجة لمعرفة أين بقية الأحرف من Daven 75 00:03:05,930 --> 00:03:09,860 هي، بسبب ما تصميم بسيط القرار الذي اتخذ منذ سنوات عديدة؟ 76 00:03:09,860 --> 00:03:10,548 نعم؟ 77 00:03:10,548 --> 00:03:11,651 >> الجمهور: خط مائل عكسي 0. 78 00:03:11,651 --> 00:03:12,900 J. DAVID مالان: نعم، بالضبط. 79 00:03:12,900 --> 00:03:18,100 مائل 0 يسمح لك، وإن كان في الزمن الخطي، لاجتياز سلسلة، 80 00:03:18,100 --> 00:03:20,400 المشي من اليسار إلى اليمين، مع حلقة for، أو حين 81 00:03:20,400 --> 00:03:22,608 حلقة، أو شيء من هذا القبيل ذلك، وتحديد، أوه، هنا 82 00:03:22,608 --> 00:03:24,751 هي نهاية هذه السلسلة معينة. 83 00:03:24,751 --> 00:03:27,000 حتى مع مجرد عنوان في بداية سلسلة، 84 00:03:27,000 --> 00:03:30,290 يمكننا الوصول إلى مجمل ذلك، لأن كل هذا الوقت، 85 00:03:30,290 --> 00:03:32,030 وكانت سلسلة مجرد نجمة شار. 86 00:03:32,030 --> 00:03:36,370 >> لذلك فمن المؤكد غرامة الاستمرار في استخدام المكتبة CS50 وهذا التجريد، 87 00:03:36,370 --> 00:03:38,440 إذا جاز التعبير، ولكن سنقوم تبدأ لنرى بالضبط 88 00:03:38,440 --> 00:03:41,230 ما كان يحدث تحت هذا طوال الوقت. 89 00:03:41,230 --> 00:03:45,260 لذلك قد أذكر هذا المثال، أيضا، من وقت الماضي، مقارنة 0، 90 00:03:45,260 --> 00:03:47,300 التي لا تقارن في الواقع. 91 00:03:47,300 --> 00:03:49,070 ولكن بدأنا في حل هذه. 92 00:03:49,070 --> 00:03:52,020 >> لكن ربما لتجديد، ربما أنا مصلحة شخص 93 00:03:52,020 --> 00:03:54,261 في الفيل الوردي اليوم، قدمت أيضا من قبل تشانغ؟ 94 00:03:54,261 --> 00:03:55,760 كيف عنك في الجبهة؟ [غير مسموع]. 95 00:03:55,760 --> 00:03:56,660 تأتي على ما يصل. 96 00:03:56,660 --> 00:03:58,740 >> وفي هذه الأثناء، كما يمكنك الخروج، دعونا 97 00:03:58,740 --> 00:04:01,670 تنظر لمجرد لحظة ما هذا الرمز كان يقوم به فعلا. 98 00:04:01,670 --> 00:04:04,917 انها تعلن متغيرين تصل أعلى، ق و ر، والدعوة getString. 99 00:04:04,917 --> 00:04:08,250 هذا ليس برنامج سهل الاستعمال جدا، لأنه لا اقول لكم ما يجب القيام به. 100 00:04:08,250 --> 00:04:10,541 ولكن دعونا نفترض أننا فقط التركيز على جزء العصير. 101 00:04:10,541 --> 00:04:14,470 ثم نقوم به، وإذا ق يساوي يساوي ر، ينبغي أن نقول printf، 102 00:04:14,470 --> 00:04:16,170 كتبته نفس الشيء. 103 00:04:16,170 --> 00:04:16,670 مرحبا. 104 00:04:16,670 --> 00:04:17,050 ما اسمك؟ 105 00:04:17,050 --> 00:04:17,779 >> جانيل: جانيل. 106 00:04:17,779 --> 00:04:19,529 J. DAVID مالان: جانيل، لطيف لمقابلتك. 107 00:04:19,529 --> 00:04:21,800 لذلك التحدي الخاص بك في يد لهذا الفيل 108 00:04:21,800 --> 00:04:25,230 هو أول رسم لنا صورة ما أن تكون ممثلة في تلك الأولين 109 00:04:25,230 --> 00:04:25,970 خطوط. 110 00:04:25,970 --> 00:04:28,139 حتى ق و ر قد يكون كيف ممثلة على الشاشة؟ 111 00:04:28,139 --> 00:04:30,680 ويمكنك استدراجه فقط مع إصبعك على هذه الشاشة الكبيرة. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> ولذلك لا يوجد نصفين ل كل جانب من هذه المعادلة. 114 00:04:34,510 --> 00:04:37,760 لذلك هناك ق على اليسار، و ثم getString على اليمين. 115 00:04:37,760 --> 00:04:40,540 ثم هناك ر على اليسار، ثم getString على اليمين. 116 00:04:40,540 --> 00:04:42,630 فكيف يمكن أن نبدأ رسم الصورة التي 117 00:04:42,630 --> 00:04:46,340 يمثل ما يجري هنا في الذاكرة، وكنت أقول؟ 118 00:04:46,340 --> 00:04:49,150 واسمحوا لي أن تسمح لك شرح ما تفعلونه كما تذهب. 119 00:04:49,150 --> 00:04:49,820 >> جانيل: OK. 120 00:04:49,820 --> 00:04:58,890 حسنا، أولا، أنه سيطلب لك للحصول على سلسلة الإدخال. 121 00:04:58,890 --> 00:05:00,439 وسيكون store-- أوه، آسف. 122 00:05:00,439 --> 00:05:01,230 J. DAVID مالان: OK. 123 00:05:01,230 --> 00:05:01,730 جيدة. 124 00:05:01,730 --> 00:05:03,330 وهذا ما يسمى ماذا؟ 125 00:05:03,330 --> 00:05:03,950 أوه، حسنا. 126 00:05:03,950 --> 00:05:04,450 الاستمرار. 127 00:05:04,450 --> 00:05:05,575 لم أكن أقصد أن يقطع. 128 00:05:05,575 --> 00:05:07,060 جانيل: عذرا. 129 00:05:07,060 --> 00:05:14,237 لذلك سيكون مساهمة ذلك في عنوان of-- غير متأكد. 130 00:05:14,237 --> 00:05:17,320 لا أستطيع أن أتذكر بالضبط عدد و ولكن أعتقد أنه كان بدءا 0. 131 00:05:17,320 --> 00:05:18,420 >> J. DAVID مالان: هذا كل الحق، لأنني جعلت من أرقام تصل، 132 00:05:18,420 --> 00:05:19,650 لذلك ليس هناك إجابة صحيحة. 133 00:05:19,650 --> 00:05:22,105 >> جانيل: بدءا من 0 القوس. 134 00:05:22,105 --> 00:05:24,000 >> J. DAVID مالان: حسنا، العنصر 0. 135 00:05:24,000 --> 00:05:24,765 بالتأكيد. 136 00:05:24,765 --> 00:05:28,295 >> جانيل: ثم إذا كان مثل مجرد letter-- اثنين 137 00:05:28,295 --> 00:05:30,496 >> J. DAVID مالان: حسنا، إليك. 138 00:05:30,496 --> 00:05:33,629 >> جانيل: إذا العنصر 0، و ثم العنصر 1 أو العنصر 2. 139 00:05:33,629 --> 00:05:36,670 J. DAVID مالان: والتي قطعة من الصورة أنت تقترب الآن؟ 140 00:05:36,670 --> 00:05:37,690 الدعوة إلى getString؟ 141 00:05:37,690 --> 00:05:38,830 أو إعلان ق؟ 142 00:05:38,830 --> 00:05:42,890 >> جانيل: الإعلان من ليالي، على ما أعتقد. 143 00:05:42,890 --> 00:05:45,980 أوه، getString، لأنه من شأنه يتم إدخالها في كل [؟ المنطقة. ؟] 144 00:05:45,980 --> 00:05:46,510 >> J. DAVID مالان: جيد. 145 00:05:46,510 --> 00:05:47,051 بالضبط. 146 00:05:47,051 --> 00:05:49,300 حتى وإن كان هذا على نحو فعال بإرجاع صفيف، استدعاء، 147 00:05:49,300 --> 00:05:53,300 عندما نعود سلسلة، يمكننا مؤشر إلى أن سلسلة باستخدام 01 و 2. 148 00:05:53,300 --> 00:05:56,180 من الناحية الفنية، وهذه هي على الأرجح ممثلة عناوين الفردية، 149 00:05:56,180 --> 00:05:57,100 ولكن هذا شيء طيب. 150 00:05:57,100 --> 00:06:00,170 >> لذلك أفترض، إذا كنت تستطيع الصيام فقط تحيل إلى حيث توقفنا 151 00:06:00,170 --> 00:06:04,320 آخر مرة، إذا كان أحد كانت سلاسل ز أ ب ه، 152 00:06:04,320 --> 00:06:10,337 0 مائل، مما يمثل غابي المدخلات، وكيف يمكن نحن نمثل ق الآن؟ 153 00:06:10,337 --> 00:06:12,670 إذا كانت هذه هي الذاكرة التي من تم إرجاعها بواسطة getString؟ 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> جانيل: هل سيكون ممثلة قوس؟ 156 00:06:17,610 --> 00:06:18,750 >> J. DAVID مالان: بواسطة قوس؟ 157 00:06:18,750 --> 00:06:19,130 حسنا، لا. 158 00:06:19,130 --> 00:06:21,171 دعنا نقول فقط، بالصور، اسمحوا لي فقط على المضي قدما 159 00:06:21,171 --> 00:06:25,710 وأقترح أن، إذا كان هذا هو ثانية، هذا هو قيمة الإرجاع getString. 160 00:06:25,710 --> 00:06:29,482 وكنت قد رسمت هذه ك 0، 1، 2، الذي هو معقول تماما، لأننا 161 00:06:29,482 --> 00:06:30,940 يمكن فهرسة في سلسلة، على هذا النحو. 162 00:06:30,940 --> 00:06:33,340 ولكن مجرد أن تكون متسقة مع آخر مرة، اسمحوا لي أن المضي قدما 163 00:06:33,340 --> 00:06:37,310 واقتراح أن هذا تعسفا هو عنوان 1، هذا هو عنوان 2، 164 00:06:37,310 --> 00:06:39,597 هذا هو عنوان 3، وهكذا دواليك. 165 00:06:39,597 --> 00:06:41,430 وهكذا، لمجرد أن تكون فائقة واضح، ما الذي يحدث 166 00:06:41,430 --> 00:06:44,580 للذهاب في ليالي نتيجة لذلك السطر الأول من رمز، وكنت أقول؟ 167 00:06:44,580 --> 00:06:45,420 >> جانيل: العنوان 1؟ 168 00:06:45,420 --> 00:06:46,420 >> J. DAVID مالان: بالضبط. 169 00:06:46,420 --> 00:06:47,190 حتى معالجة 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 وفي الوقت نفسه، اسمحوا لي المضي قدما و تكرار بكثير من ما قمت به 172 00:06:51,230 --> 00:06:52,740 وإضافة بلدي ر بك هنا. 173 00:06:52,740 --> 00:06:56,340 إذا كان لي أن اكتب في غابي مرة أخرى، مرة ثانية، 174 00:06:56,340 --> 00:07:01,530 عند المطالبة مع getString، حيث، بطبيعة الحال، هو غابي سوف تذهب؟ 175 00:07:01,530 --> 00:07:02,280 حسنا، presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> جانيل: مثل هنا؟ 178 00:07:05,975 --> 00:07:06,850 J. DAVID مالان: نعم. 179 00:07:06,850 --> 00:07:08,516 جانيل: أو كما انها في نفس المربعات؟ 180 00:07:08,516 --> 00:07:11,940 J. DAVID مالان: اسمحوا لي أن أقترح، نعم، بالضبط، لذلك في هذه المربعات إضافية. 181 00:07:11,940 --> 00:07:15,230 ولكن ما هو المفتاح الآن هو أنه حتى على الرغم من أنني قد وضع هذه قريبة جدا 182 00:07:15,230 --> 00:07:18,650 together-- 0x1، على هذا و0x2-- في الواقع، 183 00:07:18,650 --> 00:07:25,750 هذا قد يكون الآن عنوان 0x10، على سبيل المثال، و0x11، 0x12 و، 184 00:07:25,750 --> 00:07:26,870 وهكذا دواليك. 185 00:07:26,870 --> 00:07:29,955 وهكذا، إذا كان هذا هو الحال، ما يحدث في نهاية المطاف هنا في ر؟ 186 00:07:29,955 --> 00:07:30,830 >> جانيل: 0x10؟ 187 00:07:30,830 --> 00:07:31,830 J. DAVID مالان: بالضبط. 188 00:07:31,830 --> 00:07:33,180 0x10 ذلك. 189 00:07:33,180 --> 00:07:34,570 وحتى الآن، السؤال الأخير. 190 00:07:34,570 --> 00:07:37,510 و، حتى الآن، كان عليك أن تعمل على اصعب لفيل حتى الآن. 191 00:07:37,510 --> 00:07:42,650 الآن، إذا كنت سحب ما يصل رمز مرة أخرى، عندما أفعل، في السطر الثالث، 192 00:07:42,650 --> 00:07:47,630 إذا ق يساوي يساوي طن، ما أنا في الواقع تقارن أننا قد رسمها هنا؟ 193 00:07:47,630 --> 00:07:49,271 >> جانيل: عناوين اثنين؟ 194 00:07:49,271 --> 00:07:50,270 J. DAVID مالان: بالضبط. 195 00:07:50,270 --> 00:07:53,350 لذلك أنا أقول هو ق يساوي يساوي ر؟ 196 00:07:53,350 --> 00:07:56,210 وبعبارة أخرى، هو 1 يساوي يساوي 10؟ 197 00:07:56,210 --> 00:07:59,710 وبطبيعة الحال، الجواب واضح الآن، لا. 198 00:07:59,710 --> 00:08:02,920 وحتى هذا البرنامج هو في نهاية المطاف الذهاب لطباعة ما، وكنت أقول؟ 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> جانيل: هل سيكون، كتبته نفس الشيء؟ 201 00:08:08,405 --> 00:08:11,446 >> J. DAVID مالان: حتى إذا ق هو 1 و t هو 10؟ 202 00:08:11,446 --> 00:08:13,320 >> جانيل: يمكنك كتابة أشياء مختلفة. 203 00:08:13,320 --> 00:08:13,570 >> J. DAVID مالان: بالضبط. 204 00:08:13,570 --> 00:08:14,480 كتبته أشياء مختلفة. 205 00:08:14,480 --> 00:08:14,850 كل الحق. 206 00:08:14,850 --> 00:08:16,714 حتى جولة من التصفيق، إذا استطعنا، هنا. 207 00:08:16,714 --> 00:08:17,214 [تصفيق] 208 00:08:17,214 --> 00:08:17,708 كان ذلك مؤلما. 209 00:08:17,708 --> 00:08:18,208 وأنا أعلم. 210 00:08:18,208 --> 00:08:19,684 فعلت بشكل جيد. 211 00:08:19,684 --> 00:08:24,690 حتى الآن دعونا نرى إذا كنا لا نستطيع ندف عدا ما هو الإصلاح. 212 00:08:24,690 --> 00:08:28,040 وبالطبع، عندما كنا الثابتة this-- التي سوف تمثل الآن في green-- 213 00:08:28,040 --> 00:08:29,690 فعلنا زوجين من التحسينات هنا. 214 00:08:29,690 --> 00:08:32,409 أولا، تماما كما التعقل تحقق، وأنا التحقق أولا 215 00:08:32,409 --> 00:08:35,110 إذا ق يساوي اغيا ور يساوي فارغة. 216 00:08:35,110 --> 00:08:39,440 ومجرد أن يكون واضحا، عندما قد ق ر أو لاغيا في قانون مثل هذا؟ 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 عندما قد ق ر أو تكون فارغة. 219 00:08:44,490 --> 00:08:44,990 نعم؟ 220 00:08:44,990 --> 00:08:45,990 >> الجمهور: [غير مسموع]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> J. DAVID مالان: بالضبط. 223 00:08:50,510 --> 00:08:52,840 إذا كانت السلسلة أن المستخدم كتبته في غير الطريق طويل جدا 224 00:08:52,840 --> 00:08:56,140 لتناسب في الذاكرة، أو بعض حالة الزاوية غريبة من هذا القبيل، 225 00:08:56,140 --> 00:08:59,010 getString، كما سنرى، حرفيا اليوم، في وثائقها، 226 00:08:59,010 --> 00:09:02,330 تقول انها ستعود لاغيا و قيمة الحارس خاصة، 227 00:09:02,330 --> 00:09:05,417 أو مجرد نوع من رمز خاص وهذا يعني شيء على ما يرام. 228 00:09:05,417 --> 00:09:07,500 لذلك نحن نريد للتحقق من ذلك، لأنه تبين 229 00:09:07,500 --> 00:09:09,720 باطل هو أن قيمة خطيرة جدا. 230 00:09:09,720 --> 00:09:14,250 >> في كثير من الأحيان، إذا حاولت أن تفعل شيئا مع باطلة تنطوي على function-- فمررها 231 00:09:14,250 --> 00:09:17,470 كمدخل، لinstance-- تلك الوظيفة قد جدا سوف تعطل و، مع ذلك، 232 00:09:17,470 --> 00:09:19,090 إنزال البرنامج كله. 233 00:09:19,090 --> 00:09:22,570 لذلك هذا الخط الثالث الآن هو مجرد التعقل تحقق، والتحقق من الخطأ، اذا صح التعبير. 234 00:09:22,570 --> 00:09:25,450 هذا هو عادة جيدة الآن ل لنا أن ندخل في أي وقت نحن 235 00:09:25,450 --> 00:09:28,050 محاولة استخدام القيمة التي يمكن، يحتمل، تكون فارغة. 236 00:09:28,050 --> 00:09:32,000 >> الآن، في السطر الرابع هنا، "إذا strcmp (ق، ر)،" حسنا، 237 00:09:32,000 --> 00:09:33,180 ما هذا اشارة الى؟ 238 00:09:33,180 --> 00:09:36,750 حسنا، قلنا كان هذا بإيجاز جدا اسمه وظيفة للمقارنة السلسلة. 239 00:09:36,750 --> 00:09:40,370 وهدفها في الحياة هو مقارنة الأولى حجتها ضدها الثانية، 240 00:09:40,370 --> 00:09:44,640 ولكن ليس من حيث عناوينهم، كما فعلنا غير قصد لحظة 241 00:09:44,640 --> 00:09:48,270 قبل مع رمز أحمر، ولكن بدلا من مقارنة هذين 242 00:09:48,270 --> 00:09:53,210 السلاسل في بديهية إنسانيا الطريقة بمقارنة هذا، ضد هذا، 243 00:09:53,210 --> 00:09:56,690 ضد هذا، ضد هذا، و ثم إذا وقف وعند واحد 244 00:09:56,690 --> 00:09:59,590 أو كل من أصابعي يضرب مائل 0. 245 00:09:59,590 --> 00:10:04,530 strcmp شخص حتى سنوات قبل تنفيذها لتنفيذ بالنسبة لنا وظيفة 246 00:10:04,530 --> 00:10:08,890 التي عقدناها نحن قد حصلت فقط عن طريق مقارنة قيمتين بسيطة. 247 00:10:08,890 --> 00:10:14,929 >> الآن بصراحة، وأظل الرسم كل هذه الأرقام المختلفة. 248 00:10:14,929 --> 00:10:17,470 ولكن الحقيقة هي، لقد كنت مما يجعل هذه تصل طوال الوقت. 249 00:10:17,470 --> 00:10:19,580 وذلك اسمحوا لي فقط على المضي قدما وهذه من خربشات 250 00:10:19,580 --> 00:10:23,100 لجعل النقطة التي في نهاية من اليوم والمضي قدما، 251 00:10:23,100 --> 00:10:30,160 نحن لا حقا أن نهتم ما يتناول أشياء هي في الواقع 252 00:10:30,160 --> 00:10:30,790 في الذاكرة. 253 00:10:30,790 --> 00:10:34,320 لذلك أنا لن رسم هذه أنواع من الأرقام كثيرا بعد الآن، 254 00:10:34,320 --> 00:10:38,970 أنا مجرد خلاصة هذا بعيدا قليلا أكثر ملاءمة مع السهام فقط. 255 00:10:38,970 --> 00:10:42,060 >> وبعبارة أخرى، إذا ق هو مؤشر، حسنا، دعونا فقط استدراجه، حرفيا، 256 00:10:42,060 --> 00:10:45,430 كمؤشر، مشيرا سهم من نفسها إلى شيء آخر، 257 00:10:45,430 --> 00:10:48,280 ولا تقلق أيضا أكثر من ذلك بكثير حول في التفاصيل التافهة من هذه العناوين 258 00:10:48,280 --> 00:10:49,910 التي، مرة أخرى، جعلت أنا على أي حال. 259 00:10:49,910 --> 00:10:52,680 ولكن سنرى هذه العناوين، في بعض الأحيان، عند تصحيح التعليمات البرمجية. 260 00:10:52,680 --> 00:10:56,450 >> الآن وفي الوقت نفسه، وهذا البرنامج هنا التصحيحات، بالطبع، 261 00:10:56,450 --> 00:10:58,720 هذه المشكلة من خلال مقارنة تلك السلسلتين. 262 00:10:58,720 --> 00:11:00,260 لكننا واجهت مشكلة أخرى. 263 00:11:00,260 --> 00:11:03,180 كان هذا من نسخة برنامج آخر مرة، 264 00:11:03,180 --> 00:11:06,880 ، كنت أحاول خلالها للاستفادة فقط الحرف الأول في سلسلة. 265 00:11:06,880 --> 00:11:09,620 ولكن ما كان العرض شاهدنا آخر مرة عندما 266 00:11:09,620 --> 00:11:14,150 مستخدم كتابة في القيمة، مثل غابي بالأحرف الصغيرة، لق، 267 00:11:14,150 --> 00:11:19,310 ثم نحن في تعيين ق ر، كما في السطر الثالث هناك، 268 00:11:19,310 --> 00:11:22,900 ثم حاولت أن الاستفادة ر 0 قوس؟ 269 00:11:22,900 --> 00:11:25,950 ما كان تأثير تغيير ر 0 قوس هنا؟ 270 00:11:25,950 --> 00:11:27,150 >> الجمهور: انها تغيرت ق. 271 00:11:27,150 --> 00:11:29,360 >> J. DAVID مالان: نعم، لقد غيرت ق، كذلك. 272 00:11:29,360 --> 00:11:31,050 لأن ما كان يحدث في الواقع؟ 273 00:11:31,050 --> 00:11:34,130 حسنا، دعني أرى ما اذا كان يمكنني تنظيف تصل هذه الصورة، على النحو التالي. 274 00:11:34,130 --> 00:11:41,390 >> إذا ق هو، مرة أخرى، فإن كلمة غرام، أ، ب، ه، مائل، 0، وق 275 00:11:41,390 --> 00:11:44,084 سنواصل الرسم على شكل مربع هنا، ولكن ليس أكثر من عناوين. 276 00:11:44,084 --> 00:11:45,250 دعونا نتوقف عن جعل الامور. 277 00:11:45,250 --> 00:11:47,510 دعونا فقط رسم صورة لتبسيط العالم. 278 00:11:47,510 --> 00:11:52,640 >> عندما أعلن مع سلسلة ر ر، أن يخلق أن جزءا من الذاكرة. 279 00:11:52,640 --> 00:11:55,850 ساحة يحدث أن تكون 32 بت في معظم أجهزة الكمبيوتر. 280 00:11:55,850 --> 00:11:59,530 في الواقع، إذا كنت قد سمعت من أي وقت مضى ل الكمبيوتر وجود بنية 32 بت، 281 00:11:59,530 --> 00:12:03,000 حقا يتوهم-الكلام، أن مجرد يعني أنه يستخدم عناوين 32 بت. 282 00:12:03,000 --> 00:12:05,370 وباعتباره الفنية جانبا، إذا كنت تتساءل 283 00:12:05,370 --> 00:12:09,630 لماذا أجهزة الكمبيوتر القديمة، إذا كنت فعلا حاول الحساء لهم حتى مع الكثير من ذاكرة الوصول العشوائي، 284 00:12:09,630 --> 00:12:12,360 يمكن أن يكون فقط كحد أقصى أربعة غيغابايت من ذاكرة الوصول العشوائي، 285 00:12:12,360 --> 00:12:14,860 كذلك هذا ل، حرفيا، يمكن الكمبيوتر القديم الخاص بك فقط 286 00:12:14,860 --> 00:12:17,250 عد مرتفعا كما 4 مليار و 4 مليار بايت، 287 00:12:17,250 --> 00:12:20,590 لأنه كان يستخدم 32 بت أرقام للعناوين. 288 00:12:20,590 --> 00:12:23,260 >> ولكن في أي حال، في هذا سبيل المثال، القصة أبسط من ذلك بكثير. 289 00:12:23,260 --> 00:12:27,250 ر هو مجرد مؤشر آخر، أو حقا نجم شار، ويعرف أيضا باسم السلسلة. 290 00:12:27,250 --> 00:12:30,860 وكيف أريد تحديث هذه الصورة. الآن مع أن السطر الثاني من التعليمات البرمجية، 291 00:12:30,860 --> 00:12:31,950 بعد نقطة، نقطة، نقطة؟ 292 00:12:31,950 --> 00:12:35,845 عندما أفعل سلسلة يساوي ر ق منقوطة، كيف يمكن تغيير هذه الصورة؟ 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 نعم؟ 295 00:12:38,000 --> 00:12:38,916 >> الجمهور: [غير مسموع]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> J. DAVID مالان: نعم. 298 00:12:42,020 --> 00:12:42,600 بالضبط. 299 00:12:42,600 --> 00:12:45,620 أنا فقط وضعت سهم من ر مربع إلى نفس العنوان، 300 00:12:45,620 --> 00:12:47,570 أعطى نفس الحرف الأول في. 301 00:12:47,570 --> 00:12:50,850 أو من الناحية الفنية، إذا كان هذا الرجل كان لا يزال في 0x1، على 302 00:12:50,850 --> 00:12:53,052 انها كما لو كان لي وهنا 0x1 0x1 هنا. 303 00:12:53,052 --> 00:12:54,760 ولكن مرة أخرى، من يهتم حول عناوين؟ 304 00:12:54,760 --> 00:12:56,345 انها مجرد فكرة أن يهم الآن. 305 00:12:56,345 --> 00:12:57,720 لذلك هذا هو ما يحدث هنا. 306 00:12:57,720 --> 00:13:02,690 وذلك بطبيعة الحال، إذا كنت تفعل ر قوس 0، وهو تدوين مجموعة، 307 00:13:02,690 --> 00:13:05,650 من course-- وبصراحة، يبدو كما يوجد مجموعة أكثر من هنا، 308 00:13:05,650 --> 00:13:07,340 ولكن الآن هناك هذا شيء غريب. 309 00:13:07,340 --> 00:13:11,160 نعلم أن لغة البرمجة، C، يقدم لك هذه الميزة، 310 00:13:11,160 --> 00:13:14,650 حيث، حتى لو تي هي و المؤشر، أو ق هو مؤشر، 311 00:13:14,650 --> 00:13:18,050 لا يزال بإمكانك استخدام تلك مألوفة، قوس مربع مريح 312 00:13:18,050 --> 00:13:22,520 التدوين للذهاب إلى العنصر الأول، أو العنصر الثاني، أو أي عنصر 313 00:13:22,520 --> 00:13:26,130 أن هذا المؤشر يشير لأنه، من المفترض، أنه 314 00:13:26,130 --> 00:13:29,410 هو، كما في هذه الحالة، مشيرا في بعض صفيف. 315 00:13:29,410 --> 00:13:30,340 >> لذلك كيف يمكننا إصلاح هذا؟ 316 00:13:30,340 --> 00:13:33,660 بصراحة، هذا هو المكان الذي حصلت على الساحق قليلا للوهلة الأولى. 317 00:13:33,660 --> 00:13:35,340 ولكن هنا هو نسخة جديدة ومحسنة. 318 00:13:35,340 --> 00:13:37,460 >> أولا حتى، انني اتلقى التخلص من مكتبة CS50، 319 00:13:37,460 --> 00:13:41,170 فقط لفضح أن ق هو في الواقع نجم شار، مجرد مرادف. 320 00:13:41,170 --> 00:13:43,540 و t هو أيضا نجم شار. 321 00:13:43,540 --> 00:13:48,290 ولكن ما يجري على الجانب الأيمن من هذا الخط 322 00:13:48,290 --> 00:13:49,970 حيث يتم تعيين قيمة ر؟ 323 00:13:49,970 --> 00:13:50,790 >> ما هو malloc؟ 324 00:13:50,790 --> 00:13:51,630 ما strlen ذلك؟ 325 00:13:51,630 --> 00:13:52,547 ما هو sizeof (تشار)؟ 326 00:13:52,547 --> 00:13:54,380 لماذا هيك يفعل هذا خط نظرة معقدة جدا؟ 327 00:13:54,380 --> 00:13:55,713 ما كان يفعل على مستوى عال؟ 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 ما هو تخزين في ر؟ 330 00:13:57,440 --> 00:13:58,646 نعم؟ 331 00:13:58,646 --> 00:14:01,104 الجمهور: انها لتخصيص كمية معينة من مساحة الذاكرة. 332 00:14:01,104 --> 00:14:03,032 انها لتخزين وأعتقد، الرسائل [غير مسموع]. 333 00:14:03,032 --> 00:14:04,032 >> J. DAVID مالان: الكمال. 334 00:14:04,032 --> 00:14:04,540 الكمال. 335 00:14:04,540 --> 00:14:06,650 انها تخصيص بعض مقدار مساحة الذاكرة 336 00:14:06,650 --> 00:14:08,940 لتخزين، ويفترض، والرسائل المستقبلية. 337 00:14:08,940 --> 00:14:11,310 وعلى وجه الخصوص، malloc لذا تعود ماذا؟ 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> الجمهور: العودة لل[غير مسموع]؟ 340 00:14:14,851 --> 00:14:15,850 J. DAVID مالان: بالضبط. 341 00:14:15,850 --> 00:14:18,850 العودة عنوان تلك الذاكرة، وهي طريقة أخرى للقول، 342 00:14:18,850 --> 00:14:21,640 إرجاع عنوان البايت الأول من تلك الذاكرة. 343 00:14:21,640 --> 00:14:25,460 والمسؤولية تقع على لي أن نتذكر مقدار الذاكرة أنا فعلا 344 00:14:25,460 --> 00:14:27,140 المخصصة أو طلب malloc ل. 345 00:14:27,140 --> 00:14:28,384 >> الآن كم هو هذا؟ 346 00:14:28,384 --> 00:14:30,550 حسنا، على الرغم من هناك الكثير من الأقواس هنا، 347 00:14:30,550 --> 00:14:32,970 malloc يستغرق سوى حجة واحدة. 348 00:14:32,970 --> 00:14:37,250 وأنا تحديد strlen من ليالي، حتى تعطي لي العديد من بايت كما أن هناك في ليالي، 349 00:14:37,250 --> 00:14:37,800 ولكن إضافة واحد. 350 00:14:37,800 --> 00:14:38,300 لماذا؟ 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 نعم؟ 353 00:14:39,530 --> 00:14:40,840 >> الحضور: مائل 0. 354 00:14:40,840 --> 00:14:41,840 J. DAVID مالان: بالضبط. 355 00:14:41,840 --> 00:14:43,423 علينا أن نفعل القليل من التدبير المنزلي. 356 00:14:43,423 --> 00:14:45,970 ذلك لأنه لا يوجد خط مائل عكسي 0، كنا نتذكر أن أفضل. 357 00:14:45,970 --> 00:14:47,310 خلاف ذلك، نحن ذاهبون لخلق سلسلة 358 00:14:47,310 --> 00:14:49,170 لا يكون هذا فاصل خاص. 359 00:14:49,170 --> 00:14:52,640 >> وفي الوقت نفسه، لمجرد أن يكون السوبر الشرج، لدي sizeof (تشار)، 360 00:14:52,640 --> 00:14:55,730 فقط في حالة شخص يعمل بلدي كود ليس على الأجهزة CS50، 361 00:14:55,730 --> 00:14:58,220 ولكن ربما كمبيوتر آخر تماما حيث حرف 362 00:14:58,220 --> 00:15:01,470 هي بايت واحد، من خلال اتفاقية، ولكن اثنين بايت، أو شيء أكبر من ذلك. 363 00:15:01,470 --> 00:15:04,490 انها مجرد أن تكون فائقة، السوبر يعارض أخطاء. 364 00:15:04,490 --> 00:15:06,940 على الرغم من ذلك، في الواقع، انها ل على الأرجح ستكون 1. 365 00:15:06,940 --> 00:15:11,490 >> الآن، وفي الوقت نفسه، وأنا المضي قدما ونسخ سلسلة، ر قوس يساوي ط ر ق قوس. 366 00:15:11,490 --> 00:15:14,962 وأنا سوف تؤجل إلى الأسبوع الماضي كود المصدر لرؤية ما يحدث. 367 00:15:14,962 --> 00:15:17,670 لكن الوجبات الجاهزة الرئيسية، و السبب أضع رمز الآن باللون الأخضر، 368 00:15:17,670 --> 00:15:22,520 لأن ذلك السطر الأخير جدا، ر 0 قوس يساوي toupper، 369 00:15:22,520 --> 00:15:25,230 له تأثير الإستفاده الذي سلسلة؟ 370 00:15:25,230 --> 00:15:26,960 ر و / أو ق؟ 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 أن السطر الأخير من التعليمات البرمجية. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> ر فقط، لأن ما حدث هذه المرة، 375 00:15:35,560 --> 00:15:41,500 لو كنت التراجع قليلا أن الخطوة الأخيرة، ما حدث هو، عندما أدعو malloc، 376 00:15:41,500 --> 00:15:45,380 أنا أساسا الحصول على قطعة من الذاكرة وهذا هو نفس حجم الأصلي، 377 00:15:45,380 --> 00:15:47,020 لأن هذا هو الحساب فعلت. 378 00:15:47,020 --> 00:15:50,920 أنا تخزينها في ر عنوان ذلك جزءا من الذاكرة. 379 00:15:50,920 --> 00:15:53,370 على الرغم من هذا يبدو لطيفا وجميلة، لطيفة وفارغة، 380 00:15:53,370 --> 00:15:56,882 واقع وهناك، ما سنقوم تبقى الدعوة، والقيم القمامة هنا. 381 00:15:56,882 --> 00:15:59,340 أن جزءا من الذاكرة قد جدا كذلك استخدمت من قبل، 382 00:15:59,340 --> 00:16:00,940 بضع ثوان، قبل بضع دقائق. 383 00:16:00,940 --> 00:16:04,410 لذلك يمكن أن يكون هناك على الاطلاق أرقام أو خطابات هناك، فقط عن طريق الصدفة. 384 00:16:04,410 --> 00:16:08,580 لكنها ليست صالحة، حتى و نفسي ملء هذه قطعة من الذاكرة 385 00:16:08,580 --> 00:16:12,510 مع حرف الفعلية، وأنا القيام في ذلك للحلقة هناك. 386 00:16:12,510 --> 00:16:13,180 كل الحق؟ 387 00:16:13,180 --> 00:16:16,180 >> وحتى الآن، ذروة هذه الأمثلة الثلاثة 388 00:16:16,180 --> 00:16:20,730 التي كانت على ما يبدو كسر آخر مرة، هذا المثال علوي قابل للتغيير، هذه الوظيفة 389 00:16:20,730 --> 00:16:23,670 عملت بالمعنى أنها تبادلت أ و ب. 390 00:16:23,670 --> 00:16:25,620 لكنها لم تنجح في ما معنى آخر؟ 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 نعم؟ 393 00:16:28,614 --> 00:16:29,612 >> الجمهور: [غير مسموع]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> J. DAVID مالان: بالضبط. 396 00:16:36,700 --> 00:16:39,530 إذا كان لي أن استدعاء هذه الدالة من another-- على سبيل المثال، 397 00:16:39,530 --> 00:16:42,870 من دالة مثل الرئيسية، حيث لدي متغير، x و y، وأنا 398 00:16:42,870 --> 00:16:46,160 فعلت الأسبوع الماضي، نفس الرمز، وأمرر في x و y 399 00:16:46,160 --> 00:16:49,860 لمبادلة، ومن ثم استدعاء Swap-- هذا، بالطبع، هو الإصدار الصحيح 400 00:16:49,860 --> 00:16:52,220 ما نحن على وشك see-- أنه لم يعمل. 401 00:16:52,220 --> 00:16:53,770 فما هو الإصلاح؟ 402 00:16:53,770 --> 00:16:56,850 >> حسنا، لذلك لمجرد أن يكون اضحا، اسمحوا لي أن المضي قدما 403 00:16:56,850 --> 00:17:05,450 و- تعطيني ثانية واحدة هنا، ونرى إذا أنا يمكن أن تظهر لك آخر واحد، والتي 404 00:17:05,450 --> 00:17:12,464 سيكون in-- دعونا نرى ما اذا كان يمكنني العثور على هذا موافق fast-- الحقيقي، [غير مسموع]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK، ومن هناك. 407 00:17:19,240 --> 00:17:21,000 لذلك تجاهل أوامر أنا فقط الكتابة. 408 00:17:21,000 --> 00:17:23,780 أريد أن استرداد في اللحظة الأخيرة مثالا 409 00:17:23,780 --> 00:17:27,960 من المرة السابقة، التي ويسمى الآن لا تبديل. 410 00:17:27,960 --> 00:17:30,200 >> لذلك لا المبادلة حيث توقفنا في المرة السابقة، 411 00:17:30,200 --> 00:17:32,930 حيث، وتهيئة X و y إلى 1 إلى 2. 412 00:17:32,930 --> 00:17:35,840 أنا ثم استدعاء علوي قابل للتغيير، ويمر في 1 و 2. 413 00:17:35,840 --> 00:17:37,930 ثم هذه الوظيفة عملت في بعض المعنى، 414 00:17:37,930 --> 00:17:40,750 لكنه لا يملك دائمة تأثير على x و y. 415 00:17:40,750 --> 00:17:45,430 ولذلك فإن السؤال المطروح هو، كيف الآن هل نحن فعلا إصلاح هذه المشكلة؟ 416 00:17:45,430 --> 00:17:47,820 ما هو الحل في متناول اليد؟ 417 00:17:47,820 --> 00:17:53,150 >> حسنا، في swap.c، الذي هو جديد اليوم لاحظت وجود بعض الاختلافات. 418 00:17:53,150 --> 00:17:54,700 x و y هي نفسها. 419 00:17:54,700 --> 00:17:57,250 ولكن ما هو واضح مختلف عن خط 25؟ 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 ما هو الجديد هناك، إذا كنت تتذكر ما يشبه قبل الثانية؟ 422 00:18:01,715 --> 00:18:02,565 >> الجمهور: [غير مسموع]. 423 00:18:02,565 --> 00:18:03,440 >> J. DAVID مالان: نعم. 424 00:18:03,440 --> 00:18:06,680 لذلك الوات هي قطعة جديدة من جملة ليس فقط في هذا البرنامج، 425 00:18:06,680 --> 00:18:08,560 ولكن أيضا أكثر عموما في CS50. 426 00:18:08,560 --> 00:18:10,680 حتى الآن، لا أعتقد رأيناه أية أمثلة 427 00:18:10,680 --> 00:18:14,070 أو أضمر عنهم في أي التفاصيل، بخلاف، ربما، استباقي 428 00:18:14,070 --> 00:18:16,467 في القسم، وهو العطف من هذا القبيل. 429 00:18:16,467 --> 00:18:19,300 حسنا، اتضح العطف هو واحد من القطع الأخيرة من تركيب جديد 430 00:18:19,300 --> 00:18:20,174 نحن ذاهبون للتعلم. 431 00:18:20,174 --> 00:18:23,500 كل ما يعني هو عنوان بعض متغير. 432 00:18:23,500 --> 00:18:25,070 في عنوان ما لا س تعيش؟ 433 00:18:25,070 --> 00:18:26,510 ولكن ما لا عنوان ذ تعيش؟ 434 00:18:26,510 --> 00:18:28,700 لأنه إذا كان المشكلة الأساسية قبل 435 00:18:28,700 --> 00:18:32,970 وأن x و y يجري تمريرها النسخ، ما نريد حقا أن تفعل 436 00:18:32,970 --> 00:18:38,780 يتم توفير مقايضة مع مثل كنز الخريطة التي تؤدي إلى حيث x و y الواقع 437 00:18:38,780 --> 00:18:41,910 هي في RAM، بحيث المقايضة يمكن تتبع تلك الخريطة 438 00:18:41,910 --> 00:18:47,760 وتذهب إلى أي مكان x أو ذ يصادف بقعة وتغيير القيم الفعلية 1 و 2 439 00:18:47,760 --> 00:18:48,270 هناك. 440 00:18:48,270 --> 00:18:50,710 >> لذا علوي قابل للتغيير يحتاج إلى تغيير طفيف جدا. 441 00:18:50,710 --> 00:18:53,760 وللوهلة الأولى، وهذا قد يبدو قليلا مماثلة لنجم شار. 442 00:18:53,760 --> 00:18:54,850 والواقع هو. 443 00:18:54,850 --> 00:18:59,635 لذلك هو مؤشر إلى نوع ما من البيانات، على أساس هذا الجزء سلط الضوء؟ 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 حتى انها لكثافة العمليات. 446 00:19:01,620 --> 00:19:04,880 >> لذلك لم يعد كثافة العمليات، انها عنوان لكثافة العمليات. 447 00:19:04,880 --> 00:19:07,910 وبالمثل، ب تسير الآن ليكون عنوان لكثافة العمليات. 448 00:19:07,910 --> 00:19:12,470 لذلك عندما أعطي الكلمة الآن علوي قابل للتغيير من الأصل، أنا لا أذهب لإعطاء علوي قابل لل1 و 2. 449 00:19:12,470 --> 00:19:15,540 انا ذاهب الى اعطائها مثل ثور ثور شيء وشيء، 450 00:19:15,540 --> 00:19:19,820 عنوانين التي ستقود تبادل لمواقعها الفعلية 451 00:19:19,820 --> 00:19:21,310 في ذاكرة جهاز الكمبيوتر الخاص بي. 452 00:19:21,310 --> 00:19:25,580 >> وحتى الآن، يا التنفيذ المتبقية يحتاج إلى تغيير صبي. 453 00:19:25,580 --> 00:19:28,650 ما هو مختلف من الواضح الآن في هذه السطور ثلاثة من التعليمات البرمجية؟ 454 00:19:28,650 --> 00:19:31,350 هناك لعنة كل هذه النجوم مكان، كل الحق؟ 455 00:19:31,350 --> 00:19:33,014 فما الذي يحدث هنا؟ 456 00:19:33,014 --> 00:19:33,514 نعم؟ 457 00:19:33,514 --> 00:19:35,055 >> الجمهور: من الواضح [غير مسموع]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> J. DAVID مالان: بالضبط. 460 00:19:37,990 --> 00:19:41,560 حتى في هذا context-- وهذا لم يكن أفضل قرار تصميم، باعتراف الجميع، 461 00:19:41,560 --> 00:19:42,530 منذ سنوات. 462 00:19:42,530 --> 00:19:45,110 في هذا السياق، حيث عليك نجم، 463 00:19:45,110 --> 00:19:48,240 وليس لديك نوع بيانات، مثل كثافة العمليات، وعلى الفور إلى اليسار، 464 00:19:48,240 --> 00:19:53,146 بدلا من ذلك لديك علامة المساواة، بشكل واضح، في هذا السياق، عندما تقول نجمة لذلك، 465 00:19:53,146 --> 00:19:56,980 وهذا يعني الذهاب الى عنوان هذا في. 466 00:19:56,980 --> 00:19:58,870 اتبع خريطة الكنز، إذا جاز التعبير. 467 00:19:58,870 --> 00:20:01,720 >> وفي الوقت نفسه، وذلك تمشيا 37، يعني نفس الشيء. 468 00:20:01,720 --> 00:20:05,460 الانتقال إلى العنوان لذلك، ووضع ما هناك؟ 469 00:20:05,460 --> 00:20:09,520 كل ما هو في الموقع الذي تحدد ب. 470 00:20:09,520 --> 00:20:10,980 وبعبارة أخرى، انتقل إلى b. 471 00:20:10,980 --> 00:20:12,130 الحصول على تلك القيمة. 472 00:20:12,130 --> 00:20:15,620 تذهب إلى ذلك، وفقا لتساوي التوقيع، عامل التعيين، 473 00:20:15,620 --> 00:20:17,010 وضع هذه القيمة هناك. 474 00:20:17,010 --> 00:20:19,272 >> وبالمثل، فإن درجة الحرارة كثافة العمليات هي مجرد كثافة العمليات. 475 00:20:19,272 --> 00:20:20,730 شيء يحتاج إلى تغيير نحو مؤقت. 476 00:20:20,730 --> 00:20:24,810 انها مجرد كوب من الفراغ أننبرغ بالنسبة لبعض الحليب أو عصير البرتقال. 477 00:20:24,810 --> 00:20:27,630 لكنني بحاجة إلى أن أقول، انتقل إلى ب. 478 00:20:27,630 --> 00:20:31,449 الذهاب إلى تلك الوجهة و وضع القيمة في درجة الحرارة هناك. 479 00:20:31,449 --> 00:20:32,490 فماذا يحدث بعد ذلك؟ 480 00:20:32,490 --> 00:20:36,540 عندما كنت في الواقع دعوة مبادلة هذه المرة، إذا هذا صينية الأولى هنا يمثل الرئيسي، 481 00:20:36,540 --> 00:20:42,270 تمثل هذه علبة الثانية علوي قابل للتغيير، عندما أمرر العطف والعطف س ص 482 00:20:42,270 --> 00:20:47,150 من منزل لمبادلة، لمجرد أن تكون واضحة، ما هو هذا كومة إطار المتلقي؟ 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 نعم؟ 485 00:20:49,200 --> 00:20:50,180 >> الجمهور: [غير مسموع]. 486 00:20:50,180 --> 00:20:51,180 J. DAVID مالان: بالضبط. 487 00:20:51,180 --> 00:20:53,129 عنوان x و عنوان ذ. 488 00:20:53,129 --> 00:20:55,170 ويمكنك التفكير في هذه مثل عناوين البريدية. 489 00:20:55,170 --> 00:20:58,772 33 شارع أكسفورد و35 شارع أكسفورد، وكنت 490 00:20:58,772 --> 00:21:01,230 تريد نقل المبنيين التي هي في تلك المواقع. 491 00:21:01,230 --> 00:21:04,680 >> انها نوع من فكرة سخيفة، ولكن هذا كل ما نعنيه العنوان. 492 00:21:04,680 --> 00:21:07,000 مكان في العالم يمكن تجد تلك [إينتس] اثنين؟ 493 00:21:07,000 --> 00:21:09,470 مكان في العالم يمكنك العثور على تلك المباني اثنين؟ 494 00:21:09,470 --> 00:21:15,170 حتى إذا كان أخيرا، وبعد كل هذا الوقت وأنا اذهب إلى رمز مصدر اليوم وتجميع 495 00:21:15,170 --> 00:21:22,110 مبادلة وتشغيل ./swap، أخيرا، ل أول مرة ونحن في الواقع لا نرى أن 496 00:21:22,110 --> 00:21:25,330 قيمي لها في الواقع تبادلت تم بنجاح. 497 00:21:25,330 --> 00:21:30,860 والآن، يمكن أن نتخذها حتى علما هذا في، ويقول، جدب. 498 00:21:30,860 --> 00:21:32,740 >> لذلك اسمحوا لي أن أذهب إلى نفس الملف. 499 00:21:32,740 --> 00:21:35,010 اسمحوا لي المضي قدما وتشغيل جدب من ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 والآن، في مبادلة، انا ذاهب للذهاب وقبل تعيين نقطة فاصل في الأصل. 502 00:21:40,547 --> 00:21:42,630 والآن انا ذاهب للذهاب وقبل تشغيل البرنامج. 503 00:21:42,630 --> 00:21:45,810 والآن نرى قانون بلدي توقفت في هذا الخط. 504 00:21:45,810 --> 00:21:48,330 >> إذا ذهبت إلى الأمام والطباعة س، ما يجب أن أرى هنا؟ 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 انها مسألة. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 أقول مرة أخرى؟ 509 00:21:51,530 --> 00:21:52,295 >> الجمهور: [غير مسموع]. 510 00:21:52,295 --> 00:21:53,910 >> J. DAVID مالان: حتى أرقام عشوائية، ربما. 511 00:21:53,910 --> 00:21:56,010 ربما كنت محظوظا، وانها لطيفة وبسيطة، مثل 0. 512 00:21:56,010 --> 00:21:57,230 ولكن ربما هو بعض رقم عشوائي. 513 00:21:57,230 --> 00:21:58,090 في هذه الحالة، كنت محظوظا. 514 00:21:58,090 --> 00:21:59,030 يحدث ذلك لمجرد أن يكون 0. 515 00:21:59,030 --> 00:22:00,780 ولكن هو في الواقع الحظ، لأنه لا حتى أنا 516 00:22:00,780 --> 00:22:06,280 اكتب التالي ومن ثم طباعة العاشر له أن سطر من التعليمات البرمجية، خط 19، أعدم. 517 00:22:06,280 --> 00:22:10,942 >> وفي الوقت نفسه، إذا كنت اكتب التالي مرة أخرى، و الآن طباعة ذ، انا ذاهب لرؤية 2. 518 00:22:10,942 --> 00:22:13,900 الآن، إذا كنت اكتب المقبل، فإنه سيكون ل الحصول على مربكة قليلا، لأنه الآن، 519 00:22:13,900 --> 00:22:17,250 وprintf سوف تظهر على الشاشة، كما فعلت. x هو 1. 520 00:22:17,250 --> 00:22:18,606 >> دعونا نفعل ذلك مرة أخرى. 521 00:22:18,606 --> 00:22:20,480 والآن، وهنا حيث الامور مثيرة للاهتمام. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 قبل أن أعطي الكلمة علوي قابل للتغيير أو حتى خطوة الى ذلك، دعونا نلقي نظرة خاطفة صغيرة. 524 00:22:26,580 --> 00:22:28,980 x هو، مرة أخرى، 1. 525 00:22:28,980 --> 00:22:33,240 Y هو، بطبيعة الحال، العقل سريع تحقق، 2، لذلك ليس من الصعب هناك. 526 00:22:33,240 --> 00:22:35,740 ولكن ما هو العطف العاشر؟ 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 الجواب، انها تبحث نوع غير تقليدي. 529 00:22:39,350 --> 00:22:43,500 ولكن النجم كثافة العمليات بين قوسين هي مجرد طريقة الناتج المحلي الإجمالي للقول هذا هو العنوان. 530 00:22:43,500 --> 00:22:48,290 انها ليست عدد صحيح، انها مؤشر إلى كثافة العمليات، أو المعروف باسم عنوان. 531 00:22:48,290 --> 00:22:49,742 >> ما هو هذا الشيء مجنون؟ 532 00:22:49,742 --> 00:22:51,825 لم نر شيئا تماما مثل ذلك من قبل. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 لذلك هذا هو العنوان في جهاز الكمبيوتر الخاص بي ل ذاكرة من حيث x يحدث للعيش. 535 00:22:58,120 --> 00:22:59,040 انها ثور شيء. 536 00:22:59,040 --> 00:23:01,290 وهذا هو، بصراحة، لماذا لقد بدأت رسم السهام، 537 00:23:01,290 --> 00:23:03,340 بدلا من الأرقام، لأن الذي يهتم حقا 538 00:23:03,340 --> 00:23:06,890 أن كثافة العمليات الخاص بك هو على وجه الخصوص عنوان هذا أن كبير. 539 00:23:06,890 --> 00:23:12,160 لكن bffff0c4، هذه كلها في الواقع أرقام ست عشرية، 540 00:23:12,160 --> 00:23:13,720 التي هي من 0 إلى F. 541 00:23:13,720 --> 00:23:16,590 >> لذلك نحن لن يسكن جدا منذ فترة طويلة على ما هي تلك الأشياء. 542 00:23:16,590 --> 00:23:19,400 ولكن إذا كنت طباعة ذ، بالطبع، أرى 2. 543 00:23:19,400 --> 00:23:22,440 لكن العطف ذ، وأرى هذا العنوان. 544 00:23:22,440 --> 00:23:26,527 والإشعار، للفضول، إلى أي مدى هم بصرف النظر x و y؟ 545 00:23:26,527 --> 00:23:27,985 يمكنك تجاهل أكثر من عنوان. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 أربعة بايت. 548 00:23:29,920 --> 00:23:33,510 وهذا يتفق مع دينا المطالبة في وقت سابق أن كيف كبيرة هو الباحث؟ 549 00:23:33,510 --> 00:23:34,130 أربعة بايت. 550 00:23:34,130 --> 00:23:37,420 بحيث يبدو مثل بطانة كل شيء على ما يصل لطيف، كما قد نأمل في الذاكرة. 551 00:23:37,420 --> 00:23:40,010 >> وحتى الآن، دعونا فقط سريع إلى الأمام إلى نهاية هذه القصة. 552 00:23:40,010 --> 00:23:43,290 دعونا نمضي قدما واكتب الخطوة، ليغوص في وظيفة علوي قابل للتغيير. 553 00:23:43,290 --> 00:23:46,880 تلاحظ الآن، إذا أنا اكتب، انها مطابقة للعنوان السينية. 554 00:23:46,880 --> 00:23:52,130 إذا كنت من النوع B، انها متطابقة إلى عنوان ذ. 555 00:23:52,130 --> 00:23:57,020 فما ينبغي لي أن أرى إن كنت يقول، انتقل إلى عنوان ل؟ 556 00:23:57,020 --> 00:23:58,120 حتى طباعة نجم أ. 557 00:23:58,120 --> 00:24:00,130 حتى نجمة تعني الذهاب إلى هناك، في هذا السياق. 558 00:24:00,130 --> 00:24:02,730 العطف يعني ما هو عنوان. 559 00:24:02,730 --> 00:24:05,000 حتى نجمة وسيلة 1. 560 00:24:05,000 --> 00:24:09,590 ونجم الطباعة ب يعطيني 2. 561 00:24:09,590 --> 00:24:15,750 >> واسمحوا لي أن نفترض، لحظة، أن ما لا يقل عن التعليمات البرمجية التي 562 00:24:15,750 --> 00:24:18,950 تشرع في تنفيذ الآن يمكن أن يكون مسبب خلال بتلك الطريقة. 563 00:24:18,950 --> 00:24:21,150 ولكن سنقوم إعادة النظر هذه الفكرة قبل فترة طويلة. 564 00:24:21,150 --> 00:24:23,850 حتى هذا الإصدار من علوي قابل للتغيير الآن صحيح ويسمح 565 00:24:23,850 --> 00:24:26,650 لنا لتبادل هذه البيانات نوع معين. 566 00:24:26,650 --> 00:24:29,120 >> لذلك أي أسئلة ثم على علوي قابل للتغيير؟ 567 00:24:29,120 --> 00:24:29,890 على نجم؟ 568 00:24:29,890 --> 00:24:30,690 على عنوان؟ 569 00:24:30,690 --> 00:24:33,270 وسترى، مع مشكلة تعيين 4، نوعا ما، 570 00:24:33,270 --> 00:24:37,310 ولكن مشكلة مجموعة 5، بالتأكيد، كيف يمكن لهذه أشياء مفيدة والحصول على أكثر من ذلك بكثير 571 00:24:37,310 --> 00:24:39,584 بالراحة معهم، نتيجة لذلك. 572 00:24:39,584 --> 00:24:40,430 أي شيء على الإطلاق؟ 573 00:24:40,430 --> 00:24:40,930 كل الحق. 574 00:24:40,930 --> 00:24:44,350 حتى malloc هو، مرة أخرى، هذه الوظيفة يخصص فقط الذاكرة، الذاكرة 575 00:24:44,350 --> 00:24:45,330 التخصيص. 576 00:24:45,330 --> 00:24:47,024 ولماذا هذا مفيد؟ 577 00:24:47,024 --> 00:24:48,940 حسنا، كل هذا الوقت، كنت أستعمل malloc. 578 00:24:48,940 --> 00:24:52,230 إذا كنت تنظر الآن كيف getString الأعمال، ويفترض، انها 579 00:24:52,230 --> 00:24:56,140 تم يسأل شخص عن قطعة من الذاكرة، في أي وقت يكتب المستخدم سلسلة 580 00:24:56,140 --> 00:24:59,040 في، لأننا بالتأكيد لا يعرف، والموظفين CS50، 581 00:24:59,040 --> 00:25:02,710 كيف تلك السلاسل كبيرة بأن البشر ذاهبون لكتابة قد يكون. 582 00:25:02,710 --> 00:25:07,910 >> لذلك دعونا، لأول مرة، تبدأ قشر الظهر كيفية عمل مكتبة CS50، 583 00:25:07,910 --> 00:25:10,990 عن طريق بضعة أمثلة التي من شأنها أن تؤدي بنا هناك. 584 00:25:10,990 --> 00:25:15,300 حتى لو كنت فتح gedit وفتح scanf 0، 585 00:25:15,300 --> 00:25:17,055 نحن ذاهبون لرؤية البرمجية التالية. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0، متاحة على الموقع الإلكتروني لل اليوم، لديها عدد قليل نسبيا من الأسطر من التعليمات البرمجية 588 00:25:23,530 --> 00:25:25,351 هنا، من 14 إلى 20. 589 00:25:25,351 --> 00:25:26,600 ودعونا نرى ما تقوم به. 590 00:25:26,600 --> 00:25:28,920 ويعلن عدد صحيح، ودعا السينية. 591 00:25:28,920 --> 00:25:30,850 وتقول شيئا مثل، عدد من فضلك. 592 00:25:30,850 --> 00:25:33,940 والآن تقول، scanf٪ ط، و خ. 593 00:25:33,940 --> 00:25:35,620 لذلك هناك مجموعة من الاشياء الجديدة هناك. 594 00:25:35,620 --> 00:25:38,420 >> لكن scanf، يمكنك النوع من التفكير من كنقيض للprintf. 595 00:25:38,420 --> 00:25:40,090 printf، بالطبع، يطبع على الشاشة. 596 00:25:40,090 --> 00:25:44,410 scanf نوع من المسح من المستخدم لوحة المفاتيح ما اذا كان قد كتبته. 597 00:25:44,410 --> 00:25:46,550 >> ط٪ هو تماما مثل printf. 598 00:25:46,550 --> 00:25:49,410 هذا يعني نتوقع مستخدم لكتابة عدد صحيح. 599 00:25:49,410 --> 00:25:52,820 والآن، لماذا تعتقد أنا يمكن تمرير scanf والعاشر؟ 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 إذا كان الغرض في حياة scanf هو الحصول على شيء من المستخدم، 602 00:25:57,770 --> 00:26:02,480 ما هو معنى فمررها، والعاشر، والآن؟ 603 00:26:02,480 --> 00:26:02,980 نعم؟ 604 00:26:02,980 --> 00:26:03,896 >> الجمهور: [غير مسموع]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 J. DAVID مالان: بالضبط. 607 00:26:06,540 --> 00:26:12,900 كل ما أنا، الإنسان، اكتب في، ومدخلات بلدي سوف يتم حفظها في هذا الموقع. 608 00:26:12,900 --> 00:26:17,660 انها ليست كافية، تذكر، فقط ل تمر في العاشر، لأننا قد رأينا بالفعل، 609 00:26:17,660 --> 00:26:21,630 أي الوقت الذي تمر مجرد متغير الخام، مثل كثافة العمليات، إلى حد وظيفة أخرى، 610 00:26:21,630 --> 00:26:25,640 بالتأكيد، فإنه يمكن تغيير ذلك متغير، ولكن ليس بشكل دائم. 611 00:26:25,640 --> 00:26:27,360 لا يمكن أن يكون لها تأثير على الأصل. 612 00:26:27,360 --> 00:26:29,420 فإنه يمكن فقط تغيير النسخة المحلية الخاصة بها. 613 00:26:29,420 --> 00:26:32,560 ولكن إذا، بدلا من ذلك، كنت لا تعطيني كثافة العمليات الفعلية، 614 00:26:32,560 --> 00:26:36,640 ولكن هل تعطيني توجيهات ل أن كثافة العمليات، والآن، يجري scanf، 615 00:26:36,640 --> 00:26:41,050 بالتأكيد، لا أستطيع أن اتبع معالجة ووضع هناك عدد 616 00:26:41,050 --> 00:26:43,280 ولذلك عليك الحصول على أنها كذلك. 617 00:26:43,280 --> 00:26:45,120 >> لذلك عند تشغيل هذا البرنامج، دعونا نرى. 618 00:26:45,120 --> 00:26:49,660 جعل scanf 0 نقطة مائل، scanf 0. 619 00:26:49,660 --> 00:26:54,030 وإذا كنت الآن اكتب رقما مثل 50، وذلك بفضل ل50. 620 00:26:54,030 --> 00:26:58,150 إذا أنا الآن اكتب رقما مثل سالب 1، لالسلبي 1. 621 00:26:58,150 --> 00:27:04,200 أنا الآن اكتب رقما مثل 1.5، HM. 622 00:27:04,200 --> 00:27:06,030 لماذا برنامجي تجاهل لي؟ 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 حسنا، لأنه ببساطة، قلت أن نتوقع كثافة العمليات فقط. 625 00:27:09,880 --> 00:27:10,380 كل الحق. 626 00:27:10,380 --> 00:27:11,630 لذلك هذا هو نسخة واحدة من هذا. 627 00:27:11,630 --> 00:27:16,600 لنأخذ الامور الشق و أقترح أن هذا ليس جيدا. 628 00:27:16,600 --> 00:27:20,530 ويكمن هنا مثال بسيط جدا كيف يمكننا أن نبدأ كتابة التعليمات البرمجية 629 00:27:20,530 --> 00:27:24,450 أن الآخرين يمكن أن يستغلها أو حل وسط عن طريق القيام بأشياء سيئة. 630 00:27:24,450 --> 00:27:28,336 حتى الخط 16، على غرار ذلك في الروح لمن قبل، 631 00:27:28,336 --> 00:27:29,960 ولكن أنا لا يعلن ذلك الباحث هذه المرة. 632 00:27:29,960 --> 00:27:32,970 أنا معلنا أنه شار نجوم، ويعرف أيضا باسم السلسلة. 633 00:27:32,970 --> 00:27:35,190 >> ولكن ماذا يعني ذلك حقا؟ 634 00:27:35,190 --> 00:27:38,790 حتى لو كنت لا تحديد address-- و أنا وصفه بأنه تعسفي، العازلة، 635 00:27:38,790 --> 00:27:43,370 ولكن يمكن أن نسميها S، لتكون simple-- ثم أفعل ذلك، وشرح لي، 636 00:27:43,370 --> 00:27:48,630 إذا كنت تستطيع، استنادا إلى سابقة المنطق، ما تقوم به scanf في خط 18، 637 00:27:48,630 --> 00:27:55,000 إذا تمريرة٪ ق والعازلة، الذي هو عنوان؟ 638 00:27:55,000 --> 00:27:58,210 ما هو scanf، إذا قمت بتطبيق نفس المنطق بالضبط كما نسخة 0، 639 00:27:58,210 --> 00:28:00,640 سنحاول القيام به هنا، عندما شيء أنواع المستخدم في؟ 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 نعم؟ 642 00:28:03,409 --> 00:28:04,407 >> الجمهور: [غير مسموع]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> J. DAVID مالان: بالضبط. 645 00:28:08,890 --> 00:28:11,577 Scanf، من خلال منطق في وقت سابق، هو ذاهب الى اتخاذ سلسلة 646 00:28:11,577 --> 00:28:13,410 أن الإنسان مكتوب in-- انها الآن سلسلة، 647 00:28:13,410 --> 00:28:15,790 انها ليست عددا، ويفترض، إذا كان الشخص cooperates-- 648 00:28:15,790 --> 00:28:19,310 وانه ذاهب الى محاولة لوضع هذا سلسلة في الذاكرة في أي عنوان 649 00:28:19,310 --> 00:28:20,340 يحدد العازلة. 650 00:28:20,340 --> 00:28:23,870 وهذا شيء عظيم، لأن عازلة بل المقصود أن يكون عنوان. 651 00:28:23,870 --> 00:28:30,470 >> ولكن أزعم هذا البرنامج هو عربات التي تجرها الدواب في طريقة خطيرة جدا، لأن ما هي القيمة 652 00:28:30,470 --> 00:28:31,330 العازلة افتراضيا؟ 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 ما أنا في تهيئة؟ 655 00:28:34,790 --> 00:28:35,770 ما جزءا من الذاكرة؟ 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 لدي لا، أليس كذلك؟ 658 00:28:38,620 --> 00:28:42,265 >> حتى على الرغم من أنني قد خصصت نجمة شار وهذا ما لم يعد يسمى ثانية، 659 00:28:42,265 --> 00:28:48,030 انه دعا بدلا من ذلك، حتى buffer-- دعونا رسم اسم متغير 660 00:28:48,030 --> 00:28:53,380 الآن كما buffer-- إذا أنا لم دعا getString أو malloc هنا، 661 00:28:53,380 --> 00:28:56,030 هذا يعني فعليا أن المخزن هو مجرد بعض القيمة القمامة. 662 00:28:56,030 --> 00:28:57,030 >> الآن ماذا يعني ذلك؟ 663 00:28:57,030 --> 00:29:00,220 وهو ما يعني أن قلت scanf نتوقع أن يكون هناك سلسلة من المستخدم. 664 00:29:00,220 --> 00:29:01,300 وأنت تعرف لماذا؟ 665 00:29:01,300 --> 00:29:03,883 أيا كان هذا الشيء يشير علي: وأنا رسم علامة استفهام، 666 00:29:03,883 --> 00:29:07,060 ولكن في الواقع، فإنه سيكون شيء من هذا القبيل OX1، 2، 3، أليس كذلك؟ 667 00:29:07,060 --> 00:29:10,730 انها بعض قيمة وهمية ذلك تماما يحدث أن يكون هناك من قبل. 668 00:29:10,730 --> 00:29:13,440 لذلك بعبارة أخرى، انها كما لو المخزن المؤقت فقط 669 00:29:13,440 --> 00:29:16,180 مشيرا إلى شيء في الذاكرة. 670 00:29:16,180 --> 00:29:17,610 ليس لدي أي فكرة ما. 671 00:29:17,610 --> 00:29:24,130 >> حتى لو كنت اكتب في غابي الآن، انه سيكون في محاولة لوضع ز-A-B-E / 0 هناك. 672 00:29:24,130 --> 00:29:25,530 ولكن من يدري ما هو؟ 673 00:29:25,530 --> 00:29:27,480 وفي الماضي، أي الوقت حاولنا تلمس 674 00:29:27,480 --> 00:29:29,770 الذاكرة التي لا تنتمي بالنسبة لنا، ما الذي حدث؟ 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 أو تقريبا في كل مرة. 677 00:29:32,870 --> 00:29:34,310 خطأ تجزئة، أليس كذلك؟ 678 00:29:34,310 --> 00:29:37,829 >> هذا السهم، ليس لدي أي فكرة حيث انها التأشير. انها مجرد بعض قيمة عشوائية. 679 00:29:37,829 --> 00:29:40,370 وبالطبع، إذا كنت تفسير قيمة عشوائية كعنوان، 680 00:29:40,370 --> 00:29:42,610 وأنت تسير للذهاب الى بعض الوجهة عشوائية. 681 00:29:42,610 --> 00:29:46,810 لذلك قد تحطم بالفعل غابي برنامجي في هذه الحالة هنا. 682 00:29:46,810 --> 00:29:50,600 >> فماذا يمكننا أن نفعل ذلك على النحو تقريبا سيئة؟ 683 00:29:50,600 --> 00:29:52,660 النظر في هذا الثلث و المثال الأخير من scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 هذا الإصدار هو أفضل بأي معنى؟ 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 إذا كنت مرتاحا مع المشكلة السابقة، وهذا هو أفضل. 688 00:30:01,400 --> 00:30:02,250 لماذا؟ 689 00:30:02,250 --> 00:30:03,250 >> الجمهور: [غير مسموع]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 J. DAVID مالان: جيد. 692 00:30:07,110 --> 00:30:09,970 حتى هذه الحالة من خط 16 هو أفضل، بمعنى 693 00:30:09,970 --> 00:30:12,030 أننا صراحة تخصيص بعض الذاكرة. 694 00:30:12,030 --> 00:30:14,190 نحن لا تستخدم malloc، نستخدمه في الأسبوع 2 695 00:30:14,190 --> 00:30:16,060 نهج من مجرد إعلان صفيف. 696 00:30:16,060 --> 00:30:18,130 وقلنا قبل ذلك سلسلة هو مجرد مجموعة من الأحرف، 697 00:30:18,130 --> 00:30:19,690 لذلك هذا أمر مشروع تماما. 698 00:30:19,690 --> 00:30:22,910 لكنه، بطبيعة الحال، كما لاحظ، حجم ثابت، 16. 699 00:30:22,910 --> 00:30:25,440 >> لذلك هذا البرنامج هو آمنة تماما، إذا أنا اكتب 700 00:30:25,440 --> 00:30:29,760 في سلاسل حرف واحد، وهما شخصية سلاسل، 15 سلاسل الأحرف. 701 00:30:29,760 --> 00:30:34,970 ولكن بمجرد أن تبدأ بكتابة 16، 17، 18، 1،000 سلاسل الأحرف، 702 00:30:34,970 --> 00:30:37,390 حيث أن السلسلة لن ينتهي؟ 703 00:30:37,390 --> 00:30:39,570 انها لن ينتهي هنا جزئيا. 704 00:30:39,570 --> 00:30:42,820 ولكن بعد ذلك من يدري ماذا هو أبعد من حدود 705 00:30:42,820 --> 00:30:44,270 هذه مجموعة معينة؟ 706 00:30:44,270 --> 00:30:48,015 >> فهو كما لو أن عندي أعلن 16 صناديق هنا. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 وذلك بدلا من استخلاص كل 16، وسوف نقوم مجرد التظاهر بأن رسمتها 16. 709 00:30:52,690 --> 00:30:56,540 ولكن إذا كنت ثم محاولة قراءة سلسلة هذا وقتا أطول، مثل 50 حرفا، 710 00:30:56,540 --> 00:31:01,270 انا ذاهب الى البدء في وضع أ، ب، ج، د، س، ص، ض. 711 00:31:01,270 --> 00:31:04,916 وهذا يفترض بعض شريحة الذاكرة الأخرى 712 00:31:04,916 --> 00:31:06,790 ذلك، مرة أخرى، قد يسبب برنامجي لتحطم الطائرة، 713 00:31:06,790 --> 00:31:10,600 لأنني لم يطلب ل أي شيء أكثر من مجرد 16 بايت. 714 00:31:10,600 --> 00:31:12,260 >> لذا من يهتم؟ 715 00:31:12,260 --> 00:31:13,880 حسنا، ها هي مكتبة CS50. 716 00:31:13,880 --> 00:31:17,220 والأكثر من هذا هو مجرد مثل تعليمات حتى أعلى. 717 00:31:17,220 --> 00:31:21,670 المكتبة CS50، كل هذا الوقت، وقد كان هذا الخط في خط 52. 718 00:31:21,670 --> 00:31:23,680 رأيناه الرموز المميزة ل typedef، أو سترى الرموز المميزة ل typedef 719 00:31:23,680 --> 00:31:27,930 في pset 4، مما يخلق فقط مرادف حيث نجم شار يمكن أن يكون أكثر 720 00:31:27,930 --> 00:31:29,290 مجرد يشار إلى السلسلة. 721 00:31:29,290 --> 00:31:31,540 لذلك هذا هو واحد من قليلة عجلات التدريب 722 00:31:31,540 --> 00:31:34,120 استخدمنا سرا تحت غطاء محرك السيارة. 723 00:31:34,120 --> 00:31:36,490 >> وفي الوقت نفسه، وهنا وظيفة، getchar. 724 00:31:36,490 --> 00:31:38,190 الآن على ما يبدو، وليس هناك هيئة لها. 725 00:31:38,190 --> 00:31:40,273 وفي الواقع، إذا أظل التمرير، وأنا لا فعلا 726 00:31:40,273 --> 00:31:42,080 نرى أي تطبيقات من هذه الوظائف. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 كما شيك التعقل، لماذا هذا؟ 729 00:31:45,516 --> 00:31:46,795 >> الجمهور: [غير مسموع]. 730 00:31:46,795 --> 00:31:47,670 J. DAVID مالان: نعم. 731 00:31:47,670 --> 00:31:48,950 لذلك هذا هو ملف الرأس. 732 00:31:48,950 --> 00:31:52,520 ورأس الملفات تحتوي على النماذج، بالإضافة إلى بعض الأشياء الأخرى، على ما يبدو، 733 00:31:52,520 --> 00:31:53,780 مثل typedefs. 734 00:31:53,780 --> 00:31:56,910 ولكن في CS50.c التي قمنا لم تعط لك صريح، 735 00:31:56,910 --> 00:32:02,100 ولكن كان في كل الأجهزة CS50 هذه المرة، في عمق المجلدات لها، 736 00:32:02,100 --> 00:32:04,990 تلاحظ أن هناك ككل مجموعة من وظائف هنا. 737 00:32:04,990 --> 00:32:06,720 >> في الواقع، دعونا انتقل لأسفل. 738 00:32:06,720 --> 00:32:08,810 دعونا تجاهل معظمهم، في الوقت الراهن. 739 00:32:08,810 --> 00:32:12,670 ولكن انزل الى getInt وانظر كيف يعمل getInt. 740 00:32:12,670 --> 00:32:13,890 حتى هنا هو getInt. 741 00:32:13,890 --> 00:32:17,727 وإذا كنت من أي وقت مضى تهتم حقا كيف تحصل الباحث يعمل، وهنا هو وثائقه. 742 00:32:17,727 --> 00:32:19,560 وبين الأشياء تقول انه يخبرك 743 00:32:19,560 --> 00:32:21,340 ما نطاقات من القيم يمكن أن يعود. 744 00:32:21,340 --> 00:32:24,400 انها سلبية بشكل جوهري 2 مليار دولار إلى إيجابي 2 مليار دولار، يعطي أو يأخذ. 745 00:32:24,400 --> 00:32:26,420 >> وكما تبين، كل هذا الوقت، على الرغم من أننا قد قمت أبدا 746 00:32:26,420 --> 00:32:28,570 كنت قد تحقق بالنسبة له، إذا كان هناك شيء يذهب على نحو خاطئ، 747 00:32:28,570 --> 00:32:30,680 اتضح أن جميع هذه المرة، لديه getInt 748 00:32:30,680 --> 00:32:33,600 تم إرجاع خاص ثابتة، غير فارغة، 749 00:32:33,600 --> 00:32:36,760 بل int_max، وهو اتفاقية مجرد مبرمج. 750 00:32:36,760 --> 00:32:38,846 فهذا يعني هنا هو قيمة خاصة. 751 00:32:38,846 --> 00:32:41,470 تأكد للتحقق من هذا، فقط في حالة حدوث خطأ ما. 752 00:32:41,470 --> 00:32:43,261 ولكن لدينا أبدا ازعجت مع أنه حتى الآن، 753 00:32:43,261 --> 00:32:45,200 لأنه مرة أخرى، وهذا يهدف إلى تبسيط. 754 00:32:45,200 --> 00:32:46,950 >> ولكن كيف يمكن الحصول على تنفيذها getInt؟ 755 00:32:46,950 --> 00:32:48,450 حسنا، واحد، فإنه يأخذ بدون وسائط. 756 00:32:48,450 --> 00:32:49,390 نحن نعرف ذلك. 757 00:32:49,390 --> 00:32:50,820 تقوم بإرجاع عدد صحيح. 758 00:32:50,820 --> 00:32:51,950 نحن نعرف ذلك. 759 00:32:51,950 --> 00:32:54,460 حتى كيف يعمل تحت غطاء محرك السيارة؟ 760 00:32:54,460 --> 00:32:58,290 >> ولذلك لا يوجد على ما يبدو لانهائية حلقة، على الأقل في مظهر واحد. 761 00:32:58,290 --> 00:33:00,290 لاحظ أن نستخدمه getString. 762 00:33:00,290 --> 00:33:04,000 بحيث مثيرة للاهتمام. getInt وتدعو وظيفة الخاصة بنا، getString. 763 00:33:04,000 --> 00:33:05,645 والآن لماذا قد تكون هذه الحالة؟ 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 لماذا أنا يجري دفاعية هنا في خط 165؟ 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 ما يمكن أن يحدث في خط 164، لمجرد أن يكون واضحا؟ 768 00:33:15,639 --> 00:33:16,930 انها نفس الجواب كما كان من قبل. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 قد يكون فقط من الذاكرة. 771 00:33:20,089 --> 00:33:23,130 شيء يذهب على نحو خاطئ مع getString، علينا أن نكون قادرين على التعامل مع ذلك. 772 00:33:23,130 --> 00:33:27,070 والسبب لا يعود لاغية و ذلك، من الناحية الفنية، هو مؤشر لاغية. 773 00:33:27,070 --> 00:33:29,120 getInt لديه للعودة عدد صحيح. 774 00:33:29,120 --> 00:33:31,060 حتى لقد قمت تعسفا قررت، أساسا، 775 00:33:31,060 --> 00:33:34,600 أن 2 مليار دولار، يعطي أو يأخذ، يجري أن تكون القيمة الخاصة التي يمكنني أبدا 776 00:33:34,600 --> 00:33:35,970 في الواقع الحصول من المستخدم. 777 00:33:35,970 --> 00:33:39,930 انها مجرد قيمة واحدة سأقوم لإضاعة لتمثيل رمز خطأ. 778 00:33:39,930 --> 00:33:41,540 >> وحتى الآن، الأمور قليلا نزوة. 779 00:33:41,540 --> 00:33:44,670 وانها ليست تماما نفس وظيفة كما كان من قبل، لكنها مشابهة جدا. 780 00:33:44,670 --> 00:33:50,120 لذلك تلاحظ، أعلن هنا، في خط 172، كلا من ن كثافة العمليات وشار ج. 781 00:33:50,120 --> 00:33:53,600 وبعد ذلك استخدام هذا الخط غير تقليدي، sscanf، الذي اتضح 782 00:33:53,600 --> 00:33:55,990 لا تتفحص سلسلة من لوحة المفاتيح. 783 00:33:55,990 --> 00:33:59,226 انها تقف سلسلة القائمة التي قام المستخدم بكتابتها بالفعل. 784 00:33:59,226 --> 00:34:02,100 لذلك أنا بالفعل دعا getString، التي يعني لدي سلسلة في الذاكرة. 785 00:34:02,100 --> 00:34:05,020 sscanf هو ما كنت استدعاء دالة التوزيع. 786 00:34:05,020 --> 00:34:07,760 يبدو في سلسلة لدي كتبته في، حرف بحرف، 787 00:34:07,760 --> 00:34:09,250 ويفعل شيئا مفيدا. 788 00:34:09,250 --> 00:34:10,969 يتم تخزين هذه السلسلة في الخط. 789 00:34:10,969 --> 00:34:13,560 وأنا أعلم أن فقط عن طريق الذهاب عمل نسخة احتياطية وهنا قائلا، أوه، حسنا، 790 00:34:13,560 --> 00:34:15,143 دعوت أنه لا ق هذا الوقت، ولكن الخط. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> والآن هذا هو مختلفة قليلا. 793 00:34:18,080 --> 00:34:22,480 ولكن هذا يعني عمليا، لأسباب سنقوم موجة نوعا ما في أيدينا اليوم، 794 00:34:22,480 --> 00:34:26,070 أننا فحص ل معرفة ما إذا كان المستخدم في كتابة 795 00:34:26,070 --> 00:34:29,909 والباحث، وربما حرف آخر. 796 00:34:29,909 --> 00:34:33,610 إذا كان المستخدم كتابتها في كثافة، انها ل الذهاب الى خزنها في ن، لأنني 797 00:34:33,610 --> 00:34:36,739 ويمر ذلك من خلال عنوان و خدعة جديدة رأيناه اليوم. 798 00:34:36,739 --> 00:34:41,570 إذا كتبته المستخدم أيضا في مثل 123x، التي خ 799 00:34:41,570 --> 00:34:45,060 يجري في نهاية المطاف ل رسالة في الطابع ج. 800 00:34:45,060 --> 00:34:48,739 >> الآن اتضح أن sscanf سوف تقول لي، بذكاء، 801 00:34:48,739 --> 00:34:54,750 كم عدد المتغيرات وsscanf قادرة بنجاح لملء الفراغ. 802 00:34:54,750 --> 00:34:58,770 ذلك من خلال هذا المنطق، إذا كانت وظيفة أنا وتنفيذ getInt، 803 00:34:58,770 --> 00:35:00,900 ولكن أنا فحص، يحتمل، للمستخدم 804 00:35:00,900 --> 00:35:04,190 قد كتبته في عدد صحيح تليها شيء آخر، 805 00:35:04,190 --> 00:35:08,580 ماذا أريد من sscanf قيمة الإرجاع حقا أن تكون؟ 806 00:35:08,580 --> 00:35:10,950 إذا كان الغرض هو الحصول على فقط عدد صحيح من المستخدم؟ 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> حتى إذا sscanf العوائد 2، ماذا يعني ذلك؟ 809 00:35:19,300 --> 00:35:21,660 المستخدم في كتابة شيء من هذا القبيل، حرفيا، 810 00:35:21,660 --> 00:35:24,770 123x، الذي هو مجرد هراء. 811 00:35:24,770 --> 00:35:27,490 انها حالة خطأ، و أريد للتحقق من ذلك. 812 00:35:27,490 --> 00:35:32,960 >> حتى إذا قام المستخدم بكتابة هذا في، من خلال هذا المنطق، ماذا sscanf العودة، 813 00:35:32,960 --> 00:35:33,740 ستقول؟ 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 حتى انها سوف تعود 2، ل 123 ستذهب هنا، 816 00:35:39,130 --> 00:35:41,580 وس سوف ينتهي هنا. 817 00:35:41,580 --> 00:35:43,970 ولكن أنا لا أريد س للحصول على شغل. 818 00:35:43,970 --> 00:35:48,580 أريد أن sscanf أن ينجح فقط في ملء أول من متغيراته. 819 00:35:48,580 --> 00:35:52,490 وولهذا السبب أنا تريد sscanf للعودة 1. 820 00:35:52,490 --> 00:35:55,750 >> وإذا كان هذا هو قليلا على رأسه لحظة، وهذا شيء طيب تماما. 821 00:35:55,750 --> 00:36:00,030 تحقيق على الرغم من أن واحدا من قيم getInt وgetString 822 00:36:00,030 --> 00:36:03,630 هو أن نقوم به من هيك الكثير من خطأ التحقق من هذا القبيل حتى 823 00:36:03,630 --> 00:36:07,130 التي، حتى الآن، يمكنك الى حد كبير اكتب أي شيء على لوحة المفاتيح، 824 00:36:07,130 --> 00:36:08,490 ونحن سوف قبض عليه. 825 00:36:08,490 --> 00:36:10,592 ونحن بالتأكيد، و الموظفين، وبالتأكيد لن 826 00:36:10,592 --> 00:36:13,300 يكون مصدر خلل في حياتك برنامج، لأننا دفاعيا 827 00:36:13,300 --> 00:36:16,270 التحقق من وجود كل من غبي الأشياء التي يمكن للمستخدم القيام به، 828 00:36:16,270 --> 00:36:18,900 مثل كتابة سلسلة، عندما كنت تريد حقا كثافة العمليات. 829 00:36:18,900 --> 00:36:21,350 وذلك لnow-- سنأتي إلى هذا من قبل long-- 830 00:36:21,350 --> 00:36:23,710 ولكن كل هذا الوقت، getString وgetInt ديك 831 00:36:23,710 --> 00:36:29,950 كانت تحت غطاء محرك السيارة باستخدام هذا الفكرة الأساسية من عناوين الذاكرة. 832 00:36:29,950 --> 00:36:32,580 >> وحتى الآن، دعونا نجعل الأمور أكثر قليلا سهل الاستعمال. 833 00:36:32,580 --> 00:36:38,740 وكما تذكرون، من بينكي الماضي time-- إذا الماوس بلدي سوف cooperate-- ذلك 834 00:36:38,740 --> 00:36:42,560 كان لدينا هذا الرمز، الذي بصراحة، لا معنى لها إلى حد ما. 835 00:36:42,560 --> 00:36:45,330 هذا الرمز يحقق شيئا مفيدة، ولكن كان المثال 836 00:36:45,330 --> 00:36:48,330 أن أستاذ Parlante تستخدم من أجل تمثيل 837 00:36:48,330 --> 00:36:51,840 ما يجري في برنامج تنطوي على الذاكرة. 838 00:36:51,840 --> 00:36:54,850 >> لذلك دعونا روايتها هذه قصة سوبر لفترة وجيزة. 839 00:36:54,850 --> 00:36:58,720 هذين الخطين الأولى، في اللغة الإنجليزية، لا ما، وكنت أقول؟ 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 معقول فقط في الإنسان، ولكن قليلا المصطلحات الفنية، واتخاذ طعنة. 842 00:37:05,430 --> 00:37:06,346 الجمهور: [غير مسموع]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> J. DAVID مالان: حسنا، كنت إقامة عناوين لجهودكم المتغيرات x و ذ. 845 00:37:11,080 --> 00:37:15,520 ليس تماما، لأن x و y ليست المتغيرات بالمعنى التقليدي. 846 00:37:15,520 --> 00:37:18,054 x و y هي عناوين سيتم تخزين أو العنوان. 847 00:37:18,054 --> 00:37:19,220 لذلك دعونا نحاول هذا مرة أخرى. 848 00:37:19,220 --> 00:37:21,010 ليست بداية سيئة، وإن كان. 849 00:37:21,010 --> 00:37:21,510 نعم؟ 850 00:37:21,510 --> 00:37:22,426 >> الجمهور: [غير مسموع]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 J. DAVID مالان: جيد. 853 00:37:24,840 --> 00:37:26,173 أعتقد أن هذا قليلا أكثر نظافة. 854 00:37:26,173 --> 00:37:28,630 إعلان اثنين من المؤشرات، وهما الأعداد الصحيحة. 855 00:37:28,630 --> 00:37:30,150 ونحن دعوتهم x و y. 856 00:37:30,150 --> 00:37:32,790 أو إذا كنا رسم هذا كصورة، مرة أخرى، 857 00:37:32,790 --> 00:37:36,410 أذكر ببساطة أن جميع نقوم به مع أن السطر الأول 858 00:37:36,410 --> 00:37:39,690 يتم رسم مربع مثل هذا، مع بعض القيمة القمامة فيه، 859 00:37:39,690 --> 00:37:41,920 واصفا إياه X، ثم مربع أخرى من هذا القبيل، 860 00:37:41,920 --> 00:37:43,880 مع بعض القيمة القمامة في ذلك، واصفا إياه ذ. 861 00:37:43,880 --> 00:37:45,810 لقد أعلن اثنين المؤشرات التي في نهاية المطاف 862 00:37:45,810 --> 00:37:47,860 سيتم تخزين عنوان لكثافة العمليات. 863 00:37:47,860 --> 00:37:49,170 لذلك هذا كل ما هناك. 864 00:37:49,170 --> 00:37:53,290 >> حتى متى بينكي هذا، الطين بدا تماما مثل هذا. 865 00:37:53,290 --> 00:37:55,350 ونيك مجرد نوع من اختتم السهام، 866 00:37:55,350 --> 00:37:57,590 كما لو أنها لم تكن لافتا في أي مكان على وجه الخصوص، لأنهم فقط 867 00:37:57,590 --> 00:37:58,250 قيم القمامة. 868 00:37:58,250 --> 00:38:01,670 انهم لا تهيئة صراحة في أي مكان على وجه الخصوص. 869 00:38:01,670 --> 00:38:03,980 >> الآن السطر التالي من كان رمز، تذكر، هذا. 870 00:38:03,980 --> 00:38:07,510 حتى في معقول سهل الاستعمال، ولكن اللغة الإنجليزية الفنية إلى حد ما، 871 00:38:07,510 --> 00:38:09,790 ما هو هذا الخط من يفعل الرمز؟ 872 00:38:09,790 --> 00:38:10,391 نعم؟ 873 00:38:10,391 --> 00:38:11,333 >> الجمهور: [غير مسموع]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> J. DAVID مالان: الكمال. 876 00:38:13,950 --> 00:38:17,016 انها تخصيص جزء من الذاكرة هذا هو حجم وكثافة العمليات. 877 00:38:17,016 --> 00:38:18,140 وهذا هو نصف الحل. 878 00:38:18,140 --> 00:38:20,056 أجبت الحق نصف التعبير. 879 00:38:20,056 --> 00:38:22,473 ما يحدث على الجانب الأيسر من علامة المساواة؟ 880 00:38:22,473 --> 00:38:22,972 نعم؟ 881 00:38:22,972 --> 00:38:24,814 الجمهور: والمتنازل لهم أن x متغير؟ 882 00:38:24,814 --> 00:38:27,690 >> J. DAVID مالان: والمتنازل لهم أن x متغير. 883 00:38:27,690 --> 00:38:31,650 لذلك باختصار، يخصص الجانب الأيمن ذاكرة كافية لتخزين عدد صحيح. 884 00:38:31,650 --> 00:38:34,150 ولكن على وجه التحديد malloc إرجاع عنوان 885 00:38:34,150 --> 00:38:37,270 ذلك جزء من الذاكرة التي قمت اقترح فقط يحصل المخزنة في x. 886 00:38:37,270 --> 00:38:42,560 >> ذلك ما فعله نيك آخر مرة مع بينكي هو انه سحب هذا المؤشر من والخزف و 887 00:38:42,560 --> 00:38:46,820 أن نشير الآن إلى قطعة بيضاء من الذاكرة هذا هو مساو لحجم وكثافة العمليات. 888 00:38:46,820 --> 00:38:49,360 وبالفعل، وهذا يعني لتمثيل أربعة بايت. 889 00:38:49,360 --> 00:38:55,310 >> الآن، السطر التالي من التعليمات البرمجية فعل هذا، نجم س يحصل 42. 890 00:38:55,310 --> 00:38:58,530 حتى 42 واضح ومباشر على الجانب الأيمن، معنى الحياة. 891 00:38:58,530 --> 00:39:00,500 الجانب الأيسر، نجم س يعني ماذا؟ 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 يمكن أن يكون أيضا gone-- هذا موافق. 894 00:39:03,280 --> 00:39:04,220 موافق. 895 00:39:04,220 --> 00:39:06,875 >> الجمهور: في الأساس، اذهب إلى [غير مسموع] 896 00:39:06,875 --> 00:39:07,750 J. DAVID مالان: جيد. 897 00:39:07,750 --> 00:39:08,760 الجمهور: [غير مسموع]. 898 00:39:08,760 --> 00:39:09,760 J. DAVID مالان: بالضبط. 899 00:39:09,760 --> 00:39:11,979 الجانب الأيسر يعني الذهاب إلى x. 900 00:39:11,979 --> 00:39:12,520 x هو العنوان. 901 00:39:12,520 --> 00:39:15,520 انها مثل 33 شارع أكسفورد، أو OX1. 902 00:39:15,520 --> 00:39:18,690 ونجم س يعني يذهب إلى أن ومعالجة وضع ما هناك؟ 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> ذلك الواقع، هذا هو بالضبط ما فعله نيك. 905 00:39:21,290 --> 00:39:23,740 بدأ معها من قبل، أساسا، عقليا 906 00:39:23,740 --> 00:39:26,270 مشيرا بإصبع الاتهام إلى س، في أعقاب السهم 907 00:39:26,270 --> 00:39:30,670 إلى مربع أبيض على اليد اليمنى الجانب، ويضع رقم 42 هناك. 908 00:39:30,670 --> 00:39:34,120 ولكن بعد ذلك حصلت الأمور خطورة قليلا، أليس كذلك؟ 909 00:39:34,120 --> 00:39:35,860 على وشك أن يفقد رأسه في بينكي. 910 00:39:35,860 --> 00:39:39,465 >> نجمة Y يساوي 13، والحظ السيئ، يعني ماذا؟ 911 00:39:39,465 --> 00:39:43,620 حتى وسائل ذ Star الذهاب إلى العنوان في ص. 912 00:39:43,620 --> 00:39:45,630 ولكن ما هو العنوان في ذ؟ 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 حسنا، انها قيمة القمامة، أليس كذلك؟ 915 00:39:49,440 --> 00:39:50,800 وجهت بأنها علامة استفهام. 916 00:39:50,800 --> 00:39:54,850 ولفت نيك بأنها السهم ضافر. 917 00:39:54,850 --> 00:39:59,600 وبمجرد محاولة ل القيام نجمة ذ، قائلا نذهب الى هناك، 918 00:39:59,600 --> 00:40:03,872 ولكن ليس هناك شرعية عنوان، انها بعض موقع مزيف، 919 00:40:03,872 --> 00:40:05,080 البرنامج سوف تحطم الطائرة. 920 00:40:05,080 --> 00:40:08,580 ورئيس بينكي وسوف لتطير هنا، كما فعلت. 921 00:40:08,580 --> 00:40:12,130 >> حتى في نهاية المطاف، وهذا البرنامج كان مجرد خطأ خارج مسطح. 922 00:40:12,130 --> 00:40:13,540 كان برنامج عربات التي تجرها الدواب. 923 00:40:13,540 --> 00:40:14,760 وأنها بحاجة إلى أن تكون ثابتة. 924 00:40:14,760 --> 00:40:18,260 والطريقة الوحيدة، حقا، لاصلاحها سيكون، على سبيل المثال، هذا الخط، 925 00:40:18,260 --> 00:40:21,010 ونحن لم تحصل حتى، ل تحطمت البرنامج في وقت قريب جدا. 926 00:40:21,010 --> 00:40:26,170 ولكن إذا كنا لإصلاح هذا، ما تأثير لا يفعل ذ خ متساوية لها؟ 927 00:40:26,170 --> 00:40:30,010 كذلك، فإنه يشير أساسا y في مهما كانت قيمة x غير افتا في. 928 00:40:30,010 --> 00:40:32,430 >> حتى في قصة نيك، أو قصة بينكي، سواء 929 00:40:32,430 --> 00:40:34,640 x و y تم التأشير عليه على قطعة بيضاء من الذاكرة، 930 00:40:34,640 --> 00:40:38,300 بحيث أنه، أخيرا، عند لا نجم ذ يساوي 13 مرة أخرى، 931 00:40:38,300 --> 00:40:43,080 كنت في نهاية المطاف في وضع 13 الموقع المناسب. 932 00:40:43,080 --> 00:40:47,640 لذلك كل من هذه الخطوط هي تماما مشروعة، عدا هذا واحد، 933 00:40:47,640 --> 00:40:51,730 عندما حدث ذلك قبل أن تعيين الواقع ذ بعض القيمة. 934 00:40:51,730 --> 00:40:54,290 >> الآن والحمد لله، كنت لا أن العقل من خلال جميع 935 00:40:54,290 --> 00:40:56,560 هذه الأنواع من القضايا بنفسك. 936 00:40:56,560 --> 00:40:59,310 اسمحوا لي المضي قدما وفتح نافذة طرفية هنا 937 00:40:59,310 --> 00:41:03,050 وفتح، لمجرد لحظة، برنامج السوبر القصير الذي 938 00:41:03,050 --> 00:41:04,360 هو نوع من العبث أيضا. 939 00:41:04,360 --> 00:41:05,152 انها قبيحة. 940 00:41:05,152 --> 00:41:06,610 أنه لا يحقق أي شيء مفيد. 941 00:41:06,610 --> 00:41:10,180 ولكنها لا تثبت القضايا من الذاكرة، لذلك دعونا نلقي نظرة. 942 00:41:10,180 --> 00:41:11,830 >> الرئيسية، سوبر بسيطة. 943 00:41:11,830 --> 00:41:14,830 يبدو أنه يدعو وظيفة، و ثم يعود 0. 944 00:41:14,830 --> 00:41:16,310 انها نوع من الصعب أن تصل هذه الفوضى. 945 00:41:16,310 --> 00:41:18,540 لذلك الأصل هو جيد جدا، حتى الآن. 946 00:41:18,540 --> 00:41:20,100 >> حتى و هي إشكالية. 947 00:41:20,100 --> 00:41:22,120 وفقط لم يضع الكثير الجهد في اسمها 948 00:41:22,120 --> 00:41:23,990 هنا، للحفاظ على التركيز على التعليمات البرمجية. 949 00:41:23,990 --> 00:41:25,740 و لديه خطين. 950 00:41:25,740 --> 00:41:27,610 ودعونا نرى ما يحدث الآن فصاعدا. 951 00:41:27,610 --> 00:41:29,840 ذلك من جهة here-- واسمحوا لي أن 952 00:41:29,840 --> 00:41:32,680 هذا يتفق مع سابقة example-- من جهة، 953 00:41:32,680 --> 00:41:35,830 الجانب الأيسر هو فعل ما، في اللغة الإنجليزية؟ 954 00:41:35,830 --> 00:41:36,493 انها is-- 955 00:41:36,493 --> 00:41:37,701 الجمهور: إنشاء المؤشر. 956 00:41:37,701 --> 00:41:40,830 J. DAVID مالان: إنشاء مؤشر إلى int واصفا إياه X. 957 00:41:40,830 --> 00:41:43,789 حتى انها لخلق واحدة من تلك الصناديق وأظل الرسم على الشاشة التي تعمل باللمس. 958 00:41:43,789 --> 00:41:45,913 والآن، على اليد اليمنى الجانب، malloc، بالطبع، 959 00:41:45,913 --> 00:41:47,420 تم تخصيص جزء من الذاكرة. 960 00:41:47,420 --> 00:41:49,989 ومجرد أن يكون واضحا، كيف الكثير من الذاكرة هي أنه على ما يبدو 961 00:41:49,989 --> 00:41:52,030 تخصيص، إذا كنت فقط نوع من تفعل الرياضيات هنا؟ 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> لذلك فمن 40 بايت. 964 00:41:54,040 --> 00:41:57,400 وأنا أعلم أن فقط لأنني أعرف ل كثافة العمليات، على الأجهزة CS50، على الأقل، 965 00:41:57,400 --> 00:41:58,060 هو أربعة بايت. 966 00:41:58,060 --> 00:41:59,610 لذلك 10 مرة 4 هو 40. 967 00:41:59,610 --> 00:42:04,924 لذلك هذا هو تخزين وس، عنوان للخروج الأول من 40 [إينتس] أن 968 00:42:04,924 --> 00:42:07,340 تم تخصيص مساحة الوراء، إلى الوراء، إلى الوراء، إلى الوراء. 969 00:42:07,340 --> 00:42:08,470 >> وهذا ما هو مفتاح حول malloc. 970 00:42:08,470 --> 00:42:11,261 لأنها لا تأخذ ذاكرة صغيرة هنا، قليلا هنا، قليلا هنا. 971 00:42:11,261 --> 00:42:14,220 فهو يوفر لك قطعة واحدة من الذاكرة، متاخم، من التشغيل 972 00:42:14,220 --> 00:42:15,240 النظام. 973 00:42:15,240 --> 00:42:18,500 >> الآن ماذا عن هذا، × القوس 10 يساوي 0؟ 974 00:42:18,500 --> 00:42:19,470 خط التعسفي من التعليمات البرمجية. 975 00:42:19,470 --> 00:42:21,100 أنه لا يحقق أي شيء مفيد. 976 00:42:21,100 --> 00:42:26,128 ولكن من المثير للاهتمام، لأن العاشر قوس 10--؟ 977 00:42:26,128 --> 00:42:26,628 نعم؟ 978 00:42:26,628 --> 00:42:27,912 >> الجمهور: [غير مسموع]؟ 979 00:42:27,912 --> 00:42:30,500 >> J. DAVID مالان: × القوس 10 ليس من الضروري أن تكون لاغية. 980 00:42:30,500 --> 00:42:35,070 التفاصيل اغية يأتي دور فقط مع السلاسل، في نهاية سلسلة. 981 00:42:35,070 --> 00:42:36,700 ولكن فكرة جيدة. 982 00:42:36,700 --> 00:42:39,615 >> كيف كبيرة هو هذه المجموعة، حتى على الرغم من أنني قد خصصت 40 بايت؟ 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 انها من 0 إلى تسعة، أليس كذلك؟ 985 00:42:43,690 --> 00:42:45,120 انها 10 [إينتس]، المجموع. 986 00:42:45,120 --> 00:42:48,790 40 بايت، ولكن 10 [إينتس]، فهرسة من 0 إلى 0. 987 00:42:48,790 --> 00:42:50,930 >> فما هو ذلك x قوس 10؟ 988 00:42:50,930 --> 00:42:53,090 انها فعلا بعض قيمة القمامة مجهولة. 989 00:42:53,090 --> 00:42:54,780 انها الذاكرة التي لا تنتمي لي. 990 00:42:54,780 --> 00:42:59,650 أنا لا ينبغي أن لمس بايت رقم 41، 42، 43، 44. 991 00:42:59,650 --> 00:43:01,420 انا ذاهب قليلا بعيدا جدا. 992 00:43:01,420 --> 00:43:04,490 >> وفي الواقع، إذا كنت تشغيل هذا البرنامج، فإنه قد تحطم بشكل جيد جدا. 993 00:43:04,490 --> 00:43:05,790 لكن في بعض الأحيان، وسوف نحصل محظوظ. 994 00:43:05,790 --> 00:43:07,706 وذلك فقط لإثبات this-- وبصراحة، 995 00:43:07,706 --> 00:43:11,000 أنت لا تعرف أبدا قبل لا it-- دعونا تشغيل هذا. 996 00:43:11,000 --> 00:43:12,480 لم تتحطم في الواقع. 997 00:43:12,480 --> 00:43:15,032 >> ولكن إذا قمت بتغيير هذا، ل المثال، أن يكون مثل 1،000، 998 00:43:15,032 --> 00:43:16,740 لجعل هذا حقا متعمدا، دعونا نرى 999 00:43:16,740 --> 00:43:18,710 اذا كنا نستطيع الحصول عليه إلى تعطل هذا الوقت. 1000 00:43:18,710 --> 00:43:20,070 OK، لم تحطم. 1001 00:43:20,070 --> 00:43:22,600 كيف حوالي 100،000؟ 1002 00:43:22,600 --> 00:43:25,000 دعونا تغييره، ثم أعد عليه الآن. 1003 00:43:25,000 --> 00:43:25,500 موافق. 1004 00:43:25,500 --> 00:43:25,960 تفو. 1005 00:43:25,960 --> 00:43:26,460 كل الحق. 1006 00:43:26,460 --> 00:43:29,090 لذلك على ما يبدو، مرة أخرى، هذه شرائح الذاكرة، إذا جاز التعبير، 1007 00:43:29,090 --> 00:43:32,660 هي كبيرة بشكل معقول، حتى نتمكن من الحصول على الحظ مرارا وتكرارا. 1008 00:43:32,660 --> 00:43:36,510 لكن في نهاية المطاف، وبمجرد الحصول سخيف وتذهب بعيدا حقا على الشاشة، 1009 00:43:36,510 --> 00:43:39,120 كنت على اتصال الذاكرة حقا، حقا لا ينتمي لك. 1010 00:43:39,120 --> 00:43:40,870 >> ولكن بصراحة، هذه أنواع من الحشرات تسير 1011 00:43:40,870 --> 00:43:43,020 أن تكون أصعب وأصعب لمعرفة بنفسك. 1012 00:43:43,020 --> 00:43:47,880 ولكن ولله الحمد، والمبرمجين، لدينا الأدوات التي تسمح لنا أن نفعل هذا بالنسبة لنا. 1013 00:43:47,880 --> 00:43:50,140 لذلك هذا هو، ربما، واحد من أبشع برامج، 1014 00:43:50,140 --> 00:43:52,060 حتى أقبح من الناتج جدب و. 1015 00:43:52,060 --> 00:43:55,670 ولكن لديها دائما خط أو اثنين التي هي مفيدة عظمى. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind هو البرنامج الذي يساعد لا تصحيح البرنامج، في حد ذاته، 1017 00:44:00,310 --> 00:44:03,500 ولكن تجد المتعلقة بالذاكرة مشاكل، على وجه التحديد. 1018 00:44:03,500 --> 00:44:07,590 فإنه سيتم تلقائيا تشغيل التعليمات البرمجية لل كنت والبحث عن اثنين على الأقل من الأشياء. 1019 00:44:07,590 --> 00:44:10,680 واحد، لم تفعل شيئا عرضي مثل الذاكرة اتصال 1020 00:44:10,680 --> 00:44:11,980 التي لا تنتمي لك؟ 1021 00:44:11,980 --> 00:44:13,590 وسوف تساعدك على العثور على تلك الحالات. 1022 00:44:13,590 --> 00:44:15,710 >> واثنين، وسوف يساعد تجد ما يسمى 1023 00:44:15,710 --> 00:44:19,270 تسرب الذاكرة، التي لدينا تجاهل تماما، بسذاجة، 1024 00:44:19,270 --> 00:44:21,380 لبعض الوقت وبسعادة. 1025 00:44:21,380 --> 00:44:23,140 ولكن كما تبين، كل هذه المرة، كلما 1026 00:44:23,140 --> 00:44:26,620 كنت قد دعا في getString الكثير من برامجنا، 1027 00:44:26,620 --> 00:44:28,930 كنت طالبا في التشغيل نظام للذاكرة، 1028 00:44:28,930 --> 00:44:32,070 ولكن عليك أن تذكر أي من أي وقت مضى يعطيها 1029 00:44:32,070 --> 00:44:36,169 مرة أخرى، والقيام unalloc، أو مجانا، كما يطلق عليه. 1030 00:44:36,169 --> 00:44:37,960 لا، لأننا أبدا يطلب منك القيام بذلك. 1031 00:44:37,960 --> 00:44:41,250 >> ولكن كل هذا الوقت، وبرامج كنت قد تم الكتابة في C 1032 00:44:41,250 --> 00:44:43,800 وقد تسرب الذاكرة، يسأل التشغيل 1033 00:44:43,800 --> 00:44:46,190 نظام أكثر وأكثر الذاكرة للجمل وغيرها، 1034 00:44:46,190 --> 00:44:47,870 ولكن لم يسلم مرة أخرى. 1035 00:44:47,870 --> 00:44:50,080 والآن هذا هو قليلا من التبسيط، 1036 00:44:50,080 --> 00:44:53,550 ولكن إذا كنت قد أي وقت مضى تشغيل ماك الخاص بك أو جهاز الكمبيوتر الخاص بك لبعض الوقت، وفتح 1037 00:44:53,550 --> 00:44:55,790 الكثير من البرامج، ربما إغلاق البرامج، 1038 00:44:55,790 --> 00:44:57,795 وعلى الرغم من أن لديك لم تحطمت جهاز الكمبيوتر، 1039 00:44:57,795 --> 00:45:01,690 الأمر يزداد أبطأ كثيرا، كما لو انها حقا 1040 00:45:01,690 --> 00:45:04,290 تستخدم الكثير من الذاكرة أو الموارد، على الرغم من، 1041 00:45:04,290 --> 00:45:06,070 إذا لم تكن حتى لمس لوحة المفاتيح، 1042 00:45:06,070 --> 00:45:10,430 يمكن أن be-- كنه لم يستطع always-- أن تكون البرامج التي تقوم بتشغيل 1043 00:45:10,430 --> 00:45:11,920 هم أنفسهم تسرب الذاكرة. 1044 00:45:11,920 --> 00:45:15,645 وهم يتساءلون نظام التشغيل لأكثر و المزيد من الذاكرة، ولكن نسيان ذلك، 1045 00:45:15,645 --> 00:45:18,470 ليس في الواقع استخدامه، ولكن لذا أخذ الذاكرة بعيدا 1046 00:45:18,470 --> 00:45:20,500 من البرامج الأخرى التي قد ترغب في ذلك. 1047 00:45:20,500 --> 00:45:23,940 لذلك هذا هو التفسير الشائع. 1048 00:45:23,940 --> 00:45:25,940 الآن هنا حيث لValgrind الإخراج هو تماما 1049 00:45:25,940 --> 00:45:29,290 فظيعة لتلك أقل وأكثر راحة على حد سواء. 1050 00:45:29,290 --> 00:45:32,690 ولكن مثيرة للاهتمام الاشياء هو الحق حتى هنا. 1051 00:45:32,690 --> 00:45:37,060 انها تقول لي الكتابة غير صالح لل حجم أربعة يحدث في هذا البرنامج، 1052 00:45:37,060 --> 00:45:40,640 على وجه الخصوص، في سطر 21 من memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> إذا ذهبت إلى خط 21، HM، هناك بالفعل هو الكتابة غير صالح من حجم الأربعة. 1054 00:45:45,450 --> 00:45:46,250 لماذا حجم أربعة؟ 1055 00:45:46,250 --> 00:45:49,500 حسنا، هذا number-- و يمكن أن يكون anything-- هو عدد صحيح. 1056 00:45:49,500 --> 00:45:50,450 لذلك فمن أربعة بايت. 1057 00:45:50,450 --> 00:45:52,550 لذلك أنا أضع أربعة بايت حيث أنهم لا ينتمون. 1058 00:45:52,550 --> 00:45:55,080 هذا ما Valgrind في الواقع هو قول لي. 1059 00:45:55,080 --> 00:45:57,600 وعلاوة على ذلك، فإنه سيتم أيضا قل لي، كما سنرى، 1060 00:45:57,600 --> 00:46:01,490 كما تقوم بتشغيل هذا في pset في المستقبل، إذا و عندما كنت قد تسربت الذاكرة، والتي كانت في الواقع 1061 00:46:01,490 --> 00:46:05,300 لدي، لأنني طالب malloc، ولكن لدي يست في الواقع 1062 00:46:05,300 --> 00:46:08,010 ودعا، في هذه الحالة، مجانا، وسنرى في نهاية المطاف 1063 00:46:08,010 --> 00:46:09,830 هو عكس malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> وحتى الآن، كما أعتقد، على سبيل المثال النهائي. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 لذلك هذا واحد هو أكثر من ذلك بقليل غامضة، لكنه ربما 1068 00:46:16,690 --> 00:46:19,180 أكبر سبب ل كن حذرا مع الذاكرة، 1069 00:46:19,180 --> 00:46:24,490 والسبب في أن العديد من البرامج و / أو خوادم الويب، حتى يومنا هذا، 1070 00:46:24,490 --> 00:46:28,200 تم الاستيلاء عليها من قبل الأشرار في مكان ما على شبكة الانترنت الذين هم بطريقة أو بأخرى 1071 00:46:28,200 --> 00:46:33,390 إرسال حزم وهمية على الخادم الخاص بك في محاولة لتقديم تنازلات حساباتك، 1072 00:46:33,390 --> 00:46:36,420 أو أخذ البيانات الخاصة بك، أو مجرد يستغرق عادة أكثر من آلة. 1073 00:46:36,420 --> 00:46:38,910 تجاوز سعة المخزن المؤقت، كما يوحي اسمها، وسيلة 1074 00:46:38,910 --> 00:46:40,740 لا تفيض عدد صحيح، ولكن العازلة. 1075 00:46:40,740 --> 00:46:43,490 ومنطقة عازلة هو مجرد وسيلة الهوى للقول انها حفنة من الذاكرة. 1076 00:46:43,490 --> 00:46:46,710 >> وبالفعل، اتصلت سلسلة قبل العازلة، بدلا من ق. 1077 00:46:46,710 --> 00:46:49,234 لأنه إذا انها العازلة، مثل بالمعنى يوتيوب، 1078 00:46:49,234 --> 00:46:52,400 أو في أي وقت كنت أشاهد شريط فيديو، كنت قد رأيت التخزين المؤقت كلمة، 1079 00:46:52,400 --> 00:46:53,040 نقطة، نقطة، نقطة. 1080 00:46:53,040 --> 00:46:54,240 إنه أمر مزعج بشكل لا يصدق. 1081 00:46:54,240 --> 00:46:55,990 وهذا يعني فقط أن لاعب الفيديو 1082 00:46:55,990 --> 00:46:58,710 تحاول تحميل الكثير بايت، والكثير من وحدات البايت 1083 00:46:58,710 --> 00:47:00,170 من الفيديو من الإنترنت. 1084 00:47:00,170 --> 00:47:02,920 لكنها بطيئة، لذلك يحاول لتحميل حفنة منهم 1085 00:47:02,920 --> 00:47:06,430 لملء منطقة عازلة، وعاء، بحيث لديك ما يكفي من وحدات البايت التي في وسعها ثم 1086 00:47:06,430 --> 00:47:09,174 تظهر لك الفيديو، دون التوقف باستمرار. 1087 00:47:09,174 --> 00:47:11,340 ولكن تبين، يمكنك لديك عازلة لهذه كبيرة. 1088 00:47:11,340 --> 00:47:15,710 ولكن في محاولة لوضع هذه البيانات في الكثير ذلك، وأشياء سيئة جدا يمكن أن يحدث. 1089 00:47:15,710 --> 00:47:22,780 هكذا على سبيل المثال، دعونا ننظر في هذه دعابة النهائية للمثال. 1090 00:47:22,780 --> 00:47:24,720 هذا هو برنامج آخر التي، للوهلة الأولى، 1091 00:47:24,720 --> 00:47:26,540 لا تفعل شيئا مفيدا عظمى. 1092 00:47:26,540 --> 00:47:29,590 انها حصلت على وظيفتها الرئيسية أن يدعو تلك الوظيفة، و. 1093 00:47:29,590 --> 00:47:36,640 وتلك الوظيفة، و، هنا، لديه مجموعة شار، ودعا ج، من حجم 12. 1094 00:47:36,640 --> 00:47:39,340 ثم انها تستخدم هذا دعت وظيفة جديدة strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> اتضح أنه مع هذا بسيط، خط بسيط من التعليمات البرمجية، فقط خطين، 1097 00:47:45,190 --> 00:47:49,130 حققنا برنامجي كله، وبالتالي، يا الكمبيوتر بأكمله، 1098 00:47:49,130 --> 00:47:54,000 ولدي حساب المستخدم، وبلدي من الصعب يحتمل أن تكون عرضة لدفع أي شخص 1099 00:47:54,000 --> 00:47:58,170 من يدري وجيدة بما يكفي لتشغيل هذا البرنامج مع سطر الأوامر معين 1100 00:47:58,170 --> 00:47:58,900 حجة. 1101 00:47:58,900 --> 00:48:03,400 وبعبارة أخرى، إذا كان هذا الرجل سيئة يضع داخل argvargv [1] عن طريق كتابة 1102 00:48:03,400 --> 00:48:08,750 في لوحة المفاتيح وضعت خصيصا للغاية سلسلة، وليس اي بي سي، 123، ولكن أساسا، 1103 00:48:08,750 --> 00:48:15,180 الرموز الثنائية التي تمثل قابل للتنفيذ رمز، برنامج انه او انها كتب، 1104 00:48:15,180 --> 00:48:19,190 مع هذا البرنامج البسيط، الذي هو ممثل الآلاف من البرامج 1105 00:48:19,190 --> 00:48:23,610 التي هي عرضة بالمثل، نحسب، انه أو انها يمكن حذف جميع في نهاية المطاف 1106 00:48:23,610 --> 00:48:26,680 الملفات الموجودة على القرص الصلب، والحصول على امض موجه بحيث انه أو انها يمكن 1107 00:48:26,680 --> 00:48:30,170 اكتب الأوامر من تلقاء نفسها، البريد الإلكتروني جميع الملفات لنفسي. 1108 00:48:30,170 --> 00:48:34,660 أي شيء يمكنني القيام به، وقال انه أو أنها يمكن أن تفعل مع هذا الرمز. 1109 00:48:34,660 --> 00:48:36,575 >> ونحن لن يحل تماما هذه بعد. 1110 00:48:36,575 --> 00:48:38,700 وفي الواقع، انه سيكون ل إشراك صورة صغيرة 1111 00:48:38,700 --> 00:48:41,470 من هذا القبيل، والتي سنقوم قريبا لفهم كل ما هو أفضل. 1112 00:48:41,470 --> 00:48:44,480 ولكن لهذا اليوم، دعونا تنتهي يوم ما هو، ونأمل، وأكثر قليلا 1113 00:48:44,480 --> 00:48:48,360 مفهومة XKCD نكتة، حتى نستأنف في المرة القادمة. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 كل الحق. 1116 00:48:51,600 --> 00:48:53,446 نراكم يوم الاربعاء. 1117 00:48:53,446 --> 00:48:54,754 >> [عزف الموسيقى] 1118 00:48:54,754 --> 00:48:57,790 >> المتحدث: والآن، عميق الأفكار، من خلال Daven فارنهام. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 الذاكرة هي مثل القفز الى كومة من أوراق ذهبية بعد ظهر يوم الاحد. 1121 00:49:04,770 --> 00:49:09,000 تهب الرياح، القذف الخاصة بك hair-- أوه، افتقد أيام when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [ضحك] 1124 00:49:12,650 --> 00:49:13,750