[عزف الموسيقى] J. DAVID مالان: حسنا. هذا هو CS50. وهذا هو بداية الأسبوع 5. وكما كنت قد لاحظت، بعض المواد هو الحصول على أكثر من ذلك بقليل مجمع، وأكثر كثافة قليلة. وأنه من السهل جدا، وخاصة إذا لقد كنت في العادة لبعض الوقت، أن تحاول خربشات أسفل أكثر أي شيء نقوم به، ونحن نقول في الصف. ولكن ندرك، وهذا هو ربما لا يكون النهج التربوي المثالي لتعلم هذا النوع من المواد، والمواد بشكل عام. ولذا فإننا سعداء ل يعلن الخاصة Gheng أن CS50 ل بدأت غونغ لإعداد مجموعة من الملاحظات الكنسي للدورة، على أمل وهو أن، واحد، هذه تخدم ليس فقط بوصفها المرجعية ومورد لمراجعة المواد والذهاب مرة أخرى من خلال المواد التي قد يكون لها هرب لك في المرة الاولى، ولكن أيضا بحيث رؤوسكم يمكن أن يكون أكثر يصل من أسفل، عندما يأتي الوقت لإلقاء محاضرة، بحيث قد المشاركة أكثر بعناية، و مقابل أكثر scribbly. وقال مع ذلك، ما ستجده في الموقع هو وثائق مثل هذا. والإشعار، في أعلى اليسار، وهناك ليس فقط جدول المحتويات، ولكن أيضا رموز الوقت الذي سوف تقفز لك على الفور إلى الجزء المناسب في الفيديو على الانترنت. وما قام به تشانغ هنا هو، في الأساس، وثقت ما حدث في هذه محاضرة معينة. والعديد من المحاضرات ل بالفعل حاليا مع هذا URL. وسوف نستمر في إضافة ما تبقى من تلك التي في نهاية هذا الاسبوع، لذلك الاستفادة من هذا المورد. ذلك دون مزيد من اللغط، بدأنا قشر العودة الطبقة التي كانت سلسلة لبعض الوقت. وماذا نقول سلسلة هو في الواقع الأسبوع الماضي؟ نجمة شار ذلك. ونجم شار، حسنا، ما لم يعني ذلك حقا؟ حسنا، كل هذا الوقت، إذا قمنا تم استدعاء دالة، مثل getString، وتخزين ما يسمى عودة قيمة getString في variable-- انه دعا ق نوع string-- كنا الكتابة وسطر من التعليمات البرمجية إلى هناك أعلاه. وانها فقط عندما أرى بلدي الكتابة اليدوية تضخيم هنا يمكنني تدرك مدى بشاعة هذا. ومع ذلك، دعونا نفترض أن، على الجانب الأيمن هو، مع ذلك، معقول تصوير ما كان يحدث كل هذا الوقت مع getString. getString، بالطبع، يحصل على السلسلة. ولكن ماذا يعني ذلك حقا؟ وهذا يعني انه يحصل على قطعة من الذاكرة من نظام التشغيل بواسطة استدعاء دالة، ودعا malloc. ولكن أكثر على ذلك لاحقا. وبعد ذلك بملء أن جزءا من الذاكرة مع خطابات للمستخدم كتبته في، تليها، بالطبع، حرف فارغة، أو مائل صفر في النهاية. وفي الوقت نفسه، وعلى الجانب الأيسر من هذه القصة، كل هذا الوقت، لقد تم الإعلان عن المتغير، مثل ليالي. وهذا المتغير هو ما الآن ستبدأ استدعاء المؤشر. انها ليست داخل المربع منها وضعنا سلسلة، Daven، في حد ذاته، بل وضعنا في هذا الميدان مربع على اليسار ماذا بالضبط؟ نعم؟ الجمهور: عنوان حيث انها تقع في الذاكرة. J. DAVID مالان: بالضبط. عنوان حيث Daven يقع في الذاكرة. وليس فيها كل من Daven يقع، في حد ذاته، ولكن على وجه التحديد عنوان لماذا؟ نعم؟ الجمهور: الحرف الأول. J. DAVID مالان: الحرف الأول في Daven، والتي، في هذه الحالة، أنا اقترح كان تعسفيا وغير واقعي 1، OX1، وهو ما يعني فقط رقم سداسي عشري من 1. بل انه سيكون على الارجح أن يكون عدد أكبر بكثير أننا قد رسم مع 0X كما بادئة، يمثل حرف عشري. ولأننا لسنا في حاجة لمعرفة أين بقية الأحرف من Daven هي، بسبب ما تصميم بسيط القرار الذي اتخذ منذ سنوات عديدة؟ نعم؟ الجمهور: خط مائل عكسي 0. J. DAVID مالان: نعم، بالضبط. مائل 0 يسمح لك، وإن كان في الزمن الخطي، لاجتياز سلسلة، المشي من اليسار إلى اليمين، مع حلقة for، أو حين حلقة، أو شيء من هذا القبيل ذلك، وتحديد، أوه، هنا هي نهاية هذه السلسلة معينة. حتى مع مجرد عنوان في بداية سلسلة، يمكننا الوصول إلى مجمل ذلك، لأن كل هذا الوقت، وكانت سلسلة مجرد نجمة شار. لذلك فمن المؤكد غرامة الاستمرار في استخدام المكتبة CS50 وهذا التجريد، إذا جاز التعبير، ولكن سنقوم تبدأ لنرى بالضبط ما كان يحدث تحت هذا طوال الوقت. لذلك قد أذكر هذا المثال، أيضا، من وقت الماضي، مقارنة 0، التي لا تقارن في الواقع. ولكن بدأنا في حل هذه. لكن ربما لتجديد، ربما أنا مصلحة شخص في الفيل الوردي اليوم، قدمت أيضا من قبل تشانغ؟ كيف عنك في الجبهة؟ [غير مسموع]. تأتي على ما يصل. وفي هذه الأثناء، كما يمكنك الخروج، دعونا تنظر لمجرد لحظة ما هذا الرمز كان يقوم به فعلا. انها تعلن متغيرين تصل أعلى، ق و ر، والدعوة getString. هذا ليس برنامج سهل الاستعمال جدا، لأنه لا اقول لكم ما يجب القيام به. ولكن دعونا نفترض أننا فقط التركيز على جزء العصير. ثم نقوم به، وإذا ق يساوي يساوي ر، ينبغي أن نقول printf، كتبته نفس الشيء. مرحبا. ما اسمك؟ جانيل: جانيل. J. DAVID مالان: جانيل، لطيف لمقابلتك. لذلك التحدي الخاص بك في يد لهذا الفيل هو أول رسم لنا صورة ما أن تكون ممثلة في تلك الأولين خطوط. حتى ق و ر قد يكون كيف ممثلة على الشاشة؟ ويمكنك استدراجه فقط مع إصبعك على هذه الشاشة الكبيرة. ولذلك لا يوجد نصفين ل كل جانب من هذه المعادلة. لذلك هناك ق على اليسار، و ثم getString على اليمين. ثم هناك ر على اليسار، ثم getString على اليمين. فكيف يمكن أن نبدأ رسم الصورة التي يمثل ما يجري هنا في الذاكرة، وكنت أقول؟ واسمحوا لي أن تسمح لك شرح ما تفعلونه كما تذهب. جانيل: OK. حسنا، أولا، أنه سيطلب لك للحصول على سلسلة الإدخال. وسيكون store-- أوه، آسف. J. DAVID مالان: OK. جيدة. وهذا ما يسمى ماذا؟ أوه، حسنا. الاستمرار. لم أكن أقصد أن يقطع. جانيل: عذرا. لذلك سيكون مساهمة ذلك في عنوان of-- غير متأكد. لا أستطيع أن أتذكر بالضبط عدد و ولكن أعتقد أنه كان بدءا 0. J. DAVID مالان: هذا كل الحق، لأنني جعلت من أرقام تصل، لذلك ليس هناك إجابة صحيحة. جانيل: بدءا من 0 القوس. J. DAVID مالان: حسنا، العنصر 0. بالتأكيد. جانيل: ثم إذا كان مثل مجرد letter-- اثنين J. DAVID مالان: حسنا، إليك. جانيل: إذا العنصر 0، و ثم العنصر 1 أو العنصر 2. J. DAVID مالان: والتي قطعة من الصورة أنت تقترب الآن؟ الدعوة إلى getString؟ أو إعلان ق؟ جانيل: الإعلان من ليالي، على ما أعتقد. أوه، getString، لأنه من شأنه يتم إدخالها في كل [؟ المنطقة. ؟] J. DAVID مالان: جيد. بالضبط. حتى وإن كان هذا على نحو فعال بإرجاع صفيف، استدعاء، عندما نعود سلسلة، يمكننا مؤشر إلى أن سلسلة باستخدام 01 و 2. من الناحية الفنية، وهذه هي على الأرجح ممثلة عناوين الفردية، ولكن هذا شيء طيب. لذلك أفترض، إذا كنت تستطيع الصيام فقط تحيل إلى حيث توقفنا آخر مرة، إذا كان أحد كانت سلاسل ز أ ب ه، 0 مائل، مما يمثل غابي المدخلات، وكيف يمكن نحن نمثل ق الآن؟ إذا كانت هذه هي الذاكرة التي من تم إرجاعها بواسطة getString؟ جانيل: هل سيكون ممثلة قوس؟ J. DAVID مالان: بواسطة قوس؟ حسنا، لا. دعنا نقول فقط، بالصور، اسمحوا لي فقط على المضي قدما وأقترح أن، إذا كان هذا هو ثانية، هذا هو قيمة الإرجاع getString. وكنت قد رسمت هذه ك 0، 1، 2، الذي هو معقول تماما، لأننا يمكن فهرسة في سلسلة، على هذا النحو. ولكن مجرد أن تكون متسقة مع آخر مرة، اسمحوا لي أن المضي قدما واقتراح أن هذا تعسفا هو عنوان 1، هذا هو عنوان 2، هذا هو عنوان 3، وهكذا دواليك. وهكذا، لمجرد أن تكون فائقة واضح، ما الذي يحدث للذهاب في ليالي نتيجة لذلك السطر الأول من رمز، وكنت أقول؟ جانيل: العنوان 1؟ J. DAVID مالان: بالضبط. حتى معالجة 0x1. وفي الوقت نفسه، اسمحوا لي المضي قدما و تكرار بكثير من ما قمت به وإضافة بلدي ر بك هنا. إذا كان لي أن اكتب في غابي مرة أخرى، مرة ثانية، عند المطالبة مع getString، حيث، بطبيعة الحال، هو غابي سوف تذهب؟ حسنا، presumably-- جانيل: مثل هنا؟ J. DAVID مالان: نعم. جانيل: أو كما انها في نفس المربعات؟ J. DAVID مالان: اسمحوا لي أن أقترح، نعم، بالضبط، لذلك في هذه المربعات إضافية. ولكن ما هو المفتاح الآن هو أنه حتى على الرغم من أنني قد وضع هذه قريبة جدا together-- 0x1، على هذا و0x2-- في الواقع، هذا قد يكون الآن عنوان 0x10، على سبيل المثال، و0x11، 0x12 و، وهكذا دواليك. وهكذا، إذا كان هذا هو الحال، ما يحدث في نهاية المطاف هنا في ر؟ جانيل: 0x10؟ J. DAVID مالان: بالضبط. 0x10 ذلك. وحتى الآن، السؤال الأخير. و، حتى الآن، كان عليك أن تعمل على اصعب لفيل حتى الآن. الآن، إذا كنت سحب ما يصل رمز مرة أخرى، عندما أفعل، في السطر الثالث، إذا ق يساوي يساوي طن، ما أنا في الواقع تقارن أننا قد رسمها هنا؟ جانيل: عناوين اثنين؟ J. DAVID مالان: بالضبط. لذلك أنا أقول هو ق يساوي يساوي ر؟ وبعبارة أخرى، هو 1 يساوي يساوي 10؟ وبطبيعة الحال، الجواب واضح الآن، لا. وحتى هذا البرنامج هو في نهاية المطاف الذهاب لطباعة ما، وكنت أقول؟ جانيل: هل سيكون، كتبته نفس الشيء؟ J. DAVID مالان: حتى إذا ق هو 1 و t هو 10؟ جانيل: يمكنك كتابة أشياء مختلفة. J. DAVID مالان: بالضبط. كتبته أشياء مختلفة. كل الحق. حتى جولة من التصفيق، إذا استطعنا، هنا. [تصفيق] كان ذلك مؤلما. وأنا أعلم. فعلت بشكل جيد. حتى الآن دعونا نرى إذا كنا لا نستطيع ندف عدا ما هو الإصلاح. وبالطبع، عندما كنا الثابتة this-- التي سوف تمثل الآن في green-- فعلنا زوجين من التحسينات هنا. أولا، تماما كما التعقل تحقق، وأنا التحقق أولا إذا ق يساوي اغيا ور يساوي فارغة. ومجرد أن يكون واضحا، عندما قد ق ر أو لاغيا في قانون مثل هذا؟ عندما قد ق ر أو تكون فارغة. نعم؟ الجمهور: [غير مسموع]. J. DAVID مالان: بالضبط. إذا كانت السلسلة أن المستخدم كتبته في غير الطريق طويل جدا لتناسب في الذاكرة، أو بعض حالة الزاوية غريبة من هذا القبيل، getString، كما سنرى، حرفيا اليوم، في وثائقها، تقول انها ستعود لاغيا و قيمة الحارس خاصة، أو مجرد نوع من رمز خاص وهذا يعني شيء على ما يرام. لذلك نحن نريد للتحقق من ذلك، لأنه تبين باطل هو أن قيمة خطيرة جدا. في كثير من الأحيان، إذا حاولت أن تفعل شيئا مع باطلة تنطوي على function-- فمررها كمدخل، لinstance-- تلك الوظيفة قد جدا سوف تعطل و، مع ذلك، إنزال البرنامج كله. لذلك هذا الخط الثالث الآن هو مجرد التعقل تحقق، والتحقق من الخطأ، اذا صح التعبير. هذا هو عادة جيدة الآن ل لنا أن ندخل في أي وقت نحن محاولة استخدام القيمة التي يمكن، يحتمل، تكون فارغة. الآن، في السطر الرابع هنا، "إذا strcmp (ق، ر)،" حسنا، ما هذا اشارة الى؟ حسنا، قلنا كان هذا بإيجاز جدا اسمه وظيفة للمقارنة السلسلة. وهدفها في الحياة هو مقارنة الأولى حجتها ضدها الثانية، ولكن ليس من حيث عناوينهم، كما فعلنا غير قصد لحظة قبل مع رمز أحمر، ولكن بدلا من مقارنة هذين السلاسل في بديهية إنسانيا الطريقة بمقارنة هذا، ضد هذا، ضد هذا، ضد هذا، و ثم إذا وقف وعند واحد أو كل من أصابعي يضرب مائل 0. strcmp شخص حتى سنوات قبل تنفيذها لتنفيذ بالنسبة لنا وظيفة التي عقدناها نحن قد حصلت فقط عن طريق مقارنة قيمتين بسيطة. الآن بصراحة، وأظل الرسم كل هذه الأرقام المختلفة. ولكن الحقيقة هي، لقد كنت مما يجعل هذه تصل طوال الوقت. وذلك اسمحوا لي فقط على المضي قدما وهذه من خربشات لجعل النقطة التي في نهاية من اليوم والمضي قدما، نحن لا حقا أن نهتم ما يتناول أشياء هي في الواقع في الذاكرة. لذلك أنا لن رسم هذه أنواع من الأرقام كثيرا بعد الآن، أنا مجرد خلاصة هذا بعيدا قليلا أكثر ملاءمة مع السهام فقط. وبعبارة أخرى، إذا ق هو مؤشر، حسنا، دعونا فقط استدراجه، حرفيا، كمؤشر، مشيرا سهم من نفسها إلى شيء آخر، ولا تقلق أيضا أكثر من ذلك بكثير حول في التفاصيل التافهة من هذه العناوين التي، مرة أخرى، جعلت أنا على أي حال. ولكن سنرى هذه العناوين، في بعض الأحيان، عند تصحيح التعليمات البرمجية. الآن وفي الوقت نفسه، وهذا البرنامج هنا التصحيحات، بالطبع، هذه المشكلة من خلال مقارنة تلك السلسلتين. لكننا واجهت مشكلة أخرى. كان هذا من نسخة برنامج آخر مرة، ، كنت أحاول خلالها للاستفادة فقط الحرف الأول في سلسلة. ولكن ما كان العرض شاهدنا آخر مرة عندما مستخدم كتابة في القيمة، مثل غابي بالأحرف الصغيرة، لق، ثم نحن في تعيين ق ر، كما في السطر الثالث هناك، ثم حاولت أن الاستفادة ر 0 قوس؟ ما كان تأثير تغيير ر 0 قوس هنا؟ الجمهور: انها تغيرت ق. J. DAVID مالان: نعم، لقد غيرت ق، كذلك. لأن ما كان يحدث في الواقع؟ حسنا، دعني أرى ما اذا كان يمكنني تنظيف تصل هذه الصورة، على النحو التالي. إذا ق هو، مرة أخرى، فإن كلمة غرام، أ، ب، ه، مائل، 0، وق سنواصل الرسم على شكل مربع هنا، ولكن ليس أكثر من عناوين. دعونا نتوقف عن جعل الامور. دعونا فقط رسم صورة لتبسيط العالم. عندما أعلن مع سلسلة ر ر، أن يخلق أن جزءا من الذاكرة. ساحة يحدث أن تكون 32 بت في معظم أجهزة الكمبيوتر. في الواقع، إذا كنت قد سمعت من أي وقت مضى ل الكمبيوتر وجود بنية 32 بت، حقا يتوهم-الكلام، أن مجرد يعني أنه يستخدم عناوين 32 بت. وباعتباره الفنية جانبا، إذا كنت تتساءل لماذا أجهزة الكمبيوتر القديمة، إذا كنت فعلا حاول الحساء لهم حتى مع الكثير من ذاكرة الوصول العشوائي، يمكن أن يكون فقط كحد أقصى أربعة غيغابايت من ذاكرة الوصول العشوائي، كذلك هذا ل، حرفيا، يمكن الكمبيوتر القديم الخاص بك فقط عد مرتفعا كما 4 مليار و 4 مليار بايت، لأنه كان يستخدم 32 بت أرقام للعناوين. ولكن في أي حال، في هذا سبيل المثال، القصة أبسط من ذلك بكثير. ر هو مجرد مؤشر آخر، أو حقا نجم شار، ويعرف أيضا باسم السلسلة. وكيف أريد تحديث هذه الصورة. الآن مع أن السطر الثاني من التعليمات البرمجية، بعد نقطة، نقطة، نقطة؟ عندما أفعل سلسلة يساوي ر ق منقوطة، كيف يمكن تغيير هذه الصورة؟ نعم؟ الجمهور: [غير مسموع]. J. DAVID مالان: نعم. بالضبط. أنا فقط وضعت سهم من ر مربع إلى نفس العنوان، أعطى نفس الحرف الأول في. أو من الناحية الفنية، إذا كان هذا الرجل كان لا يزال في 0x1، على انها كما لو كان لي وهنا 0x1 0x1 هنا. ولكن مرة أخرى، من يهتم حول عناوين؟ انها مجرد فكرة أن يهم الآن. لذلك هذا هو ما يحدث هنا. وذلك بطبيعة الحال، إذا كنت تفعل ر قوس 0، وهو تدوين مجموعة، من course-- وبصراحة، يبدو كما يوجد مجموعة أكثر من هنا، ولكن الآن هناك هذا شيء غريب. نعلم أن لغة البرمجة، C، يقدم لك هذه الميزة، حيث، حتى لو تي هي و المؤشر، أو ق هو مؤشر، لا يزال بإمكانك استخدام تلك مألوفة، قوس مربع مريح التدوين للذهاب إلى العنصر الأول، أو العنصر الثاني، أو أي عنصر أن هذا المؤشر يشير لأنه، من المفترض، أنه هو، كما في هذه الحالة، مشيرا في بعض صفيف. لذلك كيف يمكننا إصلاح هذا؟ بصراحة، هذا هو المكان الذي حصلت على الساحق قليلا للوهلة الأولى. ولكن هنا هو نسخة جديدة ومحسنة. أولا حتى، انني اتلقى التخلص من مكتبة CS50، فقط لفضح أن ق هو في الواقع نجم شار، مجرد مرادف. و t هو أيضا نجم شار. ولكن ما يجري على الجانب الأيمن من هذا الخط حيث يتم تعيين قيمة ر؟ ما هو malloc؟ ما strlen ذلك؟ ما هو sizeof (تشار)؟ لماذا هيك يفعل هذا خط نظرة معقدة جدا؟ ما كان يفعل على مستوى عال؟ ما هو تخزين في ر؟ نعم؟ الجمهور: انها لتخصيص كمية معينة من مساحة الذاكرة. انها لتخزين وأعتقد، الرسائل [غير مسموع]. J. DAVID مالان: الكمال. الكمال. انها تخصيص بعض مقدار مساحة الذاكرة لتخزين، ويفترض، والرسائل المستقبلية. وعلى وجه الخصوص، malloc لذا تعود ماذا؟ الجمهور: العودة لل[غير مسموع]؟ J. DAVID مالان: بالضبط. العودة عنوان تلك الذاكرة، وهي طريقة أخرى للقول، إرجاع عنوان البايت الأول من تلك الذاكرة. والمسؤولية تقع على لي أن نتذكر مقدار الذاكرة أنا فعلا المخصصة أو طلب malloc ل. الآن كم هو هذا؟ حسنا، على الرغم من هناك الكثير من الأقواس هنا، malloc يستغرق سوى حجة واحدة. وأنا تحديد strlen من ليالي، حتى تعطي لي العديد من بايت كما أن هناك في ليالي، ولكن إضافة واحد. لماذا؟ نعم؟ الحضور: مائل 0. J. DAVID مالان: بالضبط. علينا أن نفعل القليل من التدبير المنزلي. ذلك لأنه لا يوجد خط مائل عكسي 0، كنا نتذكر أن أفضل. خلاف ذلك، نحن ذاهبون لخلق سلسلة لا يكون هذا فاصل خاص. وفي الوقت نفسه، لمجرد أن يكون السوبر الشرج، لدي sizeof (تشار)، فقط في حالة شخص يعمل بلدي كود ليس على الأجهزة CS50، ولكن ربما كمبيوتر آخر تماما حيث حرف هي بايت واحد، من خلال اتفاقية، ولكن اثنين بايت، أو شيء أكبر من ذلك. انها مجرد أن تكون فائقة، السوبر يعارض أخطاء. على الرغم من ذلك، في الواقع، انها ل على الأرجح ستكون 1. الآن، وفي الوقت نفسه، وأنا المضي قدما ونسخ سلسلة، ر قوس يساوي ط ر ق قوس. وأنا سوف تؤجل إلى الأسبوع الماضي كود المصدر لرؤية ما يحدث. لكن الوجبات الجاهزة الرئيسية، و السبب أضع رمز الآن باللون الأخضر، لأن ذلك السطر الأخير جدا، ر 0 قوس يساوي toupper، له تأثير الإستفاده الذي سلسلة؟ ر و / أو ق؟ أن السطر الأخير من التعليمات البرمجية. ر فقط، لأن ما حدث هذه المرة، لو كنت التراجع قليلا أن الخطوة الأخيرة، ما حدث هو، عندما أدعو malloc، أنا أساسا الحصول على قطعة من الذاكرة وهذا هو نفس حجم الأصلي، لأن هذا هو الحساب فعلت. أنا تخزينها في ر عنوان ذلك جزءا من الذاكرة. على الرغم من هذا يبدو لطيفا وجميلة، لطيفة وفارغة، واقع وهناك، ما سنقوم تبقى الدعوة، والقيم القمامة هنا. أن جزءا من الذاكرة قد جدا كذلك استخدمت من قبل، بضع ثوان، قبل بضع دقائق. لذلك يمكن أن يكون هناك على الاطلاق أرقام أو خطابات هناك، فقط عن طريق الصدفة. لكنها ليست صالحة، حتى و نفسي ملء هذه قطعة من الذاكرة مع حرف الفعلية، وأنا القيام في ذلك للحلقة هناك. كل الحق؟ وحتى الآن، ذروة هذه الأمثلة الثلاثة التي كانت على ما يبدو كسر آخر مرة، هذا المثال علوي قابل للتغيير، هذه الوظيفة عملت بالمعنى أنها تبادلت أ و ب. لكنها لم تنجح في ما معنى آخر؟ نعم؟ الجمهور: [غير مسموع]. J. DAVID مالان: بالضبط. إذا كان لي أن استدعاء هذه الدالة من another-- على سبيل المثال، من دالة مثل الرئيسية، حيث لدي متغير، x و y، وأنا فعلت الأسبوع الماضي، نفس الرمز، وأمرر في x و y لمبادلة، ومن ثم استدعاء Swap-- هذا، بالطبع، هو الإصدار الصحيح ما نحن على وشك see-- أنه لم يعمل. فما هو الإصلاح؟ حسنا، لذلك لمجرد أن يكون اضحا، اسمحوا لي أن المضي قدما و- تعطيني ثانية واحدة هنا، ونرى إذا أنا يمكن أن تظهر لك آخر واحد، والتي سيكون in-- دعونا نرى ما اذا كان يمكنني العثور على هذا موافق fast-- الحقيقي، [غير مسموع]. OK، ومن هناك. لذلك تجاهل أوامر أنا فقط الكتابة. أريد أن استرداد في اللحظة الأخيرة مثالا من المرة السابقة، التي ويسمى الآن لا تبديل. لذلك لا المبادلة حيث توقفنا في المرة السابقة، حيث، وتهيئة X و y إلى 1 إلى 2. أنا ثم استدعاء علوي قابل للتغيير، ويمر في 1 و 2. ثم هذه الوظيفة عملت في بعض المعنى، لكنه لا يملك دائمة تأثير على x و y. ولذلك فإن السؤال المطروح هو، كيف الآن هل نحن فعلا إصلاح هذه المشكلة؟ ما هو الحل في متناول اليد؟ حسنا، في swap.c، الذي هو جديد اليوم لاحظت وجود بعض الاختلافات. x و y هي نفسها. ولكن ما هو واضح مختلف عن خط 25؟ ما هو الجديد هناك، إذا كنت تتذكر ما يشبه قبل الثانية؟ الجمهور: [غير مسموع]. J. DAVID مالان: نعم. لذلك الوات هي قطعة جديدة من جملة ليس فقط في هذا البرنامج، ولكن أيضا أكثر عموما في CS50. حتى الآن، لا أعتقد رأيناه أية أمثلة أو أضمر عنهم في أي التفاصيل، بخلاف، ربما، استباقي في القسم، وهو العطف من هذا القبيل. حسنا، اتضح العطف هو واحد من القطع الأخيرة من تركيب جديد نحن ذاهبون للتعلم. كل ما يعني هو عنوان بعض متغير. في عنوان ما لا س تعيش؟ ولكن ما لا عنوان ذ تعيش؟ لأنه إذا كان المشكلة الأساسية قبل وأن x و y يجري تمريرها النسخ، ما نريد حقا أن تفعل يتم توفير مقايضة مع مثل كنز الخريطة التي تؤدي إلى حيث x و y الواقع هي في RAM، بحيث المقايضة يمكن تتبع تلك الخريطة وتذهب إلى أي مكان x أو ذ يصادف بقعة وتغيير القيم الفعلية 1 و 2 هناك. لذا علوي قابل للتغيير يحتاج إلى تغيير طفيف جدا. وللوهلة الأولى، وهذا قد يبدو قليلا مماثلة لنجم شار. والواقع هو. لذلك هو مؤشر إلى نوع ما من البيانات، على أساس هذا الجزء سلط الضوء؟ حتى انها لكثافة العمليات. لذلك لم يعد كثافة العمليات، انها عنوان لكثافة العمليات. وبالمثل، ب تسير الآن ليكون عنوان لكثافة العمليات. لذلك عندما أعطي الكلمة الآن علوي قابل للتغيير من الأصل، أنا لا أذهب لإعطاء علوي قابل لل1 و 2. انا ذاهب الى اعطائها مثل ثور ثور شيء وشيء، عنوانين التي ستقود تبادل لمواقعها الفعلية في ذاكرة جهاز الكمبيوتر الخاص بي. وحتى الآن، يا التنفيذ المتبقية يحتاج إلى تغيير صبي. ما هو مختلف من الواضح الآن في هذه السطور ثلاثة من التعليمات البرمجية؟ هناك لعنة كل هذه النجوم مكان، كل الحق؟ فما الذي يحدث هنا؟ نعم؟ الجمهور: من الواضح [غير مسموع]. J. DAVID مالان: بالضبط. حتى في هذا context-- وهذا لم يكن أفضل قرار تصميم، باعتراف الجميع، منذ سنوات. في هذا السياق، حيث عليك نجم، وليس لديك نوع بيانات، مثل كثافة العمليات، وعلى الفور إلى اليسار، بدلا من ذلك لديك علامة المساواة، بشكل واضح، في هذا السياق، عندما تقول نجمة لذلك، وهذا يعني الذهاب الى عنوان هذا في. اتبع خريطة الكنز، إذا جاز التعبير. وفي الوقت نفسه، وذلك تمشيا 37، يعني نفس الشيء. الانتقال إلى العنوان لذلك، ووضع ما هناك؟ كل ما هو في الموقع الذي تحدد ب. وبعبارة أخرى، انتقل إلى b. الحصول على تلك القيمة. تذهب إلى ذلك، وفقا لتساوي التوقيع، عامل التعيين، وضع هذه القيمة هناك. وبالمثل، فإن درجة الحرارة كثافة العمليات هي مجرد كثافة العمليات. شيء يحتاج إلى تغيير نحو مؤقت. انها مجرد كوب من الفراغ أننبرغ بالنسبة لبعض الحليب أو عصير البرتقال. لكنني بحاجة إلى أن أقول، انتقل إلى ب. الذهاب إلى تلك الوجهة و وضع القيمة في درجة الحرارة هناك. فماذا يحدث بعد ذلك؟ عندما كنت في الواقع دعوة مبادلة هذه المرة، إذا هذا صينية الأولى هنا يمثل الرئيسي، تمثل هذه علبة الثانية علوي قابل للتغيير، عندما أمرر العطف والعطف س ص من منزل لمبادلة، لمجرد أن تكون واضحة، ما هو هذا كومة إطار المتلقي؟ نعم؟ الجمهور: [غير مسموع]. J. DAVID مالان: بالضبط. عنوان x و عنوان ذ. ويمكنك التفكير في هذه مثل عناوين البريدية. 33 شارع أكسفورد و35 شارع أكسفورد، وكنت تريد نقل المبنيين التي هي في تلك المواقع. انها نوع من فكرة سخيفة، ولكن هذا كل ما نعنيه العنوان. مكان في العالم يمكن تجد تلك [إينتس] اثنين؟ مكان في العالم يمكنك العثور على تلك المباني اثنين؟ حتى إذا كان أخيرا، وبعد كل هذا الوقت وأنا اذهب إلى رمز مصدر اليوم وتجميع مبادلة وتشغيل ./swap، أخيرا، ل أول مرة ونحن في الواقع لا نرى أن قيمي لها في الواقع تبادلت تم بنجاح. والآن، يمكن أن نتخذها حتى علما هذا في، ويقول، جدب. لذلك اسمحوا لي أن أذهب إلى نفس الملف. اسمحوا لي المضي قدما وتشغيل جدب من ./swap. والآن، في مبادلة، انا ذاهب للذهاب وقبل تعيين نقطة فاصل في الأصل. والآن انا ذاهب للذهاب وقبل تشغيل البرنامج. والآن نرى قانون بلدي توقفت في هذا الخط. إذا ذهبت إلى الأمام والطباعة س، ما يجب أن أرى هنا؟ انها مسألة. أقول مرة أخرى؟ الجمهور: [غير مسموع]. J. DAVID مالان: حتى أرقام عشوائية، ربما. ربما كنت محظوظا، وانها لطيفة وبسيطة، مثل 0. ولكن ربما هو بعض رقم عشوائي. في هذه الحالة، كنت محظوظا. يحدث ذلك لمجرد أن يكون 0. ولكن هو في الواقع الحظ، لأنه لا حتى أنا اكتب التالي ومن ثم طباعة العاشر له أن سطر من التعليمات البرمجية، خط 19، أعدم. وفي الوقت نفسه، إذا كنت اكتب التالي مرة أخرى، و الآن طباعة ذ، انا ذاهب لرؤية 2. الآن، إذا كنت اكتب المقبل، فإنه سيكون ل الحصول على مربكة قليلا، لأنه الآن، وprintf سوف تظهر على الشاشة، كما فعلت. x هو 1. دعونا نفعل ذلك مرة أخرى. والآن، وهنا حيث الامور مثيرة للاهتمام. قبل أن أعطي الكلمة علوي قابل للتغيير أو حتى خطوة الى ذلك، دعونا نلقي نظرة خاطفة صغيرة. x هو، مرة أخرى، 1. Y هو، بطبيعة الحال، العقل سريع تحقق، 2، لذلك ليس من الصعب هناك. ولكن ما هو العطف العاشر؟ الجواب، انها تبحث نوع غير تقليدي. ولكن النجم كثافة العمليات بين قوسين هي مجرد طريقة الناتج المحلي الإجمالي للقول هذا هو العنوان. انها ليست عدد صحيح، انها مؤشر إلى كثافة العمليات، أو المعروف باسم عنوان. ما هو هذا الشيء مجنون؟ لم نر شيئا تماما مثل ذلك من قبل. لذلك هذا هو العنوان في جهاز الكمبيوتر الخاص بي ل ذاكرة من حيث x يحدث للعيش. انها ثور شيء. وهذا هو، بصراحة، لماذا لقد بدأت رسم السهام، بدلا من الأرقام، لأن الذي يهتم حقا أن كثافة العمليات الخاص بك هو على وجه الخصوص عنوان هذا أن كبير. لكن bffff0c4، هذه كلها في الواقع أرقام ست عشرية، التي هي من 0 إلى F. لذلك نحن لن يسكن جدا منذ فترة طويلة على ما هي تلك الأشياء. ولكن إذا كنت طباعة ذ، بالطبع، أرى 2. لكن العطف ذ، وأرى هذا العنوان. والإشعار، للفضول، إلى أي مدى هم بصرف النظر x و y؟ يمكنك تجاهل أكثر من عنوان. أربعة بايت. وهذا يتفق مع دينا المطالبة في وقت سابق أن كيف كبيرة هو الباحث؟ أربعة بايت. بحيث يبدو مثل بطانة كل شيء على ما يصل لطيف، كما قد نأمل في الذاكرة. وحتى الآن، دعونا فقط سريع إلى الأمام إلى نهاية هذه القصة. دعونا نمضي قدما واكتب الخطوة، ليغوص في وظيفة علوي قابل للتغيير. تلاحظ الآن، إذا أنا اكتب، انها مطابقة للعنوان السينية. إذا كنت من النوع B، انها متطابقة إلى عنوان ذ. فما ينبغي لي أن أرى إن كنت يقول، انتقل إلى عنوان ل؟ حتى طباعة نجم أ. حتى نجمة تعني الذهاب إلى هناك، في هذا السياق. العطف يعني ما هو عنوان. حتى نجمة وسيلة 1. ونجم الطباعة ب يعطيني 2. واسمحوا لي أن نفترض، لحظة، أن ما لا يقل عن التعليمات البرمجية التي تشرع في تنفيذ الآن يمكن أن يكون مسبب خلال بتلك الطريقة. ولكن سنقوم إعادة النظر هذه الفكرة قبل فترة طويلة. حتى هذا الإصدار من علوي قابل للتغيير الآن صحيح ويسمح لنا لتبادل هذه البيانات نوع معين. لذلك أي أسئلة ثم على علوي قابل للتغيير؟ على نجم؟ على عنوان؟ وسترى، مع مشكلة تعيين 4، نوعا ما، ولكن مشكلة مجموعة 5، بالتأكيد، كيف يمكن لهذه أشياء مفيدة والحصول على أكثر من ذلك بكثير بالراحة معهم، نتيجة لذلك. أي شيء على الإطلاق؟ كل الحق. حتى malloc هو، مرة أخرى، هذه الوظيفة يخصص فقط الذاكرة، الذاكرة التخصيص. ولماذا هذا مفيد؟ حسنا، كل هذا الوقت، كنت أستعمل malloc. إذا كنت تنظر الآن كيف getString الأعمال، ويفترض، انها تم يسأل شخص عن قطعة من الذاكرة، في أي وقت يكتب المستخدم سلسلة في، لأننا بالتأكيد لا يعرف، والموظفين CS50، كيف تلك السلاسل كبيرة بأن البشر ذاهبون لكتابة قد يكون. لذلك دعونا، لأول مرة، تبدأ قشر الظهر كيفية عمل مكتبة CS50، عن طريق بضعة أمثلة التي من شأنها أن تؤدي بنا هناك. حتى لو كنت فتح gedit وفتح scanf 0، نحن ذاهبون لرؤية البرمجية التالية. Scanf 0، متاحة على الموقع الإلكتروني لل اليوم، لديها عدد قليل نسبيا من الأسطر من التعليمات البرمجية هنا، من 14 إلى 20. ودعونا نرى ما تقوم به. ويعلن عدد صحيح، ودعا السينية. وتقول شيئا مثل، عدد من فضلك. والآن تقول، scanf٪ ط، و خ. لذلك هناك مجموعة من الاشياء الجديدة هناك. لكن scanf، يمكنك النوع من التفكير من كنقيض للprintf. printf، بالطبع، يطبع على الشاشة. scanf نوع من المسح من المستخدم لوحة المفاتيح ما اذا كان قد كتبته. ط٪ هو تماما مثل printf. هذا يعني نتوقع مستخدم لكتابة عدد صحيح. والآن، لماذا تعتقد أنا يمكن تمرير scanf والعاشر؟ إذا كان الغرض في حياة scanf هو الحصول على شيء من المستخدم، ما هو معنى فمررها، والعاشر، والآن؟ نعم؟ الجمهور: [غير مسموع]. J. DAVID مالان: بالضبط. كل ما أنا، الإنسان، اكتب في، ومدخلات بلدي سوف يتم حفظها في هذا الموقع. انها ليست كافية، تذكر، فقط ل تمر في العاشر، لأننا قد رأينا بالفعل، أي الوقت الذي تمر مجرد متغير الخام، مثل كثافة العمليات، إلى حد وظيفة أخرى، بالتأكيد، فإنه يمكن تغيير ذلك متغير، ولكن ليس بشكل دائم. لا يمكن أن يكون لها تأثير على الأصل. فإنه يمكن فقط تغيير النسخة المحلية الخاصة بها. ولكن إذا، بدلا من ذلك، كنت لا تعطيني كثافة العمليات الفعلية، ولكن هل تعطيني توجيهات ل أن كثافة العمليات، والآن، يجري scanf، بالتأكيد، لا أستطيع أن اتبع معالجة ووضع هناك عدد ولذلك عليك الحصول على أنها كذلك. لذلك عند تشغيل هذا البرنامج، دعونا نرى. جعل scanf 0 نقطة مائل، scanf 0. وإذا كنت الآن اكتب رقما مثل 50، وذلك بفضل ل50. إذا أنا الآن اكتب رقما مثل سالب 1، لالسلبي 1. أنا الآن اكتب رقما مثل 1.5، HM. لماذا برنامجي تجاهل لي؟ حسنا، لأنه ببساطة، قلت أن نتوقع كثافة العمليات فقط. كل الحق. لذلك هذا هو نسخة واحدة من هذا. لنأخذ الامور الشق و أقترح أن هذا ليس جيدا. ويكمن هنا مثال بسيط جدا كيف يمكننا أن نبدأ كتابة التعليمات البرمجية أن الآخرين يمكن أن يستغلها أو حل وسط عن طريق القيام بأشياء سيئة. حتى الخط 16، على غرار ذلك في الروح لمن قبل، ولكن أنا لا يعلن ذلك الباحث هذه المرة. أنا معلنا أنه شار نجوم، ويعرف أيضا باسم السلسلة. ولكن ماذا يعني ذلك حقا؟ حتى لو كنت لا تحديد address-- و أنا وصفه بأنه تعسفي، العازلة، ولكن يمكن أن نسميها S، لتكون simple-- ثم أفعل ذلك، وشرح لي، إذا كنت تستطيع، استنادا إلى سابقة المنطق، ما تقوم به scanf في خط 18، إذا تمريرة٪ ق والعازلة، الذي هو عنوان؟ ما هو scanf، إذا قمت بتطبيق نفس المنطق بالضبط كما نسخة 0، سنحاول القيام به هنا، عندما شيء أنواع المستخدم في؟ نعم؟ الجمهور: [غير مسموع]. J. DAVID مالان: بالضبط. Scanf، من خلال منطق في وقت سابق، هو ذاهب الى اتخاذ سلسلة أن الإنسان مكتوب in-- انها الآن سلسلة، انها ليست عددا، ويفترض، إذا كان الشخص cooperates-- وانه ذاهب الى محاولة لوضع هذا سلسلة في الذاكرة في أي عنوان يحدد العازلة. وهذا شيء عظيم، لأن عازلة بل المقصود أن يكون عنوان. ولكن أزعم هذا البرنامج هو عربات التي تجرها الدواب في طريقة خطيرة جدا، لأن ما هي القيمة العازلة افتراضيا؟ ما أنا في تهيئة؟ ما جزءا من الذاكرة؟ لدي لا، أليس كذلك؟ حتى على الرغم من أنني قد خصصت نجمة شار وهذا ما لم يعد يسمى ثانية، انه دعا بدلا من ذلك، حتى buffer-- دعونا رسم اسم متغير الآن كما buffer-- إذا أنا لم دعا getString أو malloc هنا، هذا يعني فعليا أن المخزن هو مجرد بعض القيمة القمامة. الآن ماذا يعني ذلك؟ وهو ما يعني أن قلت scanf نتوقع أن يكون هناك سلسلة من المستخدم. وأنت تعرف لماذا؟ أيا كان هذا الشيء يشير علي: وأنا رسم علامة استفهام، ولكن في الواقع، فإنه سيكون شيء من هذا القبيل OX1، 2، 3، أليس كذلك؟ انها بعض قيمة وهمية ذلك تماما يحدث أن يكون هناك من قبل. لذلك بعبارة أخرى، انها كما لو المخزن المؤقت فقط مشيرا إلى شيء في الذاكرة. ليس لدي أي فكرة ما. حتى لو كنت اكتب في غابي الآن، انه سيكون في محاولة لوضع ز-A-B-E / 0 هناك. ولكن من يدري ما هو؟ وفي الماضي، أي الوقت حاولنا تلمس الذاكرة التي لا تنتمي بالنسبة لنا، ما الذي حدث؟ أو تقريبا في كل مرة. خطأ تجزئة، أليس كذلك؟ هذا السهم، ليس لدي أي فكرة حيث انها التأشير. انها مجرد بعض قيمة عشوائية. وبالطبع، إذا كنت تفسير قيمة عشوائية كعنوان، وأنت تسير للذهاب الى بعض الوجهة عشوائية. لذلك قد تحطم بالفعل غابي برنامجي في هذه الحالة هنا. فماذا يمكننا أن نفعل ذلك على النحو تقريبا سيئة؟ النظر في هذا الثلث و المثال الأخير من scanf. هذا الإصدار هو أفضل بأي معنى؟ إذا كنت مرتاحا مع المشكلة السابقة، وهذا هو أفضل. لماذا؟ الجمهور: [غير مسموع]. J. DAVID مالان: جيد. حتى هذه الحالة من خط 16 هو أفضل، بمعنى أننا صراحة تخصيص بعض الذاكرة. نحن لا تستخدم malloc، نستخدمه في الأسبوع 2 نهج من مجرد إعلان صفيف. وقلنا قبل ذلك سلسلة هو مجرد مجموعة من الأحرف، لذلك هذا أمر مشروع تماما. لكنه، بطبيعة الحال، كما لاحظ، حجم ثابت، 16. لذلك هذا البرنامج هو آمنة تماما، إذا أنا اكتب في سلاسل حرف واحد، وهما شخصية سلاسل، 15 سلاسل الأحرف. ولكن بمجرد أن تبدأ بكتابة 16، 17، 18، 1،000 سلاسل الأحرف، حيث أن السلسلة لن ينتهي؟ انها لن ينتهي هنا جزئيا. ولكن بعد ذلك من يدري ماذا هو أبعد من حدود هذه مجموعة معينة؟ فهو كما لو أن عندي أعلن 16 صناديق هنا. وذلك بدلا من استخلاص كل 16، وسوف نقوم مجرد التظاهر بأن رسمتها 16. ولكن إذا كنت ثم محاولة قراءة سلسلة هذا وقتا أطول، مثل 50 حرفا، انا ذاهب الى البدء في وضع أ، ب، ج، د، س، ص، ض. وهذا يفترض بعض شريحة الذاكرة الأخرى ذلك، مرة أخرى، قد يسبب برنامجي لتحطم الطائرة، لأنني لم يطلب ل أي شيء أكثر من مجرد 16 بايت. لذا من يهتم؟ حسنا، ها هي مكتبة CS50. والأكثر من هذا هو مجرد مثل تعليمات حتى أعلى. المكتبة CS50، كل هذا الوقت، وقد كان هذا الخط في خط 52. رأيناه الرموز المميزة ل typedef، أو سترى الرموز المميزة ل typedef في pset 4، مما يخلق فقط مرادف حيث نجم شار يمكن أن يكون أكثر مجرد يشار إلى السلسلة. لذلك هذا هو واحد من قليلة عجلات التدريب استخدمنا سرا تحت غطاء محرك السيارة. وفي الوقت نفسه، وهنا وظيفة، getchar. الآن على ما يبدو، وليس هناك هيئة لها. وفي الواقع، إذا أظل التمرير، وأنا لا فعلا نرى أي تطبيقات من هذه الوظائف. كما شيك التعقل، لماذا هذا؟ الجمهور: [غير مسموع]. J. DAVID مالان: نعم. لذلك هذا هو ملف الرأس. ورأس الملفات تحتوي على النماذج، بالإضافة إلى بعض الأشياء الأخرى، على ما يبدو، مثل typedefs. ولكن في CS50.c التي قمنا لم تعط لك صريح، ولكن كان في كل الأجهزة CS50 هذه المرة، في عمق المجلدات لها، تلاحظ أن هناك ككل مجموعة من وظائف هنا. في الواقع، دعونا انتقل لأسفل. دعونا تجاهل معظمهم، في الوقت الراهن. ولكن انزل الى getInt وانظر كيف يعمل getInt. حتى هنا هو getInt. وإذا كنت من أي وقت مضى تهتم حقا كيف تحصل الباحث يعمل، وهنا هو وثائقه. وبين الأشياء تقول انه يخبرك ما نطاقات من القيم يمكن أن يعود. انها سلبية بشكل جوهري 2 مليار دولار إلى إيجابي 2 مليار دولار، يعطي أو يأخذ. وكما تبين، كل هذا الوقت، على الرغم من أننا قد قمت أبدا كنت قد تحقق بالنسبة له، إذا كان هناك شيء يذهب على نحو خاطئ، اتضح أن جميع هذه المرة، لديه getInt تم إرجاع خاص ثابتة، غير فارغة، بل int_max، وهو اتفاقية مجرد مبرمج. فهذا يعني هنا هو قيمة خاصة. تأكد للتحقق من هذا، فقط في حالة حدوث خطأ ما. ولكن لدينا أبدا ازعجت مع أنه حتى الآن، لأنه مرة أخرى، وهذا يهدف إلى تبسيط. ولكن كيف يمكن الحصول على تنفيذها getInt؟ حسنا، واحد، فإنه يأخذ بدون وسائط. نحن نعرف ذلك. تقوم بإرجاع عدد صحيح. نحن نعرف ذلك. حتى كيف يعمل تحت غطاء محرك السيارة؟ ولذلك لا يوجد على ما يبدو لانهائية حلقة، على الأقل في مظهر واحد. لاحظ أن نستخدمه getString. بحيث مثيرة للاهتمام. getInt وتدعو وظيفة الخاصة بنا، getString. والآن لماذا قد تكون هذه الحالة؟ لماذا أنا يجري دفاعية هنا في خط 165؟ ما يمكن أن يحدث في خط 164، لمجرد أن يكون واضحا؟ انها نفس الجواب كما كان من قبل. قد يكون فقط من الذاكرة. شيء يذهب على نحو خاطئ مع getString، علينا أن نكون قادرين على التعامل مع ذلك. والسبب لا يعود لاغية و ذلك، من الناحية الفنية، هو مؤشر لاغية. getInt لديه للعودة عدد صحيح. حتى لقد قمت تعسفا قررت، أساسا، أن 2 مليار دولار، يعطي أو يأخذ، يجري أن تكون القيمة الخاصة التي يمكنني أبدا في الواقع الحصول من المستخدم. انها مجرد قيمة واحدة سأقوم لإضاعة لتمثيل رمز خطأ. وحتى الآن، الأمور قليلا نزوة. وانها ليست تماما نفس وظيفة كما كان من قبل، لكنها مشابهة جدا. لذلك تلاحظ، أعلن هنا، في خط 172، كلا من ن كثافة العمليات وشار ج. وبعد ذلك استخدام هذا الخط غير تقليدي، sscanf، الذي اتضح لا تتفحص سلسلة من لوحة المفاتيح. انها تقف سلسلة القائمة التي قام المستخدم بكتابتها بالفعل. لذلك أنا بالفعل دعا getString، التي يعني لدي سلسلة في الذاكرة. sscanf هو ما كنت استدعاء دالة التوزيع. يبدو في سلسلة لدي كتبته في، حرف بحرف، ويفعل شيئا مفيدا. يتم تخزين هذه السلسلة في الخط. وأنا أعلم أن فقط عن طريق الذهاب عمل نسخة احتياطية وهنا قائلا، أوه، حسنا، دعوت أنه لا ق هذا الوقت، ولكن الخط. والآن هذا هو مختلفة قليلا. ولكن هذا يعني عمليا، لأسباب سنقوم موجة نوعا ما في أيدينا اليوم، أننا فحص ل معرفة ما إذا كان المستخدم في كتابة والباحث، وربما حرف آخر. إذا كان المستخدم كتابتها في كثافة، انها ل الذهاب الى خزنها في ن، لأنني ويمر ذلك من خلال عنوان و خدعة جديدة رأيناه اليوم. إذا كتبته المستخدم أيضا في مثل 123x، التي خ يجري في نهاية المطاف ل رسالة في الطابع ج. الآن اتضح أن sscanf سوف تقول لي، بذكاء، كم عدد المتغيرات وsscanf قادرة بنجاح لملء الفراغ. ذلك من خلال هذا المنطق، إذا كانت وظيفة أنا وتنفيذ getInt، ولكن أنا فحص، يحتمل، للمستخدم قد كتبته في عدد صحيح تليها شيء آخر، ماذا أريد من sscanf قيمة الإرجاع حقا أن تكون؟ إذا كان الغرض هو الحصول على فقط عدد صحيح من المستخدم؟ حتى إذا sscanf العوائد 2، ماذا يعني ذلك؟ المستخدم في كتابة شيء من هذا القبيل، حرفيا، 123x، الذي هو مجرد هراء. انها حالة خطأ، و أريد للتحقق من ذلك. حتى إذا قام المستخدم بكتابة هذا في، من خلال هذا المنطق، ماذا sscanf العودة، ستقول؟ حتى انها سوف تعود 2، ل 123 ستذهب هنا، وس سوف ينتهي هنا. ولكن أنا لا أريد س للحصول على شغل. أريد أن sscanf أن ينجح فقط في ملء أول من متغيراته. وولهذا السبب أنا تريد sscanf للعودة 1. وإذا كان هذا هو قليلا على رأسه لحظة، وهذا شيء طيب تماما. تحقيق على الرغم من أن واحدا من قيم getInt وgetString هو أن نقوم به من هيك الكثير من خطأ التحقق من هذا القبيل حتى التي، حتى الآن، يمكنك الى حد كبير اكتب أي شيء على لوحة المفاتيح، ونحن سوف قبض عليه. ونحن بالتأكيد، و الموظفين، وبالتأكيد لن يكون مصدر خلل في حياتك برنامج، لأننا دفاعيا التحقق من وجود كل من غبي الأشياء التي يمكن للمستخدم القيام به، مثل كتابة سلسلة، عندما كنت تريد حقا كثافة العمليات. وذلك لnow-- سنأتي إلى هذا من قبل long-- ولكن كل هذا الوقت، getString وgetInt ديك كانت تحت غطاء محرك السيارة باستخدام هذا الفكرة الأساسية من عناوين الذاكرة. وحتى الآن، دعونا نجعل الأمور أكثر قليلا سهل الاستعمال. وكما تذكرون، من بينكي الماضي time-- إذا الماوس بلدي سوف cooperate-- ذلك كان لدينا هذا الرمز، الذي بصراحة، لا معنى لها إلى حد ما. هذا الرمز يحقق شيئا مفيدة، ولكن كان المثال أن أستاذ Parlante تستخدم من أجل تمثيل ما يجري في برنامج تنطوي على الذاكرة. لذلك دعونا روايتها هذه قصة سوبر لفترة وجيزة. هذين الخطين الأولى، في اللغة الإنجليزية، لا ما، وكنت أقول؟ معقول فقط في الإنسان، ولكن قليلا المصطلحات الفنية، واتخاذ طعنة. الجمهور: [غير مسموع]. J. DAVID مالان: حسنا، كنت إقامة عناوين لجهودكم المتغيرات x و ذ. ليس تماما، لأن x و y ليست المتغيرات بالمعنى التقليدي. x و y هي عناوين سيتم تخزين أو العنوان. لذلك دعونا نحاول هذا مرة أخرى. ليست بداية سيئة، وإن كان. نعم؟ الجمهور: [غير مسموع]. J. DAVID مالان: جيد. أعتقد أن هذا قليلا أكثر نظافة. إعلان اثنين من المؤشرات، وهما الأعداد الصحيحة. ونحن دعوتهم x و y. أو إذا كنا رسم هذا كصورة، مرة أخرى، أذكر ببساطة أن جميع نقوم به مع أن السطر الأول يتم رسم مربع مثل هذا، مع بعض القيمة القمامة فيه، واصفا إياه X، ثم مربع أخرى من هذا القبيل، مع بعض القيمة القمامة في ذلك، واصفا إياه ذ. لقد أعلن اثنين المؤشرات التي في نهاية المطاف سيتم تخزين عنوان لكثافة العمليات. لذلك هذا كل ما هناك. حتى متى بينكي هذا، الطين بدا تماما مثل هذا. ونيك مجرد نوع من اختتم السهام، كما لو أنها لم تكن لافتا في أي مكان على وجه الخصوص، لأنهم فقط قيم القمامة. انهم لا تهيئة صراحة في أي مكان على وجه الخصوص. الآن السطر التالي من كان رمز، تذكر، هذا. حتى في معقول سهل الاستعمال، ولكن اللغة الإنجليزية الفنية إلى حد ما، ما هو هذا الخط من يفعل الرمز؟ نعم؟ الجمهور: [غير مسموع]. J. DAVID مالان: الكمال. انها تخصيص جزء من الذاكرة هذا هو حجم وكثافة العمليات. وهذا هو نصف الحل. أجبت الحق نصف التعبير. ما يحدث على الجانب الأيسر من علامة المساواة؟ نعم؟ الجمهور: والمتنازل لهم أن x متغير؟ J. DAVID مالان: والمتنازل لهم أن x متغير. لذلك باختصار، يخصص الجانب الأيمن ذاكرة كافية لتخزين عدد صحيح. ولكن على وجه التحديد malloc إرجاع عنوان ذلك جزء من الذاكرة التي قمت اقترح فقط يحصل المخزنة في x. ذلك ما فعله نيك آخر مرة مع بينكي هو انه سحب هذا المؤشر من والخزف و أن نشير الآن إلى قطعة بيضاء من الذاكرة هذا هو مساو لحجم وكثافة العمليات. وبالفعل، وهذا يعني لتمثيل أربعة بايت. الآن، السطر التالي من التعليمات البرمجية فعل هذا، نجم س يحصل 42. حتى 42 واضح ومباشر على الجانب الأيمن، معنى الحياة. الجانب الأيسر، نجم س يعني ماذا؟ يمكن أن يكون أيضا gone-- هذا موافق. موافق. الجمهور: في الأساس، اذهب إلى [غير مسموع] J. DAVID مالان: جيد. الجمهور: [غير مسموع]. J. DAVID مالان: بالضبط. الجانب الأيسر يعني الذهاب إلى x. x هو العنوان. انها مثل 33 شارع أكسفورد، أو OX1. ونجم س يعني يذهب إلى أن ومعالجة وضع ما هناك؟ 42. ذلك الواقع، هذا هو بالضبط ما فعله نيك. بدأ معها من قبل، أساسا، عقليا مشيرا بإصبع الاتهام إلى س، في أعقاب السهم إلى مربع أبيض على اليد اليمنى الجانب، ويضع رقم 42 هناك. ولكن بعد ذلك حصلت الأمور خطورة قليلا، أليس كذلك؟ على وشك أن يفقد رأسه في بينكي. نجمة Y يساوي 13، والحظ السيئ، يعني ماذا؟ حتى وسائل ذ Star الذهاب إلى العنوان في ص. ولكن ما هو العنوان في ذ؟ حسنا، انها قيمة القمامة، أليس كذلك؟ وجهت بأنها علامة استفهام. ولفت نيك بأنها السهم ضافر. وبمجرد محاولة ل القيام نجمة ذ، قائلا نذهب الى هناك، ولكن ليس هناك شرعية عنوان، انها بعض موقع مزيف، البرنامج سوف تحطم الطائرة. ورئيس بينكي وسوف لتطير هنا، كما فعلت. حتى في نهاية المطاف، وهذا البرنامج كان مجرد خطأ خارج مسطح. كان برنامج عربات التي تجرها الدواب. وأنها بحاجة إلى أن تكون ثابتة. والطريقة الوحيدة، حقا، لاصلاحها سيكون، على سبيل المثال، هذا الخط، ونحن لم تحصل حتى، ل تحطمت البرنامج في وقت قريب جدا. ولكن إذا كنا لإصلاح هذا، ما تأثير لا يفعل ذ خ متساوية لها؟ كذلك، فإنه يشير أساسا y في مهما كانت قيمة x غير افتا في. حتى في قصة نيك، أو قصة بينكي، سواء x و y تم التأشير عليه على قطعة بيضاء من الذاكرة، بحيث أنه، أخيرا، عند لا نجم ذ يساوي 13 مرة أخرى، كنت في نهاية المطاف في وضع 13 الموقع المناسب. لذلك كل من هذه الخطوط هي تماما مشروعة، عدا هذا واحد، عندما حدث ذلك قبل أن تعيين الواقع ذ بعض القيمة. الآن والحمد لله، كنت لا أن العقل من خلال جميع هذه الأنواع من القضايا بنفسك. اسمحوا لي المضي قدما وفتح نافذة طرفية هنا وفتح، لمجرد لحظة، برنامج السوبر القصير الذي هو نوع من العبث أيضا. انها قبيحة. أنه لا يحقق أي شيء مفيد. ولكنها لا تثبت القضايا من الذاكرة، لذلك دعونا نلقي نظرة. الرئيسية، سوبر بسيطة. يبدو أنه يدعو وظيفة، و ثم يعود 0. انها نوع من الصعب أن تصل هذه الفوضى. لذلك الأصل هو جيد جدا، حتى الآن. حتى و هي إشكالية. وفقط لم يضع الكثير الجهد في اسمها هنا، للحفاظ على التركيز على التعليمات البرمجية. و لديه خطين. ودعونا نرى ما يحدث الآن فصاعدا. ذلك من جهة here-- واسمحوا لي أن هذا يتفق مع سابقة example-- من جهة، الجانب الأيسر هو فعل ما، في اللغة الإنجليزية؟ انها is-- الجمهور: إنشاء المؤشر. J. DAVID مالان: إنشاء مؤشر إلى int واصفا إياه X. حتى انها لخلق واحدة من تلك الصناديق وأظل الرسم على الشاشة التي تعمل باللمس. والآن، على اليد اليمنى الجانب، malloc، بالطبع، تم تخصيص جزء من الذاكرة. ومجرد أن يكون واضحا، كيف الكثير من الذاكرة هي أنه على ما يبدو تخصيص، إذا كنت فقط نوع من تفعل الرياضيات هنا؟ لذلك فمن 40 بايت. وأنا أعلم أن فقط لأنني أعرف ل كثافة العمليات، على الأجهزة CS50، على الأقل، هو أربعة بايت. لذلك 10 مرة 4 هو 40. لذلك هذا هو تخزين وس، عنوان للخروج الأول من 40 [إينتس] أن تم تخصيص مساحة الوراء، إلى الوراء، إلى الوراء، إلى الوراء. وهذا ما هو مفتاح حول malloc. لأنها لا تأخذ ذاكرة صغيرة هنا، قليلا هنا، قليلا هنا. فهو يوفر لك قطعة واحدة من الذاكرة، متاخم، من التشغيل النظام. الآن ماذا عن هذا، × القوس 10 يساوي 0؟ خط التعسفي من التعليمات البرمجية. أنه لا يحقق أي شيء مفيد. ولكن من المثير للاهتمام، لأن العاشر قوس 10--؟ نعم؟ الجمهور: [غير مسموع]؟ J. DAVID مالان: × القوس 10 ليس من الضروري أن تكون لاغية. التفاصيل اغية يأتي دور فقط مع السلاسل، في نهاية سلسلة. ولكن فكرة جيدة. كيف كبيرة هو هذه المجموعة، حتى على الرغم من أنني قد خصصت 40 بايت؟ انها من 0 إلى تسعة، أليس كذلك؟ انها 10 [إينتس]، المجموع. 40 بايت، ولكن 10 [إينتس]، فهرسة من 0 إلى 0. فما هو ذلك x قوس 10؟ انها فعلا بعض قيمة القمامة مجهولة. انها الذاكرة التي لا تنتمي لي. أنا لا ينبغي أن لمس بايت رقم 41، 42، 43، 44. انا ذاهب قليلا بعيدا جدا. وفي الواقع، إذا كنت تشغيل هذا البرنامج، فإنه قد تحطم بشكل جيد جدا. لكن في بعض الأحيان، وسوف نحصل محظوظ. وذلك فقط لإثبات this-- وبصراحة، أنت لا تعرف أبدا قبل لا it-- دعونا تشغيل هذا. لم تتحطم في الواقع. ولكن إذا قمت بتغيير هذا، ل المثال، أن يكون مثل 1،000، لجعل هذا حقا متعمدا، دعونا نرى اذا كنا نستطيع الحصول عليه إلى تعطل هذا الوقت. OK، لم تحطم. كيف حوالي 100،000؟ دعونا تغييره، ثم أعد عليه الآن. موافق. تفو. كل الحق. لذلك على ما يبدو، مرة أخرى، هذه شرائح الذاكرة، إذا جاز التعبير، هي كبيرة بشكل معقول، حتى نتمكن من الحصول على الحظ مرارا وتكرارا. لكن في نهاية المطاف، وبمجرد الحصول سخيف وتذهب بعيدا حقا على الشاشة، كنت على اتصال الذاكرة حقا، حقا لا ينتمي لك. ولكن بصراحة، هذه أنواع من الحشرات تسير أن تكون أصعب وأصعب لمعرفة بنفسك. ولكن ولله الحمد، والمبرمجين، لدينا الأدوات التي تسمح لنا أن نفعل هذا بالنسبة لنا. لذلك هذا هو، ربما، واحد من أبشع برامج، حتى أقبح من الناتج جدب و. ولكن لديها دائما خط أو اثنين التي هي مفيدة عظمى. Valgrind هو البرنامج الذي يساعد لا تصحيح البرنامج، في حد ذاته، ولكن تجد المتعلقة بالذاكرة مشاكل، على وجه التحديد. فإنه سيتم تلقائيا تشغيل التعليمات البرمجية لل كنت والبحث عن اثنين على الأقل من الأشياء. واحد، لم تفعل شيئا عرضي مثل الذاكرة اتصال التي لا تنتمي لك؟ وسوف تساعدك على العثور على تلك الحالات. واثنين، وسوف يساعد تجد ما يسمى تسرب الذاكرة، التي لدينا تجاهل تماما، بسذاجة، لبعض الوقت وبسعادة. ولكن كما تبين، كل هذه المرة، كلما كنت قد دعا في getString الكثير من برامجنا، كنت طالبا في التشغيل نظام للذاكرة، ولكن عليك أن تذكر أي من أي وقت مضى يعطيها مرة أخرى، والقيام unalloc، أو مجانا، كما يطلق عليه. لا، لأننا أبدا يطلب منك القيام بذلك. ولكن كل هذا الوقت، وبرامج كنت قد تم الكتابة في C وقد تسرب الذاكرة، يسأل التشغيل نظام أكثر وأكثر الذاكرة للجمل وغيرها، ولكن لم يسلم مرة أخرى. والآن هذا هو قليلا من التبسيط، ولكن إذا كنت قد أي وقت مضى تشغيل ماك الخاص بك أو جهاز الكمبيوتر الخاص بك لبعض الوقت، وفتح الكثير من البرامج، ربما إغلاق البرامج، وعلى الرغم من أن لديك لم تحطمت جهاز الكمبيوتر، الأمر يزداد أبطأ كثيرا، كما لو انها حقا تستخدم الكثير من الذاكرة أو الموارد، على الرغم من، إذا لم تكن حتى لمس لوحة المفاتيح، يمكن أن be-- كنه لم يستطع always-- أن تكون البرامج التي تقوم بتشغيل هم أنفسهم تسرب الذاكرة. وهم يتساءلون نظام التشغيل لأكثر و المزيد من الذاكرة، ولكن نسيان ذلك، ليس في الواقع استخدامه، ولكن لذا أخذ الذاكرة بعيدا من البرامج الأخرى التي قد ترغب في ذلك. لذلك هذا هو التفسير الشائع. الآن هنا حيث لValgrind الإخراج هو تماما فظيعة لتلك أقل وأكثر راحة على حد سواء. ولكن مثيرة للاهتمام الاشياء هو الحق حتى هنا. انها تقول لي الكتابة غير صالح لل حجم أربعة يحدث في هذا البرنامج، على وجه الخصوص، في سطر 21 من memory.c. إذا ذهبت إلى خط 21، HM، هناك بالفعل هو الكتابة غير صالح من حجم الأربعة. لماذا حجم أربعة؟ حسنا، هذا number-- و يمكن أن يكون anything-- هو عدد صحيح. لذلك فمن أربعة بايت. لذلك أنا أضع أربعة بايت حيث أنهم لا ينتمون. هذا ما Valgrind في الواقع هو قول لي. وعلاوة على ذلك، فإنه سيتم أيضا قل لي، كما سنرى، كما تقوم بتشغيل هذا في pset في المستقبل، إذا و عندما كنت قد تسربت الذاكرة، والتي كانت في الواقع لدي، لأنني طالب malloc، ولكن لدي يست في الواقع ودعا، في هذه الحالة، مجانا، وسنرى في نهاية المطاف هو عكس malloc. وحتى الآن، كما أعتقد، على سبيل المثال النهائي. لذلك هذا واحد هو أكثر من ذلك بقليل غامضة، لكنه ربما أكبر سبب ل كن حذرا مع الذاكرة، والسبب في أن العديد من البرامج و / أو خوادم الويب، حتى يومنا هذا، تم الاستيلاء عليها من قبل الأشرار في مكان ما على شبكة الانترنت الذين هم بطريقة أو بأخرى إرسال حزم وهمية على الخادم الخاص بك في محاولة لتقديم تنازلات حساباتك، أو أخذ البيانات الخاصة بك، أو مجرد يستغرق عادة أكثر من آلة. تجاوز سعة المخزن المؤقت، كما يوحي اسمها، وسيلة لا تفيض عدد صحيح، ولكن العازلة. ومنطقة عازلة هو مجرد وسيلة الهوى للقول انها حفنة من الذاكرة. وبالفعل، اتصلت سلسلة قبل العازلة، بدلا من ق. لأنه إذا انها العازلة، مثل بالمعنى يوتيوب، أو في أي وقت كنت أشاهد شريط فيديو، كنت قد رأيت التخزين المؤقت كلمة، نقطة، نقطة، نقطة. إنه أمر مزعج بشكل لا يصدق. وهذا يعني فقط أن لاعب الفيديو تحاول تحميل الكثير بايت، والكثير من وحدات البايت من الفيديو من الإنترنت. لكنها بطيئة، لذلك يحاول لتحميل حفنة منهم لملء منطقة عازلة، وعاء، بحيث لديك ما يكفي من وحدات البايت التي في وسعها ثم تظهر لك الفيديو، دون التوقف باستمرار. ولكن تبين، يمكنك لديك عازلة لهذه كبيرة. ولكن في محاولة لوضع هذه البيانات في الكثير ذلك، وأشياء سيئة جدا يمكن أن يحدث. هكذا على سبيل المثال، دعونا ننظر في هذه دعابة النهائية للمثال. هذا هو برنامج آخر التي، للوهلة الأولى، لا تفعل شيئا مفيدا عظمى. انها حصلت على وظيفتها الرئيسية أن يدعو تلك الوظيفة، و. وتلك الوظيفة، و، هنا، لديه مجموعة شار، ودعا ج، من حجم 12. ثم انها تستخدم هذا دعت وظيفة جديدة strncpy. اتضح أنه مع هذا بسيط، خط بسيط من التعليمات البرمجية، فقط خطين، حققنا برنامجي كله، وبالتالي، يا الكمبيوتر بأكمله، ولدي حساب المستخدم، وبلدي من الصعب يحتمل أن تكون عرضة لدفع أي شخص من يدري وجيدة بما يكفي لتشغيل هذا البرنامج مع سطر الأوامر معين حجة. وبعبارة أخرى، إذا كان هذا الرجل سيئة يضع داخل argvargv [1] عن طريق كتابة في لوحة المفاتيح وضعت خصيصا للغاية سلسلة، وليس اي بي سي، 123، ولكن أساسا، الرموز الثنائية التي تمثل قابل للتنفيذ رمز، برنامج انه او انها كتب، مع هذا البرنامج البسيط، الذي هو ممثل الآلاف من البرامج التي هي عرضة بالمثل، نحسب، انه أو انها يمكن حذف جميع في نهاية المطاف الملفات الموجودة على القرص الصلب، والحصول على امض موجه بحيث انه أو انها يمكن اكتب الأوامر من تلقاء نفسها، البريد الإلكتروني جميع الملفات لنفسي. أي شيء يمكنني القيام به، وقال انه أو أنها يمكن أن تفعل مع هذا الرمز. ونحن لن يحل تماما هذه بعد. وفي الواقع، انه سيكون ل إشراك صورة صغيرة من هذا القبيل، والتي سنقوم قريبا لفهم كل ما هو أفضل. ولكن لهذا اليوم، دعونا تنتهي يوم ما هو، ونأمل، وأكثر قليلا مفهومة XKCD نكتة، حتى نستأنف في المرة القادمة. كل الحق. نراكم يوم الاربعاء. [عزف الموسيقى] المتحدث: والآن، عميق الأفكار، من خلال Daven فارنهام. الذاكرة هي مثل القفز الى كومة من أوراق ذهبية بعد ظهر يوم الاحد. تهب الرياح، القذف الخاصة بك hair-- أوه، افتقد أيام when-- [ضحك]