[Powered by Google Translate] [5 सप्ताह] [डेविड जे Malan हार्वर्ड विश्वविद्यालय] [यह CS50 है. - CS50.TV] यह CS50, 5 सप्ताह है. आज और इस सप्ताह हम फोरेंसिक की दुनिया का एक छोटा सा परिचय इस समस्या के संदर्भ में 4 सेट. आज एक संक्षिप्त व्याख्यान हो सकता है क्योंकि वहाँ यहाँ में एक विशेष घटना के बाद होगा. तो हम एक तिरछी नज़र रखना और दोनों छात्रों और एक जैसे माता पिता को आज तंग चीजें हैं कि क्षितिज पर हैं में से कुछ के साथ. उनमें से, सोमवार के रूप में, आप कुछ और सहपाठियों होगा. EDX, हार्वर्ड और एमआईटी OpenCourseWare और अधिक के लिए नए ऑनलाइन पहल, सोमवार, जो सोमवार आने का मतलब पर हार्वर्ड परिसर पर शुरू आप, पिछली गणना के रूप में है, 86,000 अतिरिक्त सहपाठियों जो CS50 व्याख्यान और वर्गों के साथ साथ पालन किया जाएगा और walkthroughs और समस्या सेट. और इस के भाग के रूप में, आप CS50 और अब CS50x के उद्घाटन वर्ग का सदस्य बन जाएगा. इस के हिस्से के रूप में अब एहसास है कि वहाँ कुछ upsides के रूप में अच्छी तरह से हो जाएगा. छात्रों की भारी संख्या के लिए इस बात के लिए तैयार हो, इतना ही कहना है कि भले ही हम 108 TFS और सीए, यह काफी अच्छा छात्र - शिक्षक अनुपात में एक बार हम 80,000 छात्रों के हिट नहीं है. हम इतने सारे समस्या ग्रेडिंग सेट मैन्युअल रूप से नहीं जा रहे हैं, तो समस्या सेट में इस सप्ताह शुरू CS50 जांच हो जाएगा, जो करने के लिए एक कमांड लाइन उपयोगिता उपकरण के भीतर जा रहा है है कि आप एक बार आप इसे बाद में इस सप्ताह के अंत में अद्यतन करने के लिए मिल जाएगा. आप के लिए अपने खुद के pset पर एक आदेश, check50, चलाने के लिए सक्षम हो जाएगा, और आप त्वरित प्रतिक्रिया के रूप में मिलता है कि अपने कार्यक्रम के सही या गलत है विभिन्न डिजाइन विनिर्देशों के अनुसार कि हम प्रदान की है. समस्या सेट विनिर्देश में उस पर और अधिक. CS50x सहपाठियों के रूप में अच्छी तरह से उपयोग किया जाएगा. समस्या 4 सेट फोरेंसिक सब के बारे में है, और इस pset वास्तव में कुछ सामान वास्तविक जीवन से प्रेरित था जब मैं स्कूल में था स्नातक मैं जिससे थोड़ी देर के लिए interned मिडिलसेक्स काउंटी जिला अटार्नी कार्यालय के साथ फोरेंसिक काम कर रही उनके नेतृत्व फोरेंसिक अन्वेषक के साथ. क्या होता है इस राशि के रूप में मुझे लगता है कि मैं पिछले कुछ हफ्तों उल्लेख किया है, मास राज्य पुलिस या दूसरों में आ जाएगा, वे हार्ड ड्राइव और सीडी और फ्लॉपी डिस्क और इस तरह की तरह बातें छोड़ जाएगा, और तो फोरेंसिक कार्यालय के लक्ष्य पता लगाने के लिए किया गया था कि क्या वहाँ था या किसी तरह के सबूत नहीं था. यह विशेष अन्वेषण यूनिट था, तो यह सफेद कॉलर अपराध था. यह अपराधों के अधिक परेशान प्रकार, डिजिटल मीडिया के किसी तरह का कुछ भी शामिल था. यह पता चला है कि, नहीं है कि कई लोगों को एक ईमेल लिखने के लिए कह "मैंने ऐसा किया था." तो अक्सर, इन फोरेंसिक खोजों कि सभी ज्यादा फल बारी नहीं किया था, लेकिन कभी कभी लोगों को ऐसी ईमेल लिखना होगा. तो कभी कभी, के प्रयासों को पुरस्कृत किया गया. लेकिन नेतृत्व करने के लिए इस फोरेंसिक pset, हम pset4 में शुरू हो ग्राफिक्स के एक सा. आप शायद इन बातों के लिए दी ले - इन दिनों - JPEGs, GIFs, और इस तरह. लेकिन अगर आप वास्तव में इसके बारे में सोचते हैं, एक छवि, ज्यादा रोब चेहरे की तरह, डॉट्स या पिक्सल के एक दृश्य के रूप में मॉडलिंग की जा सकता है. रोब चेहरे के मामले में रंगों के सभी प्रकार है, और हम व्यक्ति डॉट्स, अन्यथा पिक्सेल के रूप में जाना जाता है देखने के लिए शुरू कर दिया है, एक बार हम ज़ूम इन करने के लिए शुरू कर दिया लेकिन अगर हम दुनिया के एक बिट को सरल बनाने और बस का कहना है कि इस काले और सफेद में रोब है, काले और सफेद का प्रतिनिधित्व करते हैं, हम सिर्फ द्विआधारी का उपयोग कर सकते हैं. और अगर हम द्विआधारी का उपयोग करने के लिए जा रहे हैं, 1 या 0, हम इस एक ही छवि को व्यक्त कर सकते हैं रोब बिट्स की इस पद्धति के साथ मुस्कुराते चेहरे के. 11000011 सफेद, सफेद, काले, काले, काले, काले, सफेद, सफेद का प्रतिनिधित्व करता है. और इसलिए यह एक बड़ी छलांग तो नहीं है रंगीन फोटो के बारे में बात शुरू करने के लिए, चीज़ें है कि आप फेसबुक पर देख सकते हैं या एक डिजिटल कैमरा के साथ ले लेनी चाहिए. लेकिन निश्चित रूप से जब यह रंग करने के लिए आता है, तो आप अधिक बिट्स की जरूरत है. और तस्वीरों की दुनिया में काफी आम 1-बिट रंग का उपयोग नहीं है, के रूप में यह पता चलता है, लेकिन 24 बिट रंग, जहाँ आप वास्तव में रंगों के लाखों मिलता है. इसलिए मामले में के रूप में जब हम पर रोब आंख में तेजी से बढ़ी है, कि अलग रंगीन संभावनाओं के लाखों के किसी भी नंबर था. तो हम समस्या 4 सेट के रूप में के रूप में अच्छी तरह से walkthrough में इस परिचय देंगे, जो आज सामान्य 2:30 के बजाय 3:30 पर शुक्रवार को यहाँ व्याख्यान की वजह से होगा. लेकिन हमेशा की तरह कल के रूप में वीडियो ऑनलाइन हो जाएगा. हम भी आप अन्य फ़ाइल स्वरूप मिलवा देंगे. यह जानबूझकर पहले डराना देखने का मतलब है, लेकिन यह सिर्फ एक सी struct के लिए कुछ दस्तावेज है. यह पता चला है कि माइक्रोसॉफ्ट साल पहले इस प्रारूप को लोकप्रिय बनाने में मदद बिटमैप फ़ाइल स्वरूप, BMP, और यह एक सुपर सरल, रंगीन आलेखीय फाइल प्रारूप था बुलाया है कि कुछ समय के लिए इस्तेमाल किया गया था और डेस्कटॉप पर वॉलपेपर के लिए कभी भी. यदि आप Windows XP और रोलिंग पहाड़ियों और नीले आकाश के लिए वापस लगता है, कि आम तौर पर एक bmp या बिटमैप छवि था. बिटमैप्स हमारे लिए मजाक कर रहे हैं क्योंकि वे थोड़ा और अधिक जटिलता है. यह 0s और 1s के इस ग्रिड के रूप में सरल रूप में काफी नहीं है. इसके बजाय, आप एक फ़ाइल के शुरू में एक शीर्षक की तरह बातें है. तो दूसरे शब्दों में, एक bmp फ़ाइल के अंदर में 0s और 1s की एक पूरी गुच्छा है, लेकिन वहाँ कुछ अतिरिक्त और वहाँ में 0s 1s है. और यह पता चला है कि हम क्या शायद के लिए साल के लिए दी ले लिया है - डॉक्टर या. xls या एमपी 3, जैसे फ़ाइल स्वरूपों mp4, जो फ़ाइल स्वरूपों कि आप से परिचित हैं - यह भी क्या करता है एक फ़ाइल स्वरूप होने का मतलब है, क्योंकि दिन के अंत में इन फ़ाइलों के सभी हम सिर्फ 0s और 1s है का उपयोग करें. और शायद उन 0s और 1s ASCII के माध्यम से एबीसी या तरह का प्रतिनिधित्व करते हैं, लेकिन दिन के अंत में, यह अभी भी सिर्फ 0s और 1s. तो मनुष्य के बस कभी - कभी एक नया फ़ाइल स्वरूप का आविष्कार करने का फैसला जहां वे प्रमाण के अनुसार करना बिट्स के पैटर्न वास्तव में क्या मतलब होगा. और इस मामले में, लोग जो बिटमैप फ़ाइल प्रारूप तैयार ने कहा कि एक बिटमैप फ़ाइल में बहुत पहली बाइट के रूप में वहाँ ऑफसेट 0 द्वारा चिह्नित, वहाँ कुछ cryptically नाम चर बुलाया bfType होने जा रहा है, जो सिर्फ बिटमैप फ़ाइल प्रकार के लिए खड़ा है, बिटमैप फ़ाइल के प्रकार क्या है. तुम शायद दूसरी पंक्ति है कि 2 ऑफसेट, बाइट संख्या 2 से अनुमान कर सकते हैं, 0s और 1s के एक पैटर्न है कि क्या प्रतिनिधित्व करता है? कुछ का आकार. और यह वहाँ से चला जाता है. तो समस्या 4 सेट में, आप इन बातों में से कुछ के माध्यम से चला गया हो जाएगा. हम अंत नहीं है उन सभी के बारे में देखभाल. नोटिस लेकिन यह 54 बाइट के आसपास दिलचस्प पाने के लिए शुरू: rgbtBlue, हरे और लाल. यदि आपने कभी सुना है परिचित करा आरजीबी - लाल, हरे, नीले - यह है कि एक संदर्भ है क्योंकि यह पता चला है आप इंद्रधनुष के सभी रंगों पेंट कर सकते हैं लाल और नीले और हरे रंग के कुछ संयोजन के साथ. और वास्तव में, कमरे में माता - पिता को जल्द से जल्द प्रोजेक्टर के कुछ याद हो सकता है. इन दिनों, तुम सिर्फ एक उज्ज्वल प्रकाश एक लेंस के बाहर आने को देखने के लिए, लेकिन दिन में वापस आप लाल लेंस, नीले लेंस, और हरे रंग लेंस था, और साथ में वे एक स्क्रीन के उद्देश्य से और एक रंगीन चित्र का गठन किया है. और अक्सर, मध्य विद्यालयों और उच्च विद्यालयों उन लेंस कभी तो थोड़ा तिरछा है, ताकि आप डबल या ट्रिपल छवियों को देखने की तरह थे. लेकिन उस विचार था. आप लाल और हरे और नीले प्रकाश एक चित्र चित्र था. और कि एक ही सिद्धांत कंप्यूटर में प्रयोग किया जाता है. तो आप के लिए तो समस्या में चुनौतियों के बीच 4 सेट करने के लिए कुछ बातें हो जा रहे हैं. एक करने के लिए वास्तव में एक छवि का आकार है, 0s ​​और 1s के एक पैटर्न में ले, 0s और 1s की हिस्सा इस तरह एक संरचना में क्या प्रतिनिधित्व करते हैं बाहर आंकड़ा, और फिर बाहर आंकड़ा कैसे पिक्सल को दोहराने के लिए - लाल, नीले, हरे - अंदर इतना है कि, जब एक तस्वीर इस तरह शुरू में लग रहा है यह इस तरह है कि बाद के बजाय लग सकता है. अन्य चुनौतियों के बीच भी हो सकता है कि आप एक फोरेंसिक छवि सौंप दिया जाएगा जा रहा है एक डिजिटल कैमरे से एक वास्तविक फ़ाइल का. और कि कैमरे पर, एक बार एक समय पर, तस्वीरों की एक पूरी गुच्छा थे. समस्या हम गलती से मिट गया है या छवि किसी तरह भ्रष्ट था. बुरी बातें डिजिटल कैमरों के साथ होता है. और इसलिए हम जल्दी से आप के लिए है कि कार्ड के 0s और 1s बंद की नकल की है, एक बड़ी फ़ाइल में उन सभी को बचा लिया, और फिर हम उन्हें समस्या में हाथ होगा 4 सेट इतनी है कि आप सी में एक कार्यक्रम के साथ जो उन JPEGs के सभी को ठीक करने के लिए लिख सकते हैं, आदर्श. और यह पता चला कि JPEGs, भले ही वे एक जटिल फ़ाइल स्वरूप के कुछ कर रहे हैं - वे इस मुस्कुराते हुए चेहरे से बहुत जटिल कर रहे हैं - यह पता चला है कि हर JPEG 0s और 1s के एक ही पैटर्न के साथ शुरू होता है. तो का उपयोग करते हुए, अंततः, एक समय या पाश या इसी तरह के लिए एक पाश, आप सभी 0s और 1s पर इस फोरेंसिक छवि में पुनरावृति कर सकते हैं, और हर बार जब आप विशेष पैटर्न है कि समस्या सेट विनिर्देश में परिभाषित किया गया है, आप यहाँ लगता है बहुत अधिक संभावना के साथ है, एक JPEG की शुरुआत कर सकते हैं. और जैसे ही आप एक ही पैटर्न बाइट्स की कुछ संख्या पाते हैं या किलोबाइट्स या मेगाबाइट्स बाद, आप यहाँ मान सकते हैं एक दूसरे JPEG है, तस्वीर मैं पहले एक के बाद लिया. मुझे कि पहली फ़ाइल पढ़ना बंद करो, इस नए लेखन शुरू, और pset4 के लिए अपने कार्यक्रम के उत्पादन के रूप में कई के रूप में 50 JPEGs होने जा रहा है. और अगर यह 50 JPEGs नहीं है, आप एक पाश के एक सा है. यदि आप JPEGs की एक अनंत संख्या है, तो आप एक अनंत लूप है. तो वह भी काफी एक आम का मामला हो जाएगा. तो है कि क्या क्षितिज पर है. हमारे पीछे 0 क्विज, मेरे प्रति ईमेल पता है कि सदा ही लोगों को, जो दोनों खुश हैं, तटस्थ, और प्रश्नोत्तरी चारों ओर में दुखी 0 समय की तरह. और कृपया मुझे बाहर तक पहुँचने के लिए, सिर TF Zamyla, अपने खुद के TF करते हैं, या सीए के एक है कि आप जानते हैं कि अगर आप चर्चा करना चाहते हैं कैसे चीजें गया. ऐसा करने के लिए माता पिता के कमरे में यहाँ प्रभावित, CS50 पुस्तकालय क्या है? [हँसी] अच्छा काम किया. CS50 पुस्तकालय क्या है? हाँ. >> [छात्र] यह कोड का एक सेट पूर्व लिखित [अश्राव्य] ठीक है, अच्छा है. यह कोड का एक सेट पूर्व लिखित कि हम स्टाफ लिखा है, हम आप के लिए प्रदान करते हैं, कि कुछ आम कार्यक्षमता प्रदान करता है, मुझे एक स्ट्रिंग की तरह सामान, मुझे पाने के लिए एक int सभी कार्य करता है कि यहाँ सूचीबद्ध हैं. अब शुरू, हम वास्तव में इन प्रशिक्षण के पहियों से दूर ले शुरू करते हैं. हम करने के लिए आप से दूर एक स्ट्रिंग लेने के लिए शुरू करने के लिए जा रहे हैं, जो याद क्या वास्तविक डेटा प्रकार के लिए सिर्फ एक पर्याय था? >> [कई छात्रों] चार *. चार *. माता पिता के लिए, कि शायद [बनाता whooshing ध्वनि] था. यह अच्छा है. चार * हम सभी को और अधिक स्क्रीन पर देखने के रूप में हम अपनी शब्दावली से तार हटाने शुरू करेंगे, कम से कम जब यह वास्तव में कोड लिखने के लिए आता है. इसी तरह, हम इन कार्यों में से कुछ का उपयोग करने के लिए ज्यादा के रूप में बंद कर देंगे क्योंकि हमारे कार्यक्रमों को और अधिक परिष्कृत हो जा रहे हैं. के बजाय सिर्फ प्रोग्राम लिखने कि शीघ्र पलक के साथ वहाँ बैठो, उपयोगकर्ता के लिए इंतज़ार कर में कुछ लिखें, तो आप कहीं और से अपनी जानकारी मिल जाएगा. उदाहरण के लिए, आप उन्हें स्थानीय हार्ड ड्राइव पर बिट्स की एक श्रृंखला से मिल जाएगा. आप के बजाय एक नेटवर्क कनेक्शन से भविष्य में उन्हें मिल जाएगा, कहीं कुछ वेबसाइट नहीं है. इसलिए पहली बार के लिए वापस इस परत छील और CS50 उपकरण खींच और इस cs50.h नामक फाइल है, जो # सप्ताह के लिए किया गया है सहित, लेकिन वास्तव में देखने के लिए क्या इस के अंदर है. नीले रंग में फ़ाइल के ऊपर टिप्पणी की एक पूरी गुच्छा है: वारंटी जानकारी और लाइसेंस. इस सॉफ्टवेयर में एक आम प्रतिमान की तरह है क्योंकि सॉफ्टवेयर का एक बहुत इन दिनों है क्या खुला स्रोत कहा जाता है, जिसका मतलब है कि किसी को कोड लिखा है और यह आज़ादी से उपलब्ध कराया नहीं बस चलाने के लिए उपयोग करने के लिए है, लेकिन वास्तव में पढ़ सकते हैं और बदल और अपने खुद के काम में एकीकृत. तो यह है कि क्या आप का उपयोग किया गया है, हालांकि एक बहुत छोटे रूप में खुला स्रोत सॉफ्टवेयर,. अगर मैं टिप्पणी पिछले नीचे स्क्रॉल, हालांकि, हम कुछ अधिक परिचित बातें देखना शुरू करेंगे. यहाँ शीर्ष कि cs50.h फ़ाइल हेडर फाइल की एक पूरी गुच्छा शामिल सूचना. इनमें से अधिकांश, हम पहले नहीं देखा है, लेकिन एक परिचित है. इनमें से कौन, हम संक्षेप में यद्यपि देखा है, इस प्रकार अब तक? >> [छात्र] मानक पुस्तकालय. हाँ, मानक पुस्तकालय. stdlib.h malloc है. एक बार जब हम गतिशील स्मृति आवंटन के बारे में बात करना शुरू कर दिया, जो हम वापस करने के लिए अगले सप्ताह के रूप में अच्छी तरह से आ जाएगा, हम उस फ़ाइल सहित शुरू कर दिया. यह पता चला है कि वास्तव में bool और सच्चे और झूठे सी दर असल में मौजूद नहीं है जब तक आप इस फाइल को यहाँ शामिल हैं. हम सप्ताह के लिए stdbool.h शामिल किया गया है इतना है कि आप एक bool, सही है या गलत. की धारणा का उपयोग कर सकते हैं इस के बिना, आप यह नकली की तरह है और एक int का उपयोग करना चाहते हैं और बस मनमाने ढंग से लगता है कि 0 झूठी है और 1 सच है. अगर हम आगे नीचे स्क्रॉल, यहाँ एक स्ट्रिंग की हमारी परिभाषा है. यह पता चला है, जैसा कि हम पहले कहा है, कि जहां इस स्टार है वास्तव में कोई फर्क नहीं पड़ता. तुम भी अंतरिक्ष के आसपास हो सकता है. हम इस सेमेस्टर के रूप में किया गया है इसे बढ़ावा देने के लिए स्पष्ट कर दूं कि सितारा प्रकार के साथ क्या करना है, लेकिन बस के रूप में आम का एहसास है, अगर छोटे से अधिक एक आम नहीं है, यह वहाँ रखा है, लेकिन कार्यात्मक यह एक ही बात है. लेकिन अब अगर हम नीचे आगे पढ़ने के लिए, चलो GetInt पर एक नज़र रखना क्योंकि हम इस सेमेस्टर से पहले कुछ और है कि शायद पहली बार इस्तेमाल किया. यहाँ GetInt है. यह क्या है? >> [छात्र] एक प्रोटोटाइप. >> यह सिर्फ एक प्रोटोटाइप है. अक्सर, हम हमारे में से सबसे ऊपर है पर प्रोटोटाइप डाल दिया है ग फ़ाइलों. लेकिन आप भी हेडर फाइलें, ज. फ़ाइलों में यह यहाँ एक तरह प्रोटोटाइप डाल सकते हैं इतना है कि जब आप कुछ कार्यों लिखना है कि आप अन्य लोगों के लिए उपयोग करने में सक्षम होना चाहता हूँ, जो वास्तव में CS50 पुस्तकालय के साथ मामला है, तुम नहीं केवल cs50.c की तरह कुछ में अपने कार्यों को लागू करने के लिए, आप भी उस फ़ाइल के शीर्ष पर नहीं है, लेकिन एक हैडर फ़ाइल के शीर्ष पर प्रोटोटाइप डाल दिया. तब उस हैडर फ़ाइल मित्रों और सहकर्मियों क्या शामिल # अपने खुद के कोड में शामिल हैं. यह सब समय तो, आप इन प्रोटोटाइप के सभी शामिल है, प्रभावी ढंग से अपनी फ़ाइल के शीर्ष पर है, लेकिन इस तरह के तंत्र शामिल है, जो अपने आप में अनिवार्य रूप से प्रतियां और चिपकाता इस फ़ाइल. यहाँ कुछ काफी विस्तृत दस्तावेज है. हम बहुत ज्यादा के लिए दी गई है कि GetInt एक int हो जाता है ले लिया है, लेकिन यह निकलता है वहाँ कुछ कोने मामलों. क्या एक संख्या है कि जिस तरह से बहुत बड़ा है में उपयोगकर्ता प्रकार अगर, एक quintillion, कि सिर्फ एक int के अंदर फिट नहीं कर सकते? अपेक्षित व्यवहार क्या है? आदर्श रूप में, यह उम्मीद के मुताबिक है. तो इस मामले में, यदि आप वास्तव में ठीक प्रिंट पढ़ा, आप वास्तव में है कि अगर लाइन पढ़ा नहीं जा सकता है, यह रिटर्न INT_MAX देखेंगे. हम इस बारे में कभी बात नहीं की है, लेकिन अपने पूंजीकरण के आधार पर, यह क्या है शायद? [छात्र] एक निरंतर. >> यह एक निरंतर है. यह कुछ विशेष निरंतर है कि शायद एक उन हेडर फाइल के रूप में घोषित है कि फ़ाइल में उच्च है, और शायद INT_MAX लगभग 2 अरब की तरह कुछ है, जा रहा है कि क्योंकि हम किसी भी तरह कि कुछ दर्शाता है की जरूरत विचार गलत हो गया था, हम, हाँ, हमारे निपटान पर चार अरब संख्या: अप करने के लिए 2 अरब अरब -2, दे या ले. खैर, क्या प्रोग्रामिंग में आम है तुम सिर्फ एक उन लोगों की संख्या की चोरी, 0 हो सकता है, शायद 2 अरब, -2 शायद अरब, ताकि आप अपने संभावित मूल्यों का खर्च इतना है कि आप दुनिया के लिए प्रतिबद्ध कर सकते हैं कि अगर कुछ गलत हो जाता है, तो मैं इस सुपर बड़ा मूल्य वापसी करेंगे. लेकिन आप उपयोगकर्ता 234 की तरह गुप्त कुछ टाइप नहीं करना चाहते ..., एक बहुत बड़ी संख्या है. बदले में आप इसे सामान्यीकरण के रूप में एक निरंतर. तो सच में, अगर आप गुदा जा रहे थे कि पिछले कुछ हफ्तों से, किसी भी समय आप GetInt कहा जाता है, आप एक साथ किया गया है की जाँच करना चाहिए अगर हालत INT_MAX में उपयोगकर्ता प्रकार किया, या, और अधिक विशेष रूप से, GetInt वापसी INT_MAX किया था, क्योंकि अगर यह किया है, इसका मतलब है कि वास्तव में वे यह नहीं लिख था. इस मामले में कुछ गलत हो गया था. तो यह है कि क्या आम तौर पर एक प्रहरी मूल्य है, जो सिर्फ विशेष अर्थ के रूप में जाना जाता है. अब चलो. ग फ़ाइल में बारी. सी फ़ाइल उपकरण में कुछ समय के लिए ही अस्तित्व में है. और वास्तव में, यह उपकरण पूर्व संकलित कि बात हम वस्तु कोड कहा जाता है, में आप के लिए है लेकिन यह सिर्फ आप को कोई फर्क नहीं पड़ता, जहां यह है क्योंकि इस प्रणाली जानता है उपकरण: इस मामले में वह कहाँ है. चलो अब नीचे स्क्रॉल करने के लिए GetInt और देखने के लिए कैसे GetInt काम कर रहा है यह सब समय. यहाँ हम पहले से इसी तरह की टिप्पणी की है. मुझे सिर्फ कोड हिस्से पर में ज़ूम. और हम GetInt के लिए है जो निम्नलिखित है. यह कोई इनपुट लेता है. यह int देता है, जबकि () सच है, तो हम एक विचार अनंत लूप है, लेकिन शायद हम इस से बाहर किसी भी तरह तोड़ने या इस के भीतर से लौटने. चलो यह कैसे काम करता है देखना. हम पाश अंदर इस पहली पंक्ति में GetString का उपयोग किया, 166 लगते हैं. अब यह अच्छा अभ्यास है है क्योंकि किस परिस्थिति GetString लौट सकता है विशेष कीवर्ड रिक्त? >> [छात्र] अगर कुछ गलत हो जाता है. अगर कुछ गलत हो जाता है. और क्या गलत है जब आप GetString की तरह कुछ कह सकते हैं? हाँ. >> [छात्र] Malloc यह ints देने में विफल रहता है. हाँ. शायद malloc विफल रहता है. हुड के नीचे कहीं न कहीं, GetString malloc, जो स्मृति आवंटित बुला रहा है, जो कंप्यूटर की दुकान की मदद से सभी वर्णों की कि कुंजीपटल में उपयोगकर्ता प्रकार. लगता है और उपयोगकर्ता खाली समय का एक पूरी बहुत कुछ था और अधिक उदाहरण के लिए, टाइप, में, कंप्यूटर से अधिक वर्ण अरब से अधिक 2 वर्ण भी रैम है. GetString कि आप को दर्शाता करने में सक्षम हो गया है. यहां तक ​​कि अगर यह एक सुपर, सुपर असामान्य कोने मामला है, यह किसी भी तरह से इस संभाल करने में सक्षम हो गया है, और इसलिए GetString, अगर हम वापस चला गया और अपनी दस्तावेज़ीकरण पढ़ें, वास्तव में वापसी की खबरें करता है. तो अब अगर GetString रिक्त लौटने से विफल रहता है, GetInt को INT_MAX लौटने से असफल हो रहा है सिर्फ एक प्रहरी के रूप में. ये सिर्फ मानव सम्मेलनों हैं. केवल तरह आप जानते हैं कि यह मामला है प्रलेखन पढ़ने के द्वारा होता है. चलो जहां int वास्तव में मिल गया है के लिए नीचे स्क्रॉल. अगर मैं नीचे स्क्रॉल थोड़ा आगे, 170 लाइन में, हम इन लाइनों के ऊपर एक टिप्पणी है. हम 172 में एक int, पता, और एक चार, ग, और फिर इस नए कार्य की घोषणा, जो आप में से कुछ पहले sscanf, भर में ठोकर खाई है. यह स्ट्रिंग scanf के लिए खड़ा है. दूसरे शब्दों में, मुझे एक स्ट्रिंग दे और मैं यह ब्याज की जानकारी के टुकड़े के लिए स्कैन करेगा. इसका क्या मतलब है? मान लीजिए कि मैं कीबोर्ड पर, सचमुच, 123 टाइप करें और फिर हिट दर्ज करें. 123 के डेटा प्रकार जब GetString द्वारा लौटाए गए क्या है? >> [छात्र] स्ट्रिंग. यह स्पष्ट रूप से एक स्ट्रिंग, है ना? मैं एक स्ट्रिंग है. तो 123 वास्तव में है, बोली - गंदें शब्द बोलना, 123 के अंत में \ 0 के साथ. यह एक int नहीं है. यह एक संख्या नहीं है. यह एक नंबर की तरह दिखता है, लेकिन यह वास्तव में नहीं है. तो क्या GetInt करने के लिए क्या करना है? 123 0 \ - और किसी तरह एक वास्तविक पूर्णांक कनवर्टर के लिए इस्तेमाल किया जा सकता है कि सही करने के लिए छोड़ दिया स्ट्रिंग स्कैन है. तुम बाहर आंकड़ा कैसे यह करने के लिए कर सकते हैं. यदि आप pset2 के लिए वापस लगता है, तो आप शायद एक छोटे से सीज़र के साथ सहज हो गया या Vigenere, ताकि आप एक स्ट्रिंग पर पुनरावृति कर सकते हैं, तो आप घर का काम ints के साथ परिवर्तित कर सकते हैं. लेकिन बिल्ली, यह काम की एक पूरी बहुत कुछ है. फोन क्यों नहीं sscanf तरह एक समारोह है कि आप के लिए है कि नहीं करता? तो sscanf एक तर्क की आशा है - इस मामले में लाइन कहा जाता है, जो एक स्ट्रिंग है. फिर आप उद्धरण में निर्दिष्ट बहुत ही इसी तरह printf, क्या आप इस स्ट्रिंग में देखने की उम्मीद है. और मैं यहाँ कह रहा हूँ क्या है मैं एक दशमलव संख्या और शायद एक चरित्र को देखने की उम्मीद है. और हम क्यों यह बस एक पल में मामले देखेंगे. और यह पता चला है कि इस अंकन अब सामान की याद ताजा करती है हम के बारे में बात करना शुरू कर दिया सिर्फ एक हफ्ते पहले से अधिक. क्या है और n और ग हमारे लिए यहाँ क्या कर रही है? >> [छात्र] n और ग के पते का पता. हाँ. यह मुझे n और ग के पते का पता दे रही है. कि क्यों महत्वपूर्ण है? तुम्हें पता है कि सी में कार्यों के साथ, आप हमेशा एक मूल्य या सब पर कोई मूल्य नहीं लौट सकते हैं. आप एक int एक स्ट्रिंग, एक नाव, एक चार, जो कुछ भी है, या आप शून्य लौट सकते हैं लौट सकते हैं, लेकिन आप केवल एक बात ज़्यादा से ज़्यादा लौट सकते हैं. लेकिन यहाँ हम sscanf मुझे वापस जाने के लिए हो सकता है एक int, एक दशमलव संख्या चाहते हैं, और यह भी एक चार है, और इसलिए मैं एक क्षण में चार समझाता हूँ. आप को प्रभावी ढंग sscanf दो चीजों को वापस करने के लिए करना चाहते हैं, लेकिन वह सिर्फ सी. में संभव नहीं आप दो पतों में से गुजर रहा है कि चारों ओर काम कर सकते हैं क्योंकि जैसे ही आप एक समारोह दो पते हाथ, कि समारोह उनके साथ क्या कर सकते हैं? >> [छात्र] उन पतों को लिखें. यह उन पतों के लिए लिख सकते हैं. आप स्टार कार्रवाई का उपयोग कर सकते हैं और वहाँ उन पतों में से प्रत्येक के लिए जा सकते हैं. यह चर के मूल्यों को बदलने के लिए पिछले दरवाजे से इस तंत्र की है, लेकिन बहुत आम है इस मामले में, दो - सिर्फ एक जगह से अधिक है. अब मैं == 1 के लिए जाँच कर रहा हूँ तो और n लौटने कि अगर वास्तव में करता है, सच करने के लिए मूल्यांकन नोटिस. तो क्या चल रहा है? तकनीकी तौर पर, हम वास्तव में GetInt में ऐसा करना चाहते है. 123 बोली - गंदें शब्द बोलना - हम पार्स करने के लिए है, तो बात करने के लिए चाहते हैं, हम स्ट्रिंग पढ़ने के लिए चाहते हैं - और अगर ऐसा लगता है जैसे वहाँ एक संख्या है, हम क्या sscanf के लिए कह रहे हैं इस चर में मेरे लिए n - 123 - यह है कि संख्या में डाल दिया. तो फिर क्यों मैं वास्तव में था कि यह के रूप में अच्छी तरह से है? Sscanf कह रही है आप भी एक चरित्र के यहाँ मिल सकता है की भूमिका क्या है? [अश्राव्य छात्र प्रतिक्रिया] >> एक दशमलव बिंदु वास्तव में काम कर सकता है. चलो पकड़ है कि एक पल के लिए सोचा. और क्या? [छात्र] यह शून्य हो सकता है. >> अच्छा सोचा. यह अशक्त चरित्र हो सकता है. यह वास्तव में इस मामले में नहीं है. हाँ. >> [छात्र] ASCII. ASCII. या मुझे भी आगे सामान्यीकरण. % वहाँ ग त्रुटि जाँच के लिए ही है. हम वहाँ नहीं चाहते कि संख्या के बाद एक चरित्र हो सकता है, लेकिन क्या यह मुझे करने के लिए अनुमति देता है इस प्रकार है. यह पता चला है कि sscanf, इस उदाहरण में n और ग में मूल्यों यहाँ भंडारण के अलावा, यह भी क्या करता है यह चर की संख्या देता है यह अंदर मूल्यों डाल तो अगर आप केवल 123 में टाइप, तो केवल% d मैच करने के लिए जा रहा है, और केवल n 123 की तरह एक मूल्य के साथ जमा हो जाता है, और कुछ भी नहीं है ग में रखा जाता है. सी एक कचरा मान रहता है, तो बात करने के लिए - कचरा क्योंकि यह कुछ मूल्य के लिए कभी नहीं प्रारंभ किया गया है. तो उस मामले में, sscanf 1 देता है क्योंकि मैं उन संकेत की 1 आबादी, जो बड़े मामले में, मैं एक int है तो मैं लाइन मुक्त करने के लिए स्मृति मुक्त कि GetString वास्तव में आवंटित की है, और फिर मैं n लौटने के, और अगर आपने कभी सोचा है कि जहां पुन: प्रयास करें बयान से आता है, इसे यहीं से आता है. यदि हां, तो इसके विपरीत, मैं 123foo में लिखें - केवल पाठ के कुछ यादृच्छिक अनुक्रम sscanf संख्या, संख्या, संख्या, च को देखने के लिए जा रहा है, और यह 123 n में डाल रहा है, यह ग में च डाल दिया और फिर 2 लौटने के लिए जा रहा है. तो हम, sscanf व्यवहार, एक बहुत ही सरल तरीके की मूल परिभाषा का उपयोग - ठीक है, पहली नज़र में जटिल है, लेकिन दिन के अंत में काफी सरल तंत्र कह के एक int है और अगर ऐसा है, कि केवल एक चीज है कि मैंने पाया है? और यहाँ रहितसफेद विचार है. यदि आप sscanf के लिए प्रलेखन पढ़ा है, यह बताता है कि अगर आप खाली स्थान के एक टुकड़ा शामिल शुरुआत या अंत में, sscanf भी जो भी कारण के लिए उपयोगकर्ता, की अनुमति देगा, अंतरिक्ष बार 123 मारा और है कि वैध होगा. आप उपयोगकर्ता पर नहीं चिल्लाना सिर्फ इसलिए कि वे अंतरिक्ष बार मारा जाएगा शुरुआत या अंत में है, जो सिर्फ एक छोटे से अधिक उपयोगकर्ता के अनुकूल है. कोई तो सवाल GetInt पर? हाँ. >> [छात्र] क्या होगा अगर तुम सिर्फ एक चार में डाल दिया? अच्छा सवाल है. क्या होगा अगर तुम सिर्फ च की तरह एक चार में टाइप और कभी 123 टाइपिंग बिना हिट दर्ज? तुम्हें क्या लगता है कोड की इस पंक्ति का व्यवहार तो होगा? [अश्राव्य छात्र प्रतिक्रिया] हाँ, तो sscanf वह भी कवर क्योंकि उस मामले में, यह n या ग को भरने के लिए नहीं जा रहा है. यह करने के बजाय 0 लौटने के लिए, जो मामले में मैं भी उस परिदृश्य को पकड़ने जा रहा है क्योंकि मैं चाहता हूँ उम्मीद मूल्य 1 है. मैं केवल एक चाहते हैं और केवल एक ही बात भरा होना. अच्छा सवाल है. दूसरों? सही सभी. यहाँ के कार्यों के सभी के माध्यम से जाने नहीं, लेकिन एक है कि शेष ब्याज की शायद लगता GetString है क्योंकि यह पता चला है कि GetFloat, GetInt, GetDouble, GetLongLong सभी बाज़ी उनके GetString करने के लिए कार्यक्षमता की एक बहुत कुछ है. तो चलो वह यहाँ कैसे कार्यान्वित किया जाता है पर एक नज़र रखना. यह एक थोड़ा जटिल दिखता है, लेकिन यह एक ही बुनियादी बातों का उपयोग करता है कि हम पिछले हफ्ते के बारे में बात कर शुरू कर दिया. GetString में, जो शून्य के प्रति कोई तर्क के रूप में लेता है और यह एक स्ट्रिंग देता है, मैं जाहिरा तौर पर कहा जाता है एक बफर स्ट्रिंग की घोषणा कर रहा हूँ. मैं वास्तव में नहीं है कि क्या अभी तक के लिए इस्तेमाल किया जा रहा है पता नहीं है, लेकिन हम देखेंगे. ऐसा लगता है कि क्षमता 0 डिफ़ॉल्ट रूप से है. नहीं काफी यकीन है कि जहां यह यकीन है कि n क्या करने के लिए अभी तक इस्तेमाल किया जा जा रहा है नहीं जा रहा है, लेकिन अब यह एक छोटे से अधिक दिलचस्प हो रही है. 243 लाइन में, हम एक int, ग की घोषणा. यह एक बेवकूफ विस्तार की तरह है. एक चार 8 बिट है, और 8 बिट कितने विभिन्न मूल्यों स्टोर कर सकते हैं? >> [छात्र] 256. >> 256. समस्या यह है कि अगर आप 256 विभिन्न ASCII वर्ण, जो वहाँ हैं चाहते अगर तुम वापस लगता है - और यह याद करने के लिए कुछ नहीं है. लेकिन अगर आप कि बड़ा ASCII चार्ट वापस लगता है कि हम सप्ताह पहले किया था, उस मामले में 128 या 256 ASCII वर्ण थे. हम 0s और 1s ऊपर के सभी पैटर्न का इस्तेमाल किया. यह एक समस्या है अगर आप एक त्रुटि का पता लगाने में सक्षम होना चाहते हैं क्योंकि अगर आप पहले से ही अपने पात्रों के लिए 256 मूल्यों का उपयोग कर रहे हैं, आप वास्तव में आगे की योजना नहीं था, क्योंकि अब आप कह रही का कोई रास्ता नहीं है, यह एक कानूनी चरित्र नहीं है, यह कुछ गलत संदेश है. तो दुनिया क्या करता है कि वे अगले सबसे बड़ा मूल्य है, एक int की तरह कुछ का उपयोग करने के लिए, इतनी है कि आप 4 अरब संभव मूल्यों के लिए बिट्स, 32 के एक पागल संख्या है, इतना है कि आप बस अंत में उनमें से 257 अनिवार्य रूप से उपयोग कर सकते हैं, 1 जिनमें से एक त्रुटि के रूप में कुछ विशेष अर्थ है. तो चलो यह कैसे काम करता है देखने के लिए. 246 लाइन में, मैं इस बड़े जबकि पाश है कि fgetc बुला रहा है, च अर्थ फ़ाइल, तो जीइ टीसी, और फिर stdin. यह पता चला है यह सिर्फ कह कुंजीपटल से इनपुट को पढ़ने के और अधिक सटीक तरीका है. मानक इनपुट का मतलब कुछ कीबोर्ड, मानक आउटपुट स्क्रीन का मतलब है, और मानक त्रुटि, जो हम pset4 में देखेंगे, स्क्रीन का मतलब लेकिन स्क्रीन के एक विशेष हिस्सा इतना है कि यह वास्तविक उत्पादन के साथ नहीं conflated है कि आप मुद्रित करना. लेकिन भविष्य में उस पर और अधिक. तो fgetc सिर्फ मतलब कीबोर्ड से एक चरित्र को पढ़ने और यह दुकान जहां? यह ग में स्टोर. और फिर जांच - तो मैं बस कुछ बूलियन संयोजक यहाँ का उपयोग कर रहा हूँ - जाँच करें कि यह बराबर नहीं है - \ n, तो उपयोगकर्ता हिट दर्ज किया है, हम उस बिंदु पर रोक चाहते हैं, लूप के अंत और हम भी विशेष लगातार EOF के लिए जाँच करना चाहते हैं, जो अगर आप जानते हैं या लगता है, यह क्या के लिए खड़े करता है? >> [छात्र] फ़ाइल का अंत. फ़ाइल के अंतिम >>. इस तरह के बेतुका है, क्योंकि अगर मैं कीबोर्ड पर टाइप कर रहा हूँ वहाँ वास्तव में कोई फ़ाइल इस में शामिल है, लेकिन यह सिर्फ सामान्य मतलब प्रयोग किया जाता शब्द की तरह है कि और कुछ नहीं मानव उंगलियों से आ रहा है. EOF - फ़ाइल के अंत. एक अलग रूप में, अगर तुम कभी अपने कुंजीपटल पर नियंत्रण डी मारा, तो आप कि अभी तक नहीं करना होगा - आप नियंत्रण सी मारा है - नियंत्रण डी इस विशेष EOF बुलाया लगातार भेजता है. तो अब हम सिर्फ कुछ गतिशील स्मृति आवंटन है. तो अगर (एन 1 +> क्षमता). अब मैं n समझाता हूँ. एन कितने बाइट्स बफर में वर्तमान में कर रहे हैं, स्ट्रिंग है कि आप वर्तमान में उपयोगकर्ता से निर्माण कर रहे हैं. यदि आप अपने बफर में अधिक वर्ण से आप बफर में क्षमता है, intuitively हम क्या करते हो तो जरूरत अधिक क्षमता आवंटित है. तो मैं यहाँ गणित के कुछ हवा में घूमना और यहाँ केवल इस समारोह पर ध्यान केंद्रित करने के लिए जा रहा हूँ. आप जानते हैं कि malloc क्या है, या कम से कम आम तौर पर परिचित हैं. एक अनुमान realloc क्या करता है ले लो. >> [छात्र] स्मृति जोड़ता है. यह काफी स्मृति जोड़कर नहीं है. यह इस प्रकार के रूप में स्मृति reallocates. अगर वहाँ अभी भी स्ट्रिंग के अंत में कमरे में आप है कि स्मृति की अधिक दे की तुलना में यह मूल रूप से आप देता है, तो आपको लगता है कि अतिरिक्त स्मृति मिल जाएगा. तो तुम सिर्फ स्ट्रिंग वर्ण वापस डाल वापस वापस करने के लिए वापस करने के लिए रख सकते हैं. लेकिन अगर यह मामला नहीं है क्योंकि आप भी लंबे समय से इंतजार कर रहे थे और बिना सोचे समझे कुछ स्मृति में plopped हो गया लेकिन यहाँ नीचे अतिरिक्त स्मृति है, वह ठीक है. Realloc आप सभी के लिए भारी उठाने करने के लिए जा रहा है, आप स्ट्रिंग में पढ़ा है और इस तरह यहाँ से दूर ले जाने के लिए, यह वहाँ नीचे रखा, और फिर आप उस बिंदु पर कुछ और रनवे दे. तो हाथ की एक लहर के साथ, मुझे कहना है कि क्या GetString कर रही है यह एक छोटे से बफर, शायद एक ही चरित्र के साथ शुरू हो रहा है, और अगर दो अक्षरों में उपयोगकर्ता प्रकार, GetString realloc बुला समाप्त होता है और कहता है एक चरित्र के लिए पर्याप्त नहीं था, मुझे दो अक्षर दे. तो अगर आप पाश के तर्क के माध्यम से पढ़ते हैं, यह कहने जा रहा है उपयोगकर्ता 3 अक्षरों में टाइप, मुझे अब 2 नहीं है, लेकिन 4 अक्षर दे, तो मुझे 8 दे, तो मुझे 16 और 32 दे. तथ्य यह है कि मैं क्षमता हर बार दोगुना कर रहा हूँ मतलब यह है कि बफर करने के लिए धीरे धीरे बढ़ने नहीं जा रहा है, यह सुपर फास्ट बढ़ती जा रही है. और क्या इस बात का फायदा हो सकता है? मैं क्यों बफर के आकार के दोहरीकरण हूँ भले ही उपयोगकर्ता को सिर्फ एक कीबोर्ड से अतिरिक्त चरित्र की जरूरत हो सकती है? [अश्राव्य छात्र प्रतिक्रिया] >> वह क्या है? >> [छात्र] आप यह अक्सर के रूप में विकसित करने के लिए नहीं है. बिल्कुल सही. आप इसे अक्सर के रूप में विकसित करने के लिए नहीं है. और यह सिर्फ आप की तरह है यहाँ अपने दांव हेजिंग कर रहे हैं, विचार किया जा रहा है कि आप एक बहुत realloc कॉल नहीं करना चाहता क्योंकि यह करने के लिए धीमी गति से हो जाता है. किसी भी समय आप स्मृति के लिए ऑपरेटिंग सिस्टम से पूछो, के रूप में आप जल्द ही एक भविष्य समस्या सेट में देखेंगे, यह कुछ समय लेने के लिए जाता है. तो समय की है कि कम से कम राशि है, भले ही आप कुछ जगह बर्बाद कर रहे हैं, एक अच्छी बात हो जाता है. लेकिन अगर हम यहाँ GetString के अंतिम भाग के माध्यम से पढ़ा - और फिर हर एक लाइन यहाँ समझ आज इतना महत्वपूर्ण नहीं है - सूचना है कि यह अंततः malloc फिर कॉल और यह कई बाइट के रूप में बिल्कुल का आवंटन के रूप में यह स्ट्रिंग के लिए की जरूरत है और फिर मुक्त जरूरत से ज्यादा बड़े बफर फोन करके दूर फेंकता अगर यह वास्तव में भी कई बार दोगुनी हो गया. तो संक्षेप में, है कि कैसे GetString यह सब समय काम कर रहा है. यह सब एक समय में एक चरित्र फिर से और फिर से पढ़ा, और हर बार यह कुछ अतिरिक्त स्मृति की जरूरत है, इसके लिए ऑपरेटिंग सिस्टम पूछता realloc फोन करके. कोई सवाल? सही सभी. एक हमले. अब है कि हम संकेत समझते हैं या कम से कम संकेत के साथ तेजी से परिचित हैं, चलो विचार कैसे पूरी दुनिया के पतन शुरू होता है अगर आप काफी adversarial उपयोगकर्ताओं के खिलाफ नहीं की रक्षा करते हैं, लोग हैं, जो आपके सिस्टम में हैक करने की कोशिश कर रहे हैं, जो लोग कुछ पंजीकरण कोड circumventing द्वारा अपने सॉफ्टवेयर चोरी करने की कोशिश कर रहे हैं कि वे अन्यथा प्रकार अंदर हो सकता है इस उदाहरण पर एक नज़र यहाँ ले लो, जो सिर्फ सी कोड है कि तल पर एक मुख्य समारोह कि एक समारोह foo कॉल. और क्या यह foo गुजर रहा है? एक एकल तर्क [छात्र]. >> [Malan] एक एकल तर्क. तो argv [1], जो पहला शब्द का अर्थ है कि उपयोगकर्ता कमांड लाइन पर टाइप a.out या जो भी कार्यक्रम के बाद कहा जाता है. तो शीर्ष पर foo एक चार * में लेता है. लेकिन चार * क्या बस है? >> [छात्र] एक स्ट्रिंग. [Malan] एक स्ट्रिंग, तो कोई नई बात नहीं है. स्ट्रिंग है कि मनमाने ढंग से बार बुलाया जा रहा है. इस लाइन में, चार ग [12], अर्द्ध तकनीकी अंग्रेजी की तरह, इस लाइन क्या कर रही है? [छात्र] की एक सरणी - >> सरणी? >> [छात्र] लोगो. >> लोगो. मुझे 12 वर्णों की एक सरणी दे. तो हम एक बफर कॉल कर सकते हैं. यह तकनीकी ग कहा जाता है, लेकिन प्रोग्रामिंग में एक बफर सिर्फ अंतरिक्ष का एक गुच्छा का मतलब है कि आप कुछ सामान अंदर रख सकते हैं फिर अंत में, memcpy हम पहले नहीं इस्तेमाल किया, है, लेकिन आप शायद लगता है कि यह क्या करता. यह स्मृति प्रतियां. यह क्या करता है? जाहिरा तौर पर यह बार प्रतियां, अपने इनपुट, लेकिन ग में केवल पट्टी की लंबाई तक. लेकिन यहाँ एक बग है. >> [छात्र] आप sizeof चरित्र की जरूरत है. ठीक है. >> तकनीकी तौर पर, हम वास्तव में strlen (पट्टी) * sizeof (चार)). यह सही है. लेकिन सबसे खराब मामले में, चलो कि that's मान - ठीक है. तो फिर वहाँ दो कीड़े है. (चार) sizeof); चलो इस एक छोटे से व्यापक बनाने के. तो अब वहाँ अभी भी एक बग है, जो क्या है? >> [अश्राव्य छात्र प्रतिक्रिया] क्या के लिए जाँच करें? >> [छात्र] नल के लिए जाँच करें. हम आम तौर पर नल के लिए जाँच की जानी चाहिए क्योंकि बुरी बातें होती हैं जब अपने सूचक रिक्त है क्योंकि तुम अंत में वहाँ जा सकता है, और आप कभी नहीं किया जा सितारा ऑपरेटर के साथ अपसंदर्भन रिक्त चाहिए. तो यह अच्छी बात है. और हम और क्या कर रहे हैं? तार्किक रूप से, वहाँ एक दोष यहाँ भी है. [छात्र] की जाँच करें अगर argc> = 2 है. तो जांच अगर argc> = 2. ठीक है, तो इस कार्यक्रम में तीन कीड़े यहाँ है. अब हम यदि उपयोगकर्ता वास्तव में argv में किसी भी चीज़ में टाइप की जाँच कर रहे हैं [1]. अच्छा है. तो 3 बग क्या है? हाँ. >> [छात्र] सी पर्याप्त रूप से बड़ा नहीं हो सकता है. अच्छा है. हम एक परिदृश्य की जाँच की. हम उलझाव से जाँच अधिक स्मृति से पट्टी की लंबाई से अधिक की नकल नहीं है. तो अगर स्ट्रिंग में टाइप उपयोगकर्ता 10 वर्ण लंबा है, यह कह रही है केवल 10 वर्ण कॉपी. और वह ठीक है. लेकिन क्या होगा यदि उपयोगकर्ता एक शब्द 20-चरित्र की तरह शीघ्र एक शब्द में टाइप? इस बार से 20 वर्णों प्रति कह रहा है? सी, अन्यथा हमारे बफर के रूप में जाना जाता है, जिसका मतलब है कि आप सिर्फ डेटा लिखा 8 बाइट स्थानों है कि आप खुद का नहीं है, और आप उन्हें भावना है कि आप उन्हें कभी नहीं आवंटित में ही नहीं है. तो यह है कि क्या आम तौर पर बफर अतिप्रवाह हमले या बफर ओवररन हमले के रूप में जाना जाता है. और यह भावना में एक हमले की है कि यदि उपयोगकर्ता या प्रोग्राम है कि अपने कार्य बुला रहा है इस दुर्भावनापूर्ण रूप से कर रही है, क्या वास्तव में आगे क्या होता है वास्तव में काफी खराब हो सकता है. तो चलो इस चित्र पर एक नज़र यहाँ ले. यह तस्वीर स्मृति के ढेर का प्रतिनिधित्व करता है. याद है कि हर बार जब आप एक समारोह फोन आप ढेर पर इस छोटे फ्रेम मिल और फिर दूसरा और फिर दूसरा और दूसरा. और इस प्रकार अब तक, हम बस की तरह इन आयतों के रूप में abstracted या तो बोर्ड पर या स्क्रीन पर यहाँ. लेकिन अगर हम उन आयतों, जब आप एक समारोह foo फोन पर ज़ूम यह पता चला है कि वहाँ है कि फ्रेम के ढेर के अंदर पर कि आयत में अधिक है की तुलना में सिर्फ एक्स और y और एक और ख, जैसे हम स्वैप के बारे में बात कर किया. यह पता चला है कि वहाँ कुछ निचले स्तर के विवरण है, उन के बीच वापसी पता. तो यह पता चला जब मुख्य foo कॉल, मुख्य foo सूचित क्या मुख्य पते कंप्यूटर की स्मृति में है क्योंकि अन्यथा, के रूप में foo के रूप में जल्द ही इस मामले में यहाँ के रूप में क्रियान्वित किया जाता है, एक बार आप foo के अंत में इस बंद धनु धनुकोष्ठक तक पहुँचने, कैसे हो foo जहां कार्यक्रम के नियंत्रण के लिए जाना माना जाता है पता नहीं है? यह पता चला है कि उस सवाल का जवाब इस लाल आयत में है. यह एक सूचक का प्रतिनिधित्व करता है, और यह कंप्यूटर को अस्थायी रूप से दुकान ढेर तथाकथित मुख्य ताकि के रूप में foo के रूप में जल्द ही पते क्रियान्वित किया जाता है, कंप्यूटर जहां मुख्य लाइन और वापस जाने के लिए क्या जानता है. सहेजे गए फ़्रेम सूचक यह करने के लिए इसी तरह से संबंधित है. चार * यहाँ बार क्या प्रतिनिधित्व करता है? अब इस नीले खंड यहाँ foo फ्रेम है. पट्टी क्या है? बार सिर्फ foo समारोह के लिए तर्क है. तो अब हम परिचित तस्वीर की तरह पर वापस आ गए हैं. अधिक और स्क्रीन पर सामान अधिक distractions है, लेकिन इस हल्के नीले रंग खंड सिर्फ यह है कि हम क्या चॉकबोर्ड पर ड्राइंग किया गया है स्वैप की तरह कुछ के लिए. कि foo लिए फ्रेम है. और यह केवल बात सही अब पट्टी है, जो इस पैरामीटर है. लेकिन और क्या ढेर में यहाँ इस कोड के अनुसार होना चाहिए? [छात्र] चार ग [12]. >> [Malan] चार ग. [12] हम भी स्मृति के 12 वर्गों ग चर बुलाया आवंटित देखना चाहिए, और वास्तव में हम स्क्रीन पर कि है. बहुत ऊपर है ग [0], और फिर इस चित्र के लेखक किया परेशान, नहीं सभी वर्गों का ड्राइंग, लेकिन वहाँ वास्तव में कर रहे हैं 12 वहाँ क्योंकि अगर आप नीचे सही पर देखो, ग [11] यदि आप 0 से गिनती 12 ऐसी बाइट. लेकिन यहाँ समस्या है. ग किस दिशा में बढ़ रहा है? तरह ऊपर नीचे अगर यह शीर्ष पर शुरू होता है और नीचे बढ़ता. ऐसा लगता है जैसे हम खुद को बहुत रनवे छोड़ दिया सब यहाँ पर नहीं दिखता है. हम तरह के एक कोने में खुद को चित्रित किया है, और कि ग [11] बार, जो सहेजे गए फ़्रेम सूचक के खिलाफ सही है के खिलाफ सही है, जो वापसी पता के खिलाफ अभी भी ऊपर है. वहाँ कोई और अधिक कमरा है. तो क्या निहितार्थ तो अगर तुम पेंच और आप एक 12 - बाइट बफर में 20 बाइट्स पढ़ने की कोशिश की? उन 8 अतिरिक्त बाइट्स कहाँ जा रहे हैं? >> [छात्र] के अंदर - बाकी सब कुछ अंदर, जिनमें से कुछ महत्वपूर्ण सुपर है. और सबसे महत्वपूर्ण बात, संभावित, लाल बॉक्स है, वापसी पता, क्योंकि लगता है कि या तो आप गलती से या adversarially उन 4 बाइट्स अधिलेखित, न सिर्फ कचरा के साथ, लेकिन एक नंबर के साथ कि सूचक पते, कि स्मृति में एक वास्तविक पते का प्रतिनिधित्व होता है. निहितार्थ क्या है तार्किक,? >> [छात्र] समारोह के लिए एक अलग जगह पर लौटने जा रहा है. बिल्कुल सही. जब foo रिटर्न और हिट धनु धनुकोष्ठक कि कार्यक्रम के लिए आगे बढ़ने के लिए जा रहा है मुख्य करने के लिए वापस नहीं है, यह पता कि लाल बॉक्स में जो कुछ भी है लौटने जा रहा है. Circumventing सॉफ्टवेयर पंजीकरण के मामले में, क्या हुआ अगर पता है कि करने के लिए किया जा रहा वापस आ रहा है समारोह में कहा कि आम तौर पर बुलाया जाता है के बाद आप सॉफ्टवेयर के लिए भुगतान किया है और अपने पंजीकरण कोड inputted? आप कंप्यूटर चाल के यहाँ नहीं जा रहा में सॉर्ट लेकिन इसके बजाय यहाँ जा सकते हैं. या अगर तुम सच में चालाक, एक विरोधी वास्तव में कुंजीपटल में टाइप कर सकते हैं, उदाहरण के लिए, नहीं एक वास्तविक, शब्द नहीं 20 अक्षर, लेकिन लगता है वह या वह वास्तव में प्रकार कुछ अक्षर है कि कोड का प्रतिनिधित्व करते हैं. और यह सी कोड होने नहीं जा रहा है, यह वास्तव में वर्ण होने जा रहा है कि बाइनरी मशीन कोड, 0s और 1s का प्रतिनिधित्व करते हैं. लेकिन लगता है कि वे काफी चालाक क्या करना है कि कर रहे हैं, किसी भी तरह GetString शीघ्र कुछ है कि अनिवार्य रूप से संकलित कोड में पेस्ट, और पिछले 4 बाइट्स कि वापसी पता अधिलेखित. और क्या पता है कि इनपुट क्या करता है? यह वास्तव में इस लाल आयत बफर की पहली बाइट के पते में भंडार है. तो तुम बहुत चालाक है, और इस बुरे लोगों के लिए परीक्षण और त्रुटि के एक बहुत वहाँ बाहर है, लेकिन अगर तुम बाहर आंकड़ा कितना बड़ा है यह बफर कि इस तरह के निवेश में पिछले कुछ बाइट्स आप इस कार्यक्रम को उपलब्ध कराने के अपने बफर की शुरुआत का पता करने के लिए बराबर होना होगा, आप यह कर सकते हैं. अगर हम कहते हैं कि सामान्य रूप से नमस्ते और \ 0, कि क्या बफर में समाप्त होता है. लेकिन अगर हम और अधिक चतुर हो और हम हम क्या generically का दौरा पड़ने कोड के साथ फोन करता हूँ कि बफर भरें - एएए, हमले, हमले, हमले - जहां यह सिर्फ कुछ है कि कुछ बुरा करता है, क्या होता है अगर तुम सच में चालाक, आप यह कर सकते हैं. 80, C0, 35, 08 - लाल बॉक्स में संख्या का एक दृश्य है. सूचना है कि वह संख्या है कि यहाँ है मैच. यह रिवर्स क्रम में है, लेकिन यह है कि कुछ अन्य समय पर अधिक है. सूचना है कि इस वापसी पता जानबूझकर बदल दिया गया है पते बराबर यहाँ, मुख्य पता नहीं. तो अगर बुरा आदमी सुपर स्मार्ट है, वह या वह है कि हमले के कोड में शामिल करने के लिए जा रहा है कुछ की तरह उपयोगकर्ता फ़ाइलों के सभी नष्ट या प्रतिलिपि बनाने के पासवर्ड या एक उपयोगकर्ता खाते बनाने कि मैं तो में लॉग इन कर सकते हैं - सभी में कुछ भी. और यह दोनों खतरे और सी. की शक्ति है क्योंकि आप संकेत के माध्यम से याद करने के लिए उपयोग किया है और इसलिए तुम एक कंप्यूटर की स्मृति में आप चाहते हैं कुछ भी लिख सकते हैं, आप एक कंप्यूटर कुछ भी आप चाहते हैं कर सकते हैं बस के द्वारा अपने स्वयं के स्मृति अंतरिक्ष के भीतर होने के चारों ओर छलांग. और इसलिए इस दिन के लिए कई कार्यक्रमों और कई वेबसाइटों है कि समझौता कर रहे हैं लोगों को इस का लाभ लेने के लिए नीचे फोड़ा. और इस एक सुपर परिष्कृत हमले की तरह लग रहे हो, लेकिन हो सकता है यह हमेशा कि तरह शुरू नहीं करता है. वास्तविकता यह है कि बुरे लोगों को आम तौर पर क्या करना होगा है, क्या यह एक कमांड लाइन पर एक कार्यक्रम या एक GUI प्रोग्राम या एक वेबसाइट है, तुम सिर्फ बकवास प्रदान करने शुरू. आप खोज क्षेत्र और हिट दर्ज में एक बहुत बड़ा शब्द में लिखें, और आप देखने के लिए अगर वेबसाइट दुर्घटनाओं के लिए इंतजार या आप देखने के लिए अगर कार्यक्रम कुछ त्रुटि संदेश प्रकट होता है के लिए इंतजार क्योंकि अगर आप बुरा आदमी के रूप में भाग्यशाली हो और तुम कुछ पागल इनपुट प्रदान कि कार्यक्रम है, इसका मतलब है कि प्रोग्रामर अपने बुरे व्यवहार सोचा भी नहीं था दुर्घटनाओं, जिसका मतलब है कि आप शायद पर्याप्त प्रयास, पर्याप्त परीक्षण और त्रुटि के साथ कर सकते हैं, बाहर आंकड़ा कैसे एक और अधिक सटीक हमले मजदूरी. इतना के रूप में सुरक्षा का एक हिस्सा इन हमलों को पूरी तरह से परहेज नहीं है लेकिन उन्हें पता लगाने और वास्तव में लॉग तलाश और देख पागल आदानों क्या लोगों को अपनी वेबसाइट में लिखा गया है, क्या खोज शब्दों को अपनी वेबसाइट में लोगों को टाइप किया है कुछ बफर ढेर की उम्मीद में. और यह क्या की सरल मूल बातें करने के लिए नीचे फोड़े एक सरणी है और क्या यह आवंटन और स्मृति का उपयोग मतलब नहीं है. फिर भी यह है कि संबंधित. चलो बस एक हार्ड ड्राइव के अंदर एक बार फिर नज़र. आप एक या दो सप्ताह पहले से याद करते हैं कि जब आप अपने रीसायकल बिन या कचरा कर सकते हैं फ़ाइलों को खींच, क्या होता है? >> [छात्र] कुछ भी नहीं है. >> बिल्कुल कुछ भी नहीं है, है ना? अंत में अगर आप कम डिस्क स्थान पर चलाने के लिए, विंडोज या मैक ओएस आप के लिए फ़ाइलों को हटाने शुरू कर देंगे. लेकिन अगर तुम वहाँ में कुछ खींचें, कि सभी सुरक्षित नहीं है. अपने रूममेट या दोस्त या परिवार के सदस्य के लिए क्या करना है डबल और क्लिक करें, देखा, वहाँ सभी ढांचे के रूप में फ़ाइलों है कि आप को नष्ट करने की कोशिश की है. हम में से अधिकांश कम से कम पता है कि तुम ठीक क्लिक करें या बादनियंत्रण और खाली या उस तरह कुछ कचरा. लेकिन फिर भी है कि काफी चाल नहीं क्या करता है क्योंकि क्या होता है जब आप अपनी हार्ड ड्राइव पर एक फ़ाइल है कि कुछ Word दस्तावेज़ या कुछ JPEG का प्रतिनिधित्व करता है, और यह अपनी हार्ड ड्राइव का प्रतिनिधित्व करता है, और हम कहते हैं कि यहाँ इस ज़ुल्फ़ कि फ़ाइल का प्रतिनिधित्व करता है, और यह 0s और 1s की एक पूरी गुच्छा से बना है. क्या होता है जब आप कचरा कि फ़ाइल केवल खींचें नहीं होता है या बिन पुनरावृत्ति कर सकते हैं लेकिन यह भी इसे खाली? कुछ भी नहीं की तरह. अब यह बिल्कुल कुछ भी नहीं है. अब यह सिर्फ कुछ भी नहीं है क्योंकि एक छोटे से कुछ इस तालिका के रूप में होता है. तो वहाँ एक कंप्यूटर की स्मृति के अंदर डेटाबेस या तालिका के किसी तरह का है है कि अनिवार्य रूप से फ़ाइलों के लिए एक कॉलम 'के नाम और फ़ाइलों के लिए एक कॉलम' स्थान है, इस 123 स्थान है, जहां सिर्फ एक यादृच्छिक संख्या हो सकती है. तो हम x.jpeg और 123 स्थान की तरह कुछ हो सकता है. फिर क्या होता है जब आप वास्तव में अपने कचरा खाली? यह दूर हो जाता है. लेकिन क्या करता है चले जाओ नहीं 0s और 1s है. तो फिर क्या pset4 के लिए कनेक्शन है? खैर, pset4 साथ, सिर्फ इसलिए कि हम गलती से कॉम्पैक्ट फ़्लैश कार्ड मिटा दिया है कि दुर्भाग्य से इन तस्वीरों के सभी था या यह सिर्फ क्योंकि भ्रष्ट बन गया इसका मतलब यह नहीं है कि 0s और 1s अभी भी वहाँ नहीं कर रहे हैं. हो सकता है कि उनमें से कुछ खो रहे हैं क्योंकि कुछ भ्रष्ट है समझ में आता है कि कुछ 0s 1s बन गया है और 1s 0s बन गया. बुरी बातें छोटी गाड़ी सॉफ्टवेयर या दोषपूर्ण हार्डवेयर की वजह से हो सकता है. लेकिन उन बिट्स के कई, शायद उनमें से भी 100%, अभी भी वहाँ हैं. यह सिर्फ है कि कंप्यूटर या कैमरे जहां JPEG1 शुरू नहीं पता नहीं है और JPEG2 जहां शुरू कर दिया. लेकिन आप अगर, प्रोग्रामर, प्रेमी की एक सा है, जहां उन JPEGs हैं साथ में पता या क्या वे जैसे दिखते हैं ताकि आप 0s और 1s और कहते हैं कि JPEG, जेपीईजी का विश्लेषण कर सकते हैं, आप के लिए अनिवार्य रूप से एक बस के साथ एक कार्यक्रम में लिख सकते हैं या जबकि पाश कि उन फ़ाइलों में से प्रत्येक एक ठीक हो जाए. तो सबक तो सुरक्षित रूप से अपने फ़ाइलों को मिटा शुरू अगर आप इस पूरी तरह से बचने के लिए करना चाहते हैं. हां. [छात्र] कैसे आ यह आपके कंप्यूटर पर कहते हैं कि आप और अधिक स्मृति की तुलना में आप पहले किया है? - >> [छात्र] ज्यादा उपलब्ध स्मृति और अधिक स्मृति की तुलना में आप पहले किया है. ओह. अच्छा सवाल है. तो फिर क्यों रद्दी खाली करने के बाद अपने कंप्यूटर आपको बता करता है कि आप और अधिक मुक्त स्थान की तुलना में आप पहले किया है? संक्षेप में, क्योंकि यह झूठ बोल रहा है. तकनीकी तौर पर, आप और अधिक स्थान है क्योंकि अब तुम ने कहा है आप अन्य सामान डाल कर सकते हैं, जहां कि फ़ाइल एक बार गया था. लेकिन इसका मतलब यह नहीं बिट्स चले जा रहे हैं, और इसका मतलब यह नहीं बिट सभी 0s को परिवर्तित किया जा रहा है, उदाहरण के लिए, अपनी सुरक्षा के लिए. तो इसके विपरीत, यदि आप सुरक्षित फ़ाइलों को मिटा या शारीरिक रूप डिवाइस को नष्ट कर, कि वास्तव में कभी कभी ही तरीका है कि चारों ओर. तो हम क्यों कि अर्द्ध डरावना नोट पर नहीं छोड़ करते हैं, और हम आप सोमवार को देखेंगे. [वाहवाही] [CS50.TV]