[संगीत खेल] डेविड जे Malan: सब ठीक है. इस CS50 है. और इस सप्ताह 5 की शुरुआत है. और आप देखा हो, सामग्री के कुछ एक छोटे से अधिक हो रही है जटिल, थोड़ा सघन. और यह विशेष रूप से अगर, बहुत आसान है यदि आप कुछ समय के लिए आदत में रहा हूँ सबसे नीचे घसीटना कोशिश कर रहा हो हम कुछ भी, हम वर्ग में कह रहे हैं. लेकिन वह शायद नहीं है, एहसास आदर्श शैक्षणिक दृष्टिकोण सामग्री के इस तरह सीखने के लिए, और सामग्री और अधिक आम तौर पर. और इसलिए हम खुश हैं कि CS50 की अपनी Gheng घोषणा गोंग तैयार करने के लिए शुरू हो गया है नोटों की एक विहित सेट कोर्स के लिए, की आशा जो ये, कि एक है न केवल एक के रूप में सेवा संदर्भ और एक संसाधन सामग्री की समीक्षा करने और जाने के लिए वापस सामग्री के माध्यम से हो सकता है कि , आप के आसपास पहली बार भाग निकले लेकिन भी इतनी है कि आपके सिर हो सकता है अधिक नीचे, जब यह से ऊपर व्याख्यान के लिए समय आता है, आप संलग्न हो सकता है ताकि अधिक सोच समझकर, के रूप में अधिक scribbly करने का विरोध किया. साथ ही कहा, आप पर क्या मिलेगा वेबसाइट के रूप में यह इस तरह के दस्तावेज है. और नोटिस, बाईं शीर्ष पर, वहाँ न केवल सामग्री की एक मेज, लेकिन यह भी समय कोड है कि आपको तुरंत कूद जाएगा उचित हिस्सा करने के लिए वीडियो ऑनलाइन में. और यहाँ क्या चांग किया गया है अनिवार्य रूप से, प्रलेखित है क्या इस में हुआ विशेष व्याख्यान. और व्याख्यान के कई हैं पहले से ही ऑनलाइन अब इस यूआरएल के साथ. और हम शेष पोस्ट करने के लिए जारी रखेंगे इस सप्ताह के अंत तक उन की, ताकि संसाधन का लाभ लेते हैं. तो आगे की हलचल के बिना, हम वापस छील करने के लिए शुरू कर दिया कर दिया गया है कि परत कुछ समय के लिए स्ट्रिंग. और हम एक स्ट्रिंग क्या कहा वास्तव में पिछले सप्ताह है? तो चार सितारा. और चार सितारा, ठीक है, क्या कि वास्तव में क्या मतलब था? खैर, यह सब समय, हम है अगर एक समारोह बुला रहा, getString, और भंडारण की तरह तथाकथित वापसी एक में getString का मूल्य variable-- यह कहा जाता है हम लिख रहे हैं string-- प्रकार वहाँ ऊपर कोड की लाइन. मैं देख रहा हूँ और जब यह केवल मेरी लिखावट यहाँ बढ़ाया मैं इस बस कैसे नृशंस महसूस करते हैं. हालांकि, चलो मान लेते हैं कि, दाएँ हाथ की ओर फिर भी, एक उचित है क्या का चित्रण यह सब चल रहा getString साथ समय. getString, ज़ाहिर है, एक स्ट्रिंग हो जाता है. लेकिन यह है कि वास्तव में क्या मतलब है? यह इसका एक हिस्सा हो जाता है इसका मतलब ऑपरेटिंग सिस्टम से स्मृति एक समारोह को फोन करके, malloc बुलाया. लेकिन अधिक है कि बाद में. और फिर यह भरता स्मृति की है कि हिस्सा पत्र के साथ उपयोगकर्ता है , में टाइप द्वारा पीछा किया, ज़ाहिर है, एक अशक्त चरित्र, या बैकस्लैश बहुत अंत में शून्य. इस बीच, बाएं हाथ की ओर इस कहानी की, यह सब समय, हम की तरह, एक चर घोषित किया गया है. और कहा कि चर अब क्या है एक सूचक बुला शुरू कर देंगे. यह जो के अंदर एक बॉक्स नहीं है हम स्ट्रिंग डाल, Daven, दर असल, बल्कि हम उस वर्ग में नहीं डाल बाएं क्या बिल्कुल पर बॉक्स? हाँ? दर्शक: के पते जहां यह स्मृति में स्थित है. डेविड जे Malan: बिल्कुल. Daven जहां के पते स्मृति में स्थित है. और Daven के सभी, स्थित है नहीं जहां दर असल, लेकिन विशेष रूप से पता क्या की? हाँ? दर्शक: प्रथम चरित्र. डेविड जे Malan: प्रथम चरित्र इस मामले में Daven, जो, में, मैं मनमाने ढंग से किया गया था प्रस्ताव और unrealistically 1, OX1, जो सिर्फ मतलब 1 की हेक्साडेसिमल संख्या. लेकिन यह शायद जा रहा है एक बहुत बड़ी संख्या होने के लिए हम आकर्षित हो सकता है कि एक उपसर्ग के रूप में एक 0x से, एक हेक्साडेसिमल चरित्र का प्रतिनिधित्व. और हम जानते हैं कि कहां की जरूरत नहीं है क्योंकि Daven के पात्रों के बाकी की वजह से कर रहे हैं, क्या साधारण डिजाइन निर्णय कई साल पहले बनाया गया था? हाँ? दर्शक: बैकस्लैश 0. डेविड जे Malan: हाँ, बिल्कुल. बैकस्लैश 0 में हालांकि, आप की अनुमति देता है रैखिक समय, स्ट्रिंग पार करने के लिए, बाएं से दाएं चलना, एक पाश के लिए, या एक समय के साथ पाश, या कुछ और की तरह कि, और यहाँ, ओह, यह निर्धारित इस विशेष स्ट्रिंग का अंत है. पर अभी पते के साथ तो एक स्ट्रिंग की शुरुआत हम की संपूर्णता का उपयोग कर सकते हैं यह सब करते हुए, क्योंकि एक स्ट्रिंग सिर्फ एक चार सितारा कर दिया गया है. इसलिए इसे का उपयोग जारी रखने के लिए निश्चित रूप से ठीक है CS50 पुस्तकालय और इस अमूर्त, तो बात है, लेकिन हम करेंगे वास्तव में देखना शुरू क्या चल रहा है इस पूरे समय के नीचे. तो आप इस उदाहरण याद कर सकते हैं, भी, पिछली बार से, 0 तुलना, जो वास्तव में तुलना नहीं की थी. लेकिन हम इस को हल करने के लिए शुरू किया. लेकिन शायद एक पुनश्चर्या, मैं किसी को ब्याज सकता है एक गुलाबी हाथी में आज, भी चांग द्वारा किए गए? कैसे सामने आप के बारे में? [अश्राव्य]. ऊपर आओ. और इस बीच में, आप आने के रूप में, चलो बस एक पल के लिए क्या विचार इस कोड वास्तव में क्या कर रहा था. यह दो चर की घोषणा की है शीर्ष, एस टी, और getString बुला. यह एक बहुत उपयोगकर्ता के अनुकूल कार्यक्रम नहीं है यह आपको बता नहीं है क्योंकि क्या करना है. लेकिन अभी हम कर रहे हैं मान के चलो रसदार हिस्से पर केंद्रित थी. एस के बराबर होती है और अगर है तो हम करते हैं , यह printf कहना चाहिए टी के बराबर होती है, आप एक ही बात टाइप. नमस्कार. आपका नाम क्या है? Janelle: Janelle. डेविड जे Malan: Janelle, आपसे मिलकर अच्छा लगा. पर अपनी चुनौती तो इस हाथी के लिए हाथ पहले हमें क्या है की एक तस्वीर आकर्षित करने के लिए है उन पहले दो में प्रतिनिधित्व किया जा रहा लाइनों. तो एस और टी हो सकता है कैसे स्क्रीन पर प्रतिनिधित्व? और तुम बस के साथ यह आकर्षित कर सकते हैं इस बड़े परदे पर अपनी उंगली. तो करने दो हिस्सों वहाँ कि समीकरण के दोनों ओर. तो वहाँ छोड़ दिया पर है, और तो ठीक है पर getString. और फिर टी, बाईं तरफ वहाँ और फिर सही पर getString. तो हम कैसे शुरू हो सकता है एक तस्वीर खींचने कि क्या हो रहा है का प्रतिनिधित्व करता है यहाँ स्मृति में, आप कहेंगे? और मैं आपको समझाने जाने तुम जाओ के रूप में आप क्या कर रहे हैं. Janelle: ठीक है. खैर, सबसे पहले, यह पूछ रही हो जाएगा आप इनपुट स्ट्रिंग प्राप्त करने के लिए. और यह खेद, ओह store-- होगा. डेविड जे Malan: ठीक है. अच्छा. और यह क्या कहा जाता है? ठीक है, ओह. बढ़ते रहें. मैं बाधित करने के लिए मतलब नहीं था. Janelle: क्षमा करें. तो यह इनपुट में यह होगा पता यकीन नहीं of--. मैं वास्तव में नंबर याद नहीं कर सकते हैं, लेकिन मैं यह 0 के साथ शुरू किया गया था विश्वास करते हैं. डेविड जे Malan: यह सब ठीक है मैं संख्या से बना है, क्योंकि तो कोई सही जवाब है. Janelle: 0 चाप के साथ शुरू. डेविड जे Malan: ठीक है, तो तत्व 0. ज़रूर. Janelle: और फिर था बस एक दो letter-- तरह डेविड जे Malan: ठीक है, तुम्हें वापस करने के लिए. Janelle: तो तत्व 0, और तब तत्व 1 या तत्व 2. जो टुकड़ा और: डेविड जे Malan तस्वीर आप अभी बैठक कर रहे हैं? getString को कॉल? या एस की घोषणा? Janelle: घोषणा एस के, मुझे विश्वास है. ओह, getString, यह होगा क्योंकि प्रत्येक [में inputted किया? क्षेत्र. ?] डेविड जे Malan: अच्छा. बिल्कुल सही. यहां तक ​​कि यह प्रभावी हालांकि एक सरणी, याद देता है, हम एक स्ट्रिंग वापस मिलता है, हम कर सकते हैं 01 और 2 का उपयोग कर कि स्ट्रिंग में सूचकांक. तकनीकी तौर पर, ये शायद हैं व्यक्तिगत पतों द्वारा प्रतिनिधित्व, लेकिन वह ठीक है. तो, लगता है अगर मैं सिर्फ तेजी से कर सकते हैं हम से दूर छोड़ दिया, जहां से आगे पिछली बार से एक अगर तार, एक बी ई जी था बैकस्लैश 0, जिससे प्रतिनिधित्व करने Gabe की इनपुट, कैसे हम अब प्रतिनिधित्व हो सकता है? इस है कि स्मृति है getString से लौटा दिया गया? Janelle: यह होगा एक चाप से प्रतिनिधित्व? डेविड जे Malan: एक चाप द्वारा? नहीं, ठीक है. , चलो बस pictorially, हम कहते हैं मुझे बस आगे चलते हैं इस s है और, यदि यह प्रस्ताव है कि getString की मान है. और तुम 0, 1, 2, के रूप में यह तैयार किया है जो , पूरी तरह से उचित है क्योंकि हम जैसे स्ट्रिंग में सूचकांक कर सकते हैं. लेकिन बस के अनुरूप होना पिछली बार, मुझे आगे चलते हैं और मनमाने ढंग से यह प्रस्ताव है कि 1 पता है, इस पते 2 है, यह तो आगे पता 3, और है. और हां, सिर्फ सुपर होने की स्पष्ट है, क्या हो रहा है इस बात का एक परिणाम के रूप में एस में जाने के लिए कोड की पहली पंक्ति, आप कहेंगे? Janelle: 1 पता? डेविड जे Malan: बिल्कुल. तो 0x1 पता. और इस बीच, मुझे आगे चलते हैं और तुम क्या किया है की ज्यादा नकल और यहाँ मेरे अपने टी जोड़ें. मैं Gabe में टाइप करने के लिए गए थे फिर, एक दूसरी बार, getString साथ प्रेरित कब, कहाँ, बेशक, Gabe जाना जा रहा है? खैर, presumably-- Janelle: यहाँ पर की तरह? डेविड जे Malan: हाँ. Janelle: या यह एक ही बॉक्स में भी है? डेविड जे Malan: मेरे हाँ, का प्रस्ताव करते हैं वास्तव में, इन अतिरिक्त बक्से में तो. लेकिन क्या अब कुंजी भी है कि, मैं इन बहुत करीब खींचा है, हालांकि together-- 0x1, इस वास्तविकता में 0x2-- है, यह अब, पते 0x10 हो सकता है उदाहरण के लिए, और 0x11, और 0x12, और बहुत आगे है. और हां, अगर ऐसी बात है, क्या टी में यहाँ समाप्त करने के लिए हो रहा है? Janelle: 0x10? डेविड जे Malan: बिल्कुल. तो 0x10. और इसलिए अब, अंतिम प्रश्न. तुम्हें पता है, दूर से, काम करने के लिए पड़ा है इस प्रकार अब तक एक हाथी के लिए सबसे मुश्किल. अब तक, मैं कोड को खींच अगर फिर, जब मैं, लाइन तीन में, एस के बराबर होती है टी के बराबर होती है, तो मैं वास्तव में क्या कर रहा हूँ हम यहाँ तैयार किया है की तुलना है? Janelle: दो पतों? डेविड जे Malan: बिल्कुल. तो मैं टी के बराबर बराबर एस कह रहा हूँ? दूसरे शब्दों में, 10 को बराबर बराबर 1 है? और हां, स्पष्ट जवाब अब नहीं है. और इसलिए इस कार्यक्रम में अंततः है आप क्या कहेंगे, मुद्रित करने के लिए जा रहे हैं? Janelle: यह होगा आप एक ही बात टाइप किया? डेविड जे Malan: तो अगर एस 1 और टी 10 है? Janelle: आप अलग अलग चीजें टाइप. डेविड जे Malan: बिल्कुल. आप अलग अलग चीजें टाइप. ठीक है. तो प्रशंसा का एक दौर, यहाँ, हम कर सकते हैं. [वाहवाही] उस दर्दनाक था. मुझे पता है. अच्छी तरह से किया. तो अब चलो देखते हैं अगर हम नहीं कर सकते तय किया गया था कि क्या अलग तंग. और हां, हम this-- तय जब जो मैं अब green-- में प्रतिनिधित्व करेंगे हम यहाँ संवर्द्धन की एक जोड़ी किया. सबसे पहले, बस एक विवेक के रूप में मैं पहली बार देख रहा हूँ, जाँच एस शून्य के बराबर होती है और टी शून्य के बराबर होती है. और अभी स्पष्ट होना करने के लिए, जब हो सकता है एस टी या इस तरह कोड में अशक्त हो? जब एस टी या अशक्त हो सकता है. हाँ? दर्शक: [अश्राव्य]. डेविड जे Malan: बिल्कुल. स्ट्रिंग उपयोगकर्ता कि यदि में टाइप रास्ता बहुत लंबा है स्मृति में फिट, या कुछ करने के लिए ऐसा अजीब कोने मामला है, हम देखेंगे के रूप में सचमुच, getString आज, अपने दस्तावेज़ में, यह रूप में अशक्त लौटने का कहना है एक विशेष प्रहरी मूल्य, या बस की तरह एक विशेष प्रतीक कि कुछ गलत हो गया था मतलब है. इसलिए हम के लिए जाँच करना चाहते हैं यह पता चला है कि, क्योंकि कि अशक्त एक बहुत ही खतरनाक मान है. अक्सर, आप के साथ कुछ करने की कोशिश अशक्त इसे पारित एक function-- शामिल निवेश के रूप में, कि समारोह instance-- के लिए बहुत इसके साथ, दुर्घटना और होगा हो सकता है, अपने पूरे कार्यक्रम नीचे ले. तो इस तीसरी लाइन अब सिर्फ एक विवेक है अगर तुम जाएगा, त्रुटि जाँच की जाँच करें. उस के लिए अब एक अच्छी आदत है हमें किसी भी समय में प्राप्त करने के लिए हम एक मूल्य का उपयोग करने का प्रयास करें कि , संभावित, अशक्त हो सकता है. अब, यहाँ चौथी लाइन में, "अगर strcmp (एस, टी)," ठीक है, क्या करने के लिए बात है? खैर, हम इस बहुत संक्षेप में एक ने कहा कि स्ट्रिंग तुलना के लिए नामित समारोह. और जीवन में अपने उद्देश्य की तुलना है दूसरा इसके खिलाफ अपना पहला तर्क, लेकिन नहीं उनके पते के संदर्भ में, हम एक क्षण अनजाने रूप में किया था पहले लाल कोड के साथ, लेकिन बल्कि उन दोनों की तुलना करने के लिए आदमियत सहज ज्ञान युक्त में तार इस के खिलाफ, इस तुलना करके रास्ता, यह इस के खिलाफ, और के खिलाफ फिर रोक जब यदि एक और या अपनी उंगलियों के दोनों एक बैकस्लैश 0 हिट. तो किसी साल पहले लागू किया strcmp कार्यक्षमता हमारे लिए लागू करने के लिए हम हम मिल गया होता आशा व्यक्त की कि सिर्फ दो सरल मूल्यों की तुलना द्वारा. अब स्पष्ट रूप से, मैं ड्राइंग रखना इन विभिन्न संख्या के सभी. लेकिन वास्तविकता यह है कि मैं कर रहा हूँ, है पूरे समय इन ऊपर बना रही है. और इसलिए मुझे बस आगे चलते हैं और इन बाहर घसीटना एक बिंदु बनाने के लिए है कि, अंत में दिन की और आगे बढ़ने, हम वास्तव में के बारे में देखभाल करने के लिए नहीं जा रहे हैं क्या चीजें वास्तव में कर रहे हैं के पते स्मृति में. इसलिए मैं इन आकर्षित करने के लिए नहीं जा रहा हूँ इसलिए अब और ज्यादा संख्या के प्रकार, मैं दूर एक यह सिर्फ एक अमूर्त हूँ बस तीर के साथ अधिक अनुकूल थोड़ा. दूसरे शब्दों में, एक सूचक है, ठीक है, चलो बस सचमुच, यह आकर्षित करते हैं एक संकेत के रूप में, एक तीर इशारा करते हुए , कुछ और करने के लिए अपने आप से और के बारे में भी बहुत अधिक चिंता नहीं इन पतों के minutia जो, फिर से, मैं वैसे भी बना हुआ है. लेकिन हम उन पतों देखेंगे, कभी कभी, कोड डिबगिंग जब. अब इस बीच, इस कार्यक्रम यहाँ ठीक करता है, ज़ाहिर है, तुलना करके कि समस्या उन दो तार. लेकिन हम एक और समस्या में भाग गया. यह कॉपी से था पिछले समय कार्यक्रम जिससे, मैं भुनाने की कोशिश कर रहा था एक स्ट्रिंग में सिर्फ पहली चरित्र. लेकिन लक्षण क्या था हम जब आखिरी बार देखा था एक उपयोगकर्ता की तरह, एक मूल्य में टाइप लोअर केस में Gabe, एस के लिए, तो हम टी में है सौंपा वहाँ तीसरी पंक्ति में के रूप में, और फिर मैं करने की कोशिश की टी ब्रैकेट 0 भुनाने? के प्रभाव क्या था टी ब्रैकेट 0 यहाँ बदल रहा है? दर्शक: यह है बदल दिया है. डेविड जे Malan: हाँ, मैं भी, एस बदल दिया है. वास्तव में क्या चल रहा था क्योंकि? खैर, मैं साफ कर सकते हैं तो मुझे देखते हैं इस तस्वीर के ऊपर, के रूप में इस प्रकार है. S है, तो फिर, शब्द जी, ए, बी, ई, बैकस्लैश, 0, और एस हम एक बॉक्स के रूप में ड्राइंग जारी रखेंगे यहाँ, लेकिन अधिक नहीं पतों. की चीजों को बनाने बंद करो. चलो बस एक तस्वीर खींचना दुनिया को आसान बनाने के लिए. मैं स्ट्रिंग टी के साथ टी की घोषणा करते हैं, कि स्मृति की है कि हिस्सा बनाता है. वर्ग 32 होना होता है सबसे अधिक कंप्यूटरों में बिट्स. वास्तव में, यदि आप कभी एक के बारे में सुना है कंप्यूटर, एक 32 बिट वास्तुकला होने वास्तव में फैंसी बात करते हैं, कि बस यह 32 बिट पते का उपयोग करता है इसका मतलब है. और एक तरफ एक तकनीकी रूप में, क्या आपने कभी सोचा है अगर क्यों पुराने कंप्यूटर, वास्तव में आप अगर राम की बहुत सारी के साथ सूप उन्हें करने की कोशिश की, केवल एक अधिकतम हो सकता था राम के चार गीगाबाइट की, अच्छी तरह से है कि सचमुच, क्योंकि है, अपने पुराने कंप्यूटर सकता है केवल 4 के रूप में उच्च गिनती अरब, 4 अरब बाइट्स, इसकी वजह यह 32 बिट का उपयोग कर रहा था पतों के लिए संख्या. लेकिन किसी भी मामले में, इस में उदाहरण, कहानी का बहुत सरल. टी सिर्फ एक सूचक है, या वास्तव में एक चार सितारा, उर्फ ​​स्ट्रिंग. और कैसे मैं इस तस्वीर अपडेट करना चाहते हैं अब कोड की है कि दूसरी पंक्ति के साथ, डॉट के बाद, दूरसंचार विभाग, डॉट? जब मैं स्ट्रिंग टी, एस अर्धविराम के बराबर होती है इस तस्वीर कैसे बदल जाता है? हाँ? दर्शक: [अश्राव्य]. डेविड जे Malan: हाँ. बिल्कुल सही. मैं बस से एक तीर डाल एक ही पते पर टी बॉक्स, में एक ही पहला पत्र दे दिया. या तकनीकी तौर पर, अगर इस लड़का, 0x1 पर अभी भी थे मैं था के रूप में हालांकि यह बात है यहाँ 0x1 और यहाँ 0x1. लेकिन फिर, कौन परवाह करता है पतों के बारे में? अब यह मायने रखता है कि सिर्फ विचार है. तो यह यहाँ क्या हो रहा है. जाहिर है, अगर आप ऐसा करेंगे टी ब्रैकेट तो सरणी संकेतन है जो 0,, के course-- और स्पष्ट रूप से, यह लग रहा है यहाँ पर एक सरणी जैसे वहाँ, लेकिन अब यह अजीब बात है. कि प्रोग्रामिंग भाषा जानते हैं, सी,, आप इस सुविधा प्रदान करता है जिससे, टी एक है, भले ही सूचक, या एक सूचक है, आप अभी भी उस परिचित उपयोग कर सकते हैं आरामदायक वर्ग ब्रैकेट अंकन पहले तत्व के लिए जाने के लिए, दूसरा तत्व है, या किसी भी तत्व या कि सूचक इशारा कर रहा है कि के लिए शायद, क्योंकि यह इस मामले में, के रूप में है कुछ सरणी तरफ इशारा करते हुए. तो हम यह कैसे तय करते हैं? यह एक मिला जहां सच कहूँ तो, यह है पहली नज़र में थोड़ा भारी. लेकिन यहाँ एक नए और उन्नत संस्करण है. तो सबसे पहले, मैं जा रहा हूँ CS50 पुस्तकालय से छुटकारा, बस वास्तव में है कि एस बेनकाब करने के लिए एक चार सितारा, सिर्फ एक पर्याय. और टी भी एक चार सितारा है. लेकिन पर क्या हो रहा है उस रेखा के दाहिने हाथ की ओर टी एक मूल्य सौंपा है कहाँ? Malloc क्या है? यह क्या strlen है? Sizeof (चार) क्या है? क्यों बिल्ली इस करता है लाइन नज़र इतनी जटिल है? क्या यह एक उच्च स्तर पर कर रहा है? क्या यह टी में भंडारण है? हाँ? दर्शक: यह आवंटन है एक स्मृति अंतरिक्ष की निश्चित राशि. यह स्टोर करने के लिए है, मुझे लगता है पत्र [अश्राव्य]. डेविड जे Malan: बिल्कुल सही. बिल्कुल सही. यह एक निश्चित आवंटन है स्मृति अंतरिक्ष की राशि , शायद, भविष्य पत्र की दुकान. और विशेष रूप से, malloc इसलिए क्या लौट रहा है? दर्शक: [अश्राव्य] रिटर्निंग? डेविड जे Malan: बिल्कुल. कि स्मृति के पते रिटर्निंग, जो कह का एक अच्छा तरीका है, का पता देता है कि स्मृति की पहली बाइट. मुझे याद करने पर जिम्मेदारी है कितना स्मृति मैं वास्तव में आवंटित या के लिए malloc पूछा. अब जब कि कितना है? खैर, वहाँ है, भले ही यहाँ कोष्ठकों का एक बहुत, malloc सिर्फ एक ही तर्क लेता है. और मैं के strlen निर्दिष्ट, इसलिए दे रहा हूँ मुझे के रूप में कई बाइट्स एस में वहाँ के रूप में, लेकिन एक जोड़ें. क्यों? हाँ? दर्शक: बैकस्लैश 0. डेविड जे Malan: बिल्कुल. हम एक छोटे से घर की देखरेख करने के लिए मिल गया है. एक बैकस्लैश क्योंकि वहाँ तो 0, हम बेहतर है कि याद होगी. अन्यथा, हम जा रहे हैं एक स्ट्रिंग बनाने के लिए कि विशेष टर्मिनेटर नहीं है. इस बीच, सिर्फ सुपर होने की गुदा, मैं, sizeof (चार) है सिर्फ मामले में किसी ने मेरे चलाता नहीं CS50 उपकरण पर कोड, लेकिन शायद एक अलग कंप्यूटर कुल मिलाकर जहां घर का काम सम्मेलन द्वारा, एक बाइट हैं, लेकिन दो बाइट्स, या उस से भी बड़ा कुछ. यह सिर्फ सुपर होने के लिए है, त्रुटियों को सुपर गुरेज. हालांकि, वास्तविकता में, यह है सबसे अधिक संभावना है 1 एक होने जा रहा. अब, इस बीच, मुझे आगे जाना है और कॉपी स्ट्रिंग, टी ब्रैकेट मैं टी ब्रैकेट एस के बराबर होती है. और मैं पिछले हफ्ते के लिए स्थगित होगी स्रोत कोड पर क्या हो रहा है देखने के लिए. कुंजी takeaway, और लेकिन कारण है कि मैं, हरे रंग में अब कोड डाल , कि बहुत अंतिम पंक्ति है, क्योंकि टी ब्रैकेट 0, toupper के बराबर होती है का असर है Capitalizing जो स्ट्रिंग? टी और / या है? कोड की है कि पिछले लाइन. क्या है क्योंकि बस, टी , इस समय हुआ मैं थोड़ा कि अंतिम चरण पूर्ववत हैं, मैं malloc कॉल क्या है, क्या हुआ है मैं अनिवार्य रूप से स्मृति का एक हिस्सा मिलता है कि मूल रूप में एक ही आकार है, कि गणित है क्योंकि मैंने किया. मैं पते टी में भंडारण कर रहा हूँ स्मृति की है कि हिस्सा की. यहां तक ​​कि यह अच्छा लग रहा है, हालांकि और, बहुत अच्छा और खाली, वास्तविकता क्या हम हूँ, वहाँ है यहाँ में, बुला कचरा मूल्यों रहते हैं. स्मृति का वह हिस्सा हो सकता है बहुत पहले अच्छी तरह से इस्तेमाल किया गया है, कुछ सेकंड के, कुछ ही मिनट पहले. तो बिल्कुल संख्या हो सकती है बस दुर्घटना से वहाँ या पत्र,. लेकिन वे मुझे जब तक, वैध नहीं हैं अपने आप को स्मृति का यह हिस्सा आबाद वास्तविक घर का काम के साथ, के रूप में मैं वहाँ पाश के लिए कि में करते हैं. ठीक है? तो अब, के चरमोत्कर्ष इन तीन उदाहरण प्रतीत होता है कि पिछली बार टूट गया इस स्वैप उदाहरण, इस समारोह भावना में काम किया यह एक और बी बदली है. लेकिन यह क्या अन्य अर्थों में काम नहीं किया? हाँ? दर्शक: [अश्राव्य]. डेविड जे Malan: बिल्कुल. मैं इस समारोह में कॉल करने के लिए गए थे उदाहरण के लिए another-- से, , जहां मुख्य तरह एक समारोह से मैं मैं के रूप में, एक चर, एक्स और वाई है पिछले हफ्ते किया था, उसी कोड, और मैं एक्स और वाई में पारित स्वैप, और फिर Swap-- इस कॉल करने के लिए, बेशक, सही संस्करण है हम करने के बारे में क्या कर रहे हैं है see-- यह काम नहीं किया. तो तय क्या है? खैर, तो बस होने के लिए स्पष्ट है, मुझे आगे चलते हैं and-- दूसरा यहां मुझे एक दे, और देखो मैं तुम्हें आखरी दिखा सकते हैं जो मुझे मिल सकता है चलो देखते हैं अगर in-- हो जाएगा इस असली fast-- ठीक है, [अश्राव्य]. ठीक है, वहाँ यह है. इसलिए मैं सिर्फ टाइप कर रहा हूँ आदेशों की अनदेखी. मैं इसे प्राप्त करना चाहते हैं आखिरी मिनट एक उदाहरण पिछली बार से जो अब कोई स्वैप कहा जाता है. तो कोई स्वैप जहां है हम पिछली बार से दूर छोड़ दिया जिससे, मैं initialized 1 के लिए एक्स और 2 के लिए वाई. मैं तो 1 और 2 में गुजर, स्वैप कहते हैं. और फिर इस समारोह कुछ अर्थों में काम किया है, लेकिन यह कोई स्थायी था एक्स और वाई पर प्रभाव. तो हाथ पर सवाल कैसे अब, है हम वास्तव में इस समस्या को दूर करते हैं? हाथ पर समाधान क्या है? खैर, आज नया है जो swap.c, में, मतभेद के एक जोड़े को नोटिस. एक्स और वाई में ही हैं. लेकिन क्या स्पष्ट रूप से है रेखा 25 के बारे में अलग है? अगर तुम्हें याद है क्या, वहाँ नया क्या है यह एक दूसरा पहले की तरह देखा क्या? दर्शक: [अश्राव्य]. डेविड जे Malan: हाँ. तो एम्परसेंड एक नया टुकड़ा वाक्य रचना की न केवल इस कार्यक्रम में, लेकिन यह भी अधिक आम तौर पर CS50 में. तिथि करने के लिए, मुझे नहीं लगता हम किसी भी उदाहरण देखा है या वास्तव में किसी में उनके बारे में बात की थी शायद, preemptively, के अलावा अन्य विस्तार, अनुभाग में, इस तरह एक एम्परसेंड. खैर, यह एम्परसेंड एक है पता चला है नई वाक्य रचना के अंतिम टुकड़े की हम सीखने जा रहे हैं. इसका मतलब है सभी है कुछ चर का पता. क्या पता एक्स रहता है? लेकिन वाई क्या पता रहता है? क्योंकि अगर पहले मौलिक समस्या कि एक्स और वाई पारित किया जा रहा था था हम वास्तव में क्या करना चाहते हैं प्रतियां, के रूप में एक खजाने की तरह साथ स्वैप प्रदान कर रहा है जहां एक्स और वास्तव में वाई की ओर जाता है कि नक्शा इतना है कि, रैम में हैं स्वैप कि मानचित्र का पालन कर सकते हैं एक्स या वाई स्थान अंक जहां कहीं और करने के लिए जाना और वास्तविक मूल्यों को बदलने 1 और 2 क्या आप वहां मौजूद हैं. तो स्वैप भी थोड़ा परिवर्तन करने की जरूरत है. और पहली नज़र में, यह हो सकता है चार स्टार के लिए एक छोटे से समान लग रहे हैं. और वास्तव में यह है. तो एक डेटा किस प्रकार का एक सूचक है, इस पर प्रकाश डाला हिस्से के आधार पर? तो यह एक पूर्णांक है. तो एक अब एक int है, यह एक पूर्णांक का पता है. और इसी तरह, बी अब जा रहा है एक पूर्णांक का पता हो. इसलिए मैं अब मुख्य से स्वैप कॉल करते हैं, मैं स्वैप 1 और 2 देने के लिए नहीं जा रहा हूँ. मैं जैसे यह देने जा रहा हूँ बैल कुछ और बैल कुछ, नेतृत्व करेंगे कि दो पतों उनके वास्तविक स्थानों के लिए स्वैप अपने कंप्यूटर की स्मृति में. तो अब, मेरे शेष कार्यान्वयन एक बालक को बदलने की जरूरत है. क्या अब स्पष्ट रूप से अलग है कोड के इन तीन पंक्तियों में? इन सभी लानत सितारे नहीं है जगह, सब ठीक है? तो क्या यहाँ पर हो रहा है? हाँ? दर्शक: यह [अश्राव्य] जाहिर है. डेविड जे Malan: बिल्कुल. इस context-- में तो और यह नहीं था सर्वश्रेष्ठ डिजाइन निर्णय, बेशक, साल पहले. इस संदर्भ में, जहां में तुम सिर्फ एक सितारा है, और आप एक डेटा प्रकार नहीं है, पूर्णांक की तरह, तुरंत बाईं ओर, बजाय आप स्पष्ट रूप से, एक बराबर चिह्न है, इस संदर्भ में, जब आप कहते हैं एक सितारा, उस के लिए जाने का मतलब एक में है कि पता. इतनी बात करने के लिए, खजाने का नक्शा पालन करें. और इस बीच, रेखा 37 में, यह एक ही बात का मतलब है. पता करने के लिए जाओ, और क्या वहाँ रखा है? जो भी हो पर बी निर्दिष्ट करता है जो स्थान. दूसरे शब्दों में, बी के पास जाओ. कि मूल्य मिलता है. बराबर प्रति, एक के पास जाओ और हस्ताक्षर, असाइनमेंट ऑपरेटर, वहाँ कि मान रखा. इसी प्रकार, पूर्णांक अस्थायी बस एक पूर्णांक है. कुछ भी अस्थायी बारे में बदलने की जरूरत है. यह Annenberg से सिर्फ एक खाली गिलास है कुछ दूध या संतरे का रस के लिए. लेकिन मैं कहता हूँ, ख के लिए जाने की जरूरत है. उस गंतव्य के लिए जाने और वहाँ अस्थायी में मान रखा. तो फिर क्या हो रहा है? मैं वास्तव में अगर, इस बार स्वैप जब कॉल यह पहली ट्रे, यहाँ मुख्य प्रतिनिधित्व करता है इस दूसरी ट्रे स्वैप का प्रतिनिधित्व करता है, जब मैं एम्परसेंड एक्स और एम्परसेंड वाई पारित मुख्य स्वैप करने से, बस, स्पष्ट होना इस ढेर फ्रेम प्राप्त क्या है? हाँ? दर्शक: [अश्राव्य]. डेविड जे Malan: बिल्कुल. एक्स के पते और y का पता. और आप इन के बारे में सोच सकते हैं डाक के पते की तरह. 33 ऑक्सफोर्ड स्ट्रीट और 35 ऑक्सफोर्ड स्ट्रीट, और आप दो इमारतों को स्थानांतरित करना चाहते हैं उन स्थानों पर हैं. यह एक हास्यास्पद विचार की तरह है, लेकिन यह है कि हम पता मतलब सब है. जहाँ दुनिया में कर सकते हैं आप उन दो ints पाते हैं? जहाँ दुनिया में आप कर सकते हैं उन दो इमारतों पाते हैं? तो आखिर अगर, यह सब समय के बाद मैं आज के स्रोत कोड में जाओ और संकलन स्वैप और रन ./swap, अंत में, के लिए पहली बार हम वास्तव में देख रहे है अपने मूल्यों वास्तव में है सफलतापूर्वक बदली गई. और अब, हम भी ले जा सकते हैं इस में, कहते हैं, GDB का नोट. तो मुझे एक ही फाइल में चलते हैं. मुझे आगे जाना है और ./swap की GDB चलाते हैं. और अब, स्वैप, मैं जा रहा हूँ आगे और मुख्य में एक ब्रेक अंक निर्धारित किया है. और अब मैं जा रहा हूँ आगे और कार्यक्रम चलाते हैं. और अब हम अपने कोड देख उस लाइन पर रोक दिया है. मैं आगे और प्रिंट जाओ एक्स, मैं यहाँ क्या देखना चाहिए? यह एक सवाल है. फिर से कहो? दर्शक: [अश्राव्य]. डेविड जे Malan: तो यादृच्छिक संख्या, शायद. शायद मैं भाग्यशाली हो, और यह बात है 0 की तरह, अच्छा और सरल. लेकिन शायद यह कुछ यादृच्छिक संख्या है. इस मामले में, मैं भाग्यशाली है. यह सिर्फ 0 होना होता है. लेकिन यह वास्तव में भाग्य है नहीं जब तक क्योंकि मैं अगले प्रकार और फिर प्रिंट एक्स कि है कोड की रेखा, रेखा 19, मार डाला गया. इस बीच, मैं प्रकार अगर अगले फिर से, और अब मैं 2 को देखने के लिए जा रहा हूँ, वाई बाहर प्रिंट. मैं अगले प्रकार अब, अगर, यह जा रहा है एक छोटे से भ्रमित हो, क्योंकि अब, printf पर दिखाई जा रही है स्क्रीन यह किया है, के रूप में. एक्स 1 है. चलो फिर से यह करते हैं. और अब, यहाँ कहाँ है बातें दिलचस्प मिल. मैं स्वैप या भी कदम फोन से पहले इसे में, चलो थोड़ा तिरछी नज़र रखना. एक्स, फिर, 1 है. वाई, बेशक, त्वरित विवेक है इतना मुश्किल नहीं है वहाँ,, 2 की जाँच करें. लेकिन एम्परसेंड एक्स क्या है? जवाब दो, यह एक तरह से कायरता लग रही है. लेकिन कोष्ठकों में पूर्णांक स्टार बस है यह कह के सकल घरेलू उत्पाद की तरह एक पता है. यह एक के लिए एक सूचक एक पूर्णांक नहीं है पूर्णांक, या अन्यथा एक पते के रूप में जाना जाता है. इस पागल बात क्या है? हम कुछ कभी नहीं देखा काफी पहले की तरह. तो यह मेरे कंप्यूटर में पता है एक्स जीना होता है जहां की स्मृति. यह बैल कुछ है. और यह सच में, क्यों, है मैं तीर ड्राइंग शुरू कर दिया है, बजाय संख्या की, जो वास्तव में परवाह है क्योंकि अपने पूर्णांक एक विशेष पर है कि बड़ा है कि उस पते. लेकिन bffff0c4, इन सभी कर रहे हैं वास्तव में हेक्साडेसिमल अंक, एफ के माध्यम से 0 कर रहे हैं. तो हम भी ध्यान केन्द्रित करने के लिए नहीं जा रहे हैं उन चीजों में क्या कर रहे हैं पर लंबा. लेकिन मैं y बाहर प्रिंट, बेशक, मैं 2 देखें. लेकिन एम्परसेंड वाई, मैं इस पते देखते हैं. और नोटिस, जिज्ञासु के लिए, अलग एक्स और वाई कितनी दूर हैं? आप पते के सबसे अनदेखा कर सकते हैं. चार बाइट्स. और उस के साथ संगत है हमारी पहले एक पूर्णांक कितना बड़ा दावा है कि? चार बाइट्स. तो यह सब कुछ के अस्तर ऊपर की तरह लग रहा है अच्छी तरह से, आप स्मृति में, उम्मीद है कि हो सकता है के रूप में. तो अब, बस तेजी से आगे चलो इस कहानी का अंत करने के लिए. , चलो आगे बढ़ो और कदम टाइप करते स्वैप समारोह में डुबकी. अब मैं एक प्रकार है, यह है, नोटिस एक्स के पते के समान. मैं बी टाइप करते हैं, तो यह समान है वाई का पता करने के लिए. इसलिए मुझे लगता है मैं तो क्या देखना चाहिए , एक पते पर जाने कहते हो? तो एक स्टार प्रिंट. तो सितारा इस संदर्भ में, वहाँ जाने का मतलब है. एम्परसेंड का पता है क्या मतलब है. तो एक साधन के 1 स्टार. और प्रिंट सितारा ख मुझे 2 देता है. और मुझे पल के लिए, मान लेते हैं, कम से कम कोड कि कि हो सकता है अब अमल आय उस रास्ते में के माध्यम से समझाया. लेकिन हम लंबे समय से पहले इस विचार को फिर से आना करेंगे. स्वैप की तो यह संस्करण अब सही है और अनुमति देता है हमें इस विशेष डेटा प्रकार स्वैप करने के लिए. तो कोई प्रश्न तो स्वैप पर? स्टार पर? के पते पर? और तुम्हारे साथ, देखेंगे समस्या है, की तरह, 4 सेट लेकिन समस्या यह है कि 5, निश्चित रूप से, कैसे इन सेट बातें उपयोगी होते हैं और मिल भी बहुत कुछ नतीजतन, उनके साथ सहज. सभी में कुछ भी? ठीक है. तो malloc, इस समारोह में फिर से है, कि सिर्फ स्मृति, स्मृति का आवंटन आवंटन. और क्यों यह उपयोगी है? खैर, यह सब समय, आप malloc का उपयोग किया गया है. तुम अब विचार कैसे हैं निर्माण getString, शायद, यह है का एक हिस्सा के लिए किसी से पूछ गया स्मृति, कभी भी उपयोगकर्ता प्रकार एक स्ट्रिंग में, निश्चित रूप से हम क्योंकि पता नहीं था, CS50 स्टाफ के रूप में, कितना बड़ा उन तार कि मनुष्य हो सकता है टाइप करने के लिए जा रहे हैं. तो चलो, पहले समय के लिए, के लिए शुरू करते हैं छील वापस कैसे CS50 पुस्तकालय निर्माण, उदाहरण के एक जोड़े के माध्यम से कि हमें वहाँ का नेतृत्व करेंगे. मैं एडिट खोल तो अगर और, scanf 0 खोलो हम निम्नलिखित कोड को देखने के लिए जा रहे हैं. के लिए वेबसाइट पर उपलब्ध scanf 0, आज, कोड की अपेक्षाकृत कुछ लाइनें है यहाँ, 20 के माध्यम से 14. और चलो यह क्या कर रहा है देखते हैं. यह एक पूर्णांक कहा जाता है, एक्स वाणी है. यह कुछ ऐसा, संख्या कृपया कहते हैं. और अब यह scanf% मैं, और एक्स, कहते हैं. तो वहाँ नया सामान का एक गुच्छा है. लेकिन scanf, आप की तरह सोच सकते हैं के printf के विपरीत है. printf, बेशक, स्क्रीन करने के लिए प्रिंट. उपयोगकर्ता से स्कैन की scanf क्रमबद्ध कुंजीपटल कुछ वह या वह टाइप किया गया है. % मैं सिर्फ printf की तरह है. इस उम्मीद का मतलब उपयोगकर्ता एक पूर्णांक टाइप करने के लिए. और अब, तुम क्यों मुझे लगता है scanf और एक्स पारित हो सकता है? यदि scanf के जीवन में उद्देश्य उपयोगकर्ता से कुछ मिल रहा है, का अर्थ क्या है अब, यह गुजर रहा है, और एक्स? हाँ? दर्शक: [अश्राव्य]. डेविड जे Malan: बिल्कुल. मैं जो भी, मानव,, मेरे इनपुट में टाइप करें उस स्थान पर बचाया जा रहा है. यह सिर्फ करने के लिए, याद करते हैं, पर्याप्त नहीं है हम पहले से ही देखा है, क्योंकि एक्स में पारित, किसी भी समय आप सिर्फ एक कच्चा चर पारित एक पूर्णांक की तरह, कुछ अन्य कार्य करने के लिए, बेशक, यह है कि बदल सकते हैं चर, लेकिन स्थायी रूप से नहीं. यह मुख्य पर असर नहीं कर सकते हैं. यह केवल अपनी ही स्थानीय प्रतिलिपि को बदल सकते हैं. लेकिन अगर इसके बजाय, आप नहीं करते मुझे वास्तविक पूर्णांक दे, लेकिन आप मुझे निर्देश के लिए दे कि पूर्णांक, मैं अब,, scanf जा रहा है निश्चित रूप से, मुझे लगता है कि पालन कर सकते हैं पता और वहाँ एक नंबर डाल तो आप के रूप में अच्छी तरह से इसे करने के लिए उपयोग किया है. मैं इस कार्यक्रम चलाते समय तो, चलो देखते हैं. Scanf 0 डॉट स्लेश बनाओ, 0 scanf. और मैं अब एक नंबर टाइप 50 की तरह, 50 के लिए धन्यवाद. मैं अब की तरह एक नंबर टाइप करें नकारात्मक 1 के लिए, 1 नकारात्मक. मैं अब एचएम, 1.5 की तरह एक नंबर लिखें. क्यों मेरे प्रोग्राम मुझे अनदेखा किया? खैर, क्योंकि बस, मुझे बताया गया यह एक पूर्णांक ही उम्मीद है. ठीक है. तो यह है कि इस का एक संस्करण है. चलो एक पायदान ऊपर बातें लेते हैं और यह अच्छा नहीं है कि प्रस्ताव. और इस के साथ साथ एक बहुत ही सरल उदाहरण झूठ हम कोड लिखने शुरू कर सकते हैं कि कैसे अन्य लोगों का दोहन कर सकते हैं कि या बुरी बातें करके समझौता. तो लाइन 16, तो इसी तरह आत्मा में से पहले तक, लेकिन मैं इसे इस समय int की घोषणा नहीं कर रहा हूँ. मैं स्ट्रिंग उर्फ, यह चार सितारा घोषणा कर रहा हूँ. लेकिन यह है कि वास्तव में क्या मतलब है? तो मैं एक address-- निर्दिष्ट नहीं है और मैं मनमाने ढंग से यह कह रहा हूँ, बफर, लेकिन मैं simple-- होने के लिए, यह बात कह सकते हैं और फिर मैं ऐसा करने के लिए मुझे समझाने की, आप पिछले पर आधारित सकता है, अगर तर्क, scanf लाइन 18 में क्या कर रहा है, पास% है और बफर हैं, एक पते जो है? आप लागू अगर scanf, क्या है संस्करण 0 के रूप में सटीक एक ही तर्क, यहाँ क्या करने की कोशिश की जा रही है, जब में उपयोगकर्ता प्रकार कुछ और? हाँ? दर्शक: [अश्राव्य]. डेविड जे Malan: बिल्कुल. Scanf, तर्क पहले से, स्ट्रिंग ले जा रहा है मानव द्वारा लिखे गए , यह अब एक स्ट्रिंग है in-- यह, शायद, एक नंबर नहीं है वह या वह cooperates-- अगर और यह कि डाल करने के लिए प्रयास करने के लिए जा रहा है जो भी पते पर स्मृति में स्ट्रिंग बफर निर्दिष्ट करता है. और यह महान है, बफर क्योंकि वास्तव में एक पते के लिए होती है. लेकिन मैं इस कार्यक्रम में एक छोटी गाड़ी है दावा बहुत गंभीर रास्ता, मूल्य क्या है क्योंकि डिफ़ॉल्ट रूप से बफर? मैं क्या में initialized है? स्मृति का क्या हिस्सा? मैं नहीं है, है ना? इसलिए मैं आवंटित करने के बावजूद एक अब नहीं है कहा जाता है कि चार सितारा, यह बजाय कहा जाता है, तो buffer-- चर का नाम खींचना मैं नहीं है अगर अब के रूप में buffer-- यहाँ getString या malloc कहा जाता है, कि प्रभावी रूप से इसका मतलब है कि बफर सिर्फ कुछ कचरा मूल्य है. अब इसका क्या मतलब है? यह मैं scanf बताया है कि इसका मतलब है उपयोगकर्ता से एक स्ट्रिंग की उम्मीद है. और तुम जानते हो क्या? जो भी इस बात की ओर इशारा करते है to-- और मैं सवालिया निशान आकर्षित, लेकिन वास्तविकता में, यह होने जा रहा है OX1, 2, 3, की तरह कुछ ठीक है? यह कुछ फर्जी मूल्य है कि बस पहले से वहाँ होना होता है. तो दूसरे शब्दों में कहें, यह है बफर बस है मानो स्मृति में कुछ की ओर इशारा करते. मैं क्या है पता नहीं है. मैं अब Gabe में टाइप करें तो, अगर यह हो रहा है वहाँ G-a-B-ए / 0 डाल करने के लिए प्रयास करने के लिए. लेकिन जो है कि वह क्या जानता है? और अतीत में, किसी भी हम संपर्क करने की कोशिश की है समय संबंधित नहीं है कि स्मृति हमारे लिए, क्या हुआ है? या लगभग हर समय. विभाजन गलती, सही? यह है जहाँ यह तीर, मुझे पता नहीं है ओर इशारा करते हुए. यह सिर्फ कुछ यादृच्छिक मूल्य है. और हां, आप व्याख्या अगर एक पते के रूप में एक यादृच्छिक मूल्य, आप के लिए जा रहे हैं कुछ बेतरतीब गंतव्य. तो Gabe दुर्घटना वास्तव में हो सकता है यहाँ इस मामले में मेरे कार्यक्रम. इसलिए हम चाहते हैं कि लगभग रूप में बुरा क्या कर सकते हैं? इस तीसरे पर विचार करें और scanf का अंतिम उदाहरण. इस संस्करण में क्या मायने में बेहतर है? आप के साथ आराम कर रहे हैं पिछले समस्या, यह बेहतर है. क्यों? दर्शक: [अश्राव्य]. डेविड जे Malan: अच्छा. लाइन 16 का तो इस मामले इस अर्थ में, बेहतर है हम स्पष्ट रूप से कर रहे हैं कि कुछ स्मृति का आवंटन. हम malloc का उपयोग नहीं कर रहे हैं हम सप्ताह 2 का उपयोग कर रहे हैं सिर्फ एक सरणी की घोषणा की दृष्टिकोण. और हम हैं कि एक स्ट्रिंग पहले कहा है अक्षर का सिर्फ एक सरणी है, तो यह पूरी तरह से वैध है. लेकिन यह रूप में, ज़ाहिर है, है आप 16,, निश्चित आकार ध्यान दें. इसलिए इस कार्यक्रम है पूरी तरह से सुरक्षित, मैं प्रकार यदि एक चरित्र तार में, दो चरित्र तार, 15 चरित्र तार. लेकिन जैसे ही मैं 16 टाइप करना आरंभ के रूप में, 17, 18, 1000 चरित्र तार, जहां कि स्ट्रिंग समाप्त करने के लिए जा रहा है? यह आंशिक रूप से यहां खत्म हो जा रहा है. लेकिन तब कौन और क्या सीमाओं से परे है इस विशेष सरणी की? मैं हालांकि ऐसा लगता है जैसे यहां 16 बक्से की घोषणा की. इसलिए सभी 16 बाहर आकर्षित करने के बजाय, हम करेंगे अभी मैं 16 खींचा है कि नाटक. लेकिन मैं तो एक स्ट्रिंग पढ़ने की कोशिश अगर कि 50 पात्रों की तरह, बहुत लंबे समय तक है, मैं लगाने शुरू करने जा रहा हूँ ए, बी, सी, डी, एक्स, वाई, जेड. और यह शायद है कुछ अन्य स्मृति खंड कि, फिर से, कारण हो सकता है मेरे कार्यक्रम, दुर्घटना के लिए मैं के लिए नहीं कहा गया है, क्योंकि सिर्फ 16 बाइट्स से अधिक कुछ भी. तो कौन परवाह करता है? वैसे, यहाँ CS50 पुस्तकालय है. और इस का सबसे बस है ऊपर दिए गए निर्देशों की तरह. CS50 पुस्तकालय, यह सब समय, लाइन 52 में इस लाइन पड़ा है. हम typedef देखा, या किया है आप typedef देखेंगे बस एक बनाता है जो pset 4 में पर्याय चार सितारा और अधिक हो सकता है जिससे बस स्ट्रिंग के रूप में भेजा. तो इस में से एक है कुछ प्रशिक्षण पहियों हम हुड के नीचे चुपके से उपयोग किया है. इस बीच, यहां getchar, समारोह है. अब जाहिर है, इसका कोई शरीर नहीं है. और वास्तव में, मैं रखना स्क्रॉल, मैं वास्तव में नहीं करते किसी भी कार्यान्वयन देखना इन कार्यों की. एक मानसिक स्वास्थ्य की जांच के रूप में, ऐसा क्यों है? दर्शक: [अश्राव्य]. डेविड जे Malan: हाँ. तो इस हेडर फाइल है. और हेडर फाइल प्रोटोटाइप होते हैं, प्लस कुछ अन्य सामान, ऐसा लगता है, 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 क्या आप चाहते है एक पार्स समारोह कहते हैं. यह मैं स्ट्रिंग पर लग रहा है , चरित्र से, चरित्र में टाइप और उपयोगी कुछ भी करता है. स्ट्रिंग लाइन में संग्रहीत किया जाता है. और मैं केवल द्वारा जा रहा है कि पता ठीक है, ओह, यहाँ और कह बैक अप लेने, मैं नहीं है इस समय, लेकिन रेखा कहा जाता है. और अब यह थोड़ा अलग है. लेकिन यह प्रभावी कारणों से, इसका मतलब है हम कुछ हद तक, आज हमारे हाथ की लहर करेंगे हम करने के लिए जाँच कर रहे हैं कि उपयोगकर्ता में टाइप अगर देखना और int और शायद एक और चरित्र. उपयोगकर्ता एक पूर्णांक में टाइप करते हैं, तो यह बात है मैं कर रहा हूँ क्योंकि जा रहा, एन में जमा करने के लिए पते से यह गुजर रहा है, हम आज देखा है नई चाल. उपयोगकर्ता भी टाइप जैसे 123x में, कि एक्स एक को समाप्त करने के लिए जा रहा है चरित्र ग में पत्र. अब यह है कि sscanf पता चला है समझदारी से, मुझे बता देगा, कितने चर sscanf था भरने के लिए सफलतापूर्वक सक्षम. इस तर्क से, तो अगर समारोह मैं, getInt है लागू कर रहा हूँ लेकिन मैं देख रहा हूँ, संभवतः, उपयोगकर्ता के लिए एक पूर्णांक में टाइप किया है करने के लिए कुछ और के द्वारा पीछा किया, क्या मैं sscanf के लिए करना चाहते हैं मान वास्तव में हो सकता है? उद्देश्य को पाने के लिए है बस उपयोगकर्ता से एक पूर्णांक? तो sscanf देता है 2, इसका क्या मतलब है? उपयोगकर्ता में टाइप कुछ ऐसा है, सचमुच, सिर्फ बकवास है जो 123x,. यह एक त्रुटि हालत है, और मैं उस के लिए जाँच करना चाहते हैं. तो इस में उपयोगकर्ता प्रकार के हैं, के द्वारा इस तर्क, लौटने sscanf क्या करता है, आप कहेंगे? तो यह है, क्योंकि 2 वापस करने के लिए जा रहा है 123, यहाँ में जाना जा रहा है और एक्स यहाँ में खत्म हो जा रहा है. लेकिन मैं एक्स भर पाने के लिए नहीं करना चाहती. मैं केवल में सफल होने के लिए sscanf करना चाहते हैं इसके चर के पहले भरने. और ऐसा इसलिए मैं sscanf 1 लौटना चाहते हैं. और यह सिर पर एक सा है पल के लिए, कि पूरी तरह से ठीक है. , हालांकि उस एक एहसास getInt और getString के मूल्यों हम एक की एक बिल्ली कर रहे हैं इस तरह तो जाँच त्रुटि की बहुत कि, आज तक, तुम बहुत ज्यादा कर सकते हैं अपने कीबोर्ड पर कुछ भी टाइप करें, और हम इसे पकड़ना होगा. और हम निश्चित रूप से, स्टाफ, नहीं निश्चित रूप से होगा में एक बग का स्रोत हो आपके कार्यक्रम, हम बचाव कर रहे हैं क्योंकि बेवकूफ सभी के लिए जाँच एक उपयोगकर्ता कर सकता है कि चीजें, , जब एक स्ट्रिंग टाइपिंग की तरह आप वास्तव में पूर्णांक चाहता था. इसलिए हम आऊँगा now-- के लिए वापस करने के लिए इस long-- पहले लेकिन यह सब समय, getString और getInt है इस का उपयोग कर हुड के नीचे किया गया स्मृति के पते का मूल विचार. तो अब, एक की बातें करते हैं उपयोगकर्ता के अनुकूल छोटे से अधिक. आप Binky पिछले से, याद कर सकते हैं time-- अपने माउस तो cooperate-- होगा अगर हम इस कोड था जो सच कहूँ तो, काफी अतर्कसंगत है. इस कोड को कुछ नहीं प्राप्त होता है उपयोगी, लेकिन यह उदाहरण था कि प्रोफेसर Parlante प्रतिनिधित्व करने के लिए इस्तेमाल किया क्या एक में जा रहा था स्मृति से जुड़े कार्यक्रम. तो चलो इस निकल जाने कहानी सुपर संक्षेप. ये पहली दो पंक्तियों में अंग्रेजी, आप क्या कहेंगे करते हैं? बस में यथोचित मानव, लेकिन थोड़ा तकनीकी शब्दों, एक चाकू ले. दर्शक: [अश्राव्य]. डेविड जे Malan: ठीक है, आप की स्थापना कर रहे हैं अपने एक्स और वाई चर के लिए पतों. काफी नहीं है, एक्स और वाई नहीं कर रहे हैं क्योंकि पारंपरिक अर्थों में चर. एक्स और वाई पते हैं या पते की दुकान है. तो चलो इस बार और अधिक कोशिश करते हैं. नहीं एक बुरा शुरू, यद्यपि. हाँ? दर्शक: [अश्राव्य]. डेविड जे Malan: अच्छा. मुझे लगता है कि एक छोटे से क्लीनर है. दो संकेत, दो पूर्णांकों की घोषणा. और हम उन्हें एक्स और वाई बुला रहे हैं. या हम थे आकर्षित करने के लिए इस एक तस्वीर के रूप में, फिर से, काफी बस कि सभी को याद हम चाहते हैं कि पहली पंक्ति के साथ कर रहे हैं इस तरह से एक बॉक्स आ रहा है, इसमें कुछ कचरा मूल्य के साथ, और फिर यह एक्स बुला, और इस तरह एक और बॉक्स, कुछ कचरा मूल्य के साथ इसे में, वाई बुला. हम दो घोषित किया है संकेत है कि अंततः एक पूर्णांक के पते की दुकान है. तो यह है कि सब कुछ है. Binky ऐसा किया तो जब, मिट्टी सिर्फ इस तरह से देखा. और निक बस की तरह तीर लिपटे, के रूप में हालांकि वे कहीं ओर इशारा करते हुए नहीं रहे विशेष रूप से, क्योंकि वे अभी कर रहे हैं कचरा मूल्यों. वे स्पष्ट रूप से प्रारंभ नहीं रहे कहीं भी विशेष रूप से. अब अगली पंक्ति कोड, याद करते हैं, यह था. , यथोचित उपयोगकर्ता के अनुकूल में तो लेकिन कुछ तकनीकी अंग्रेजी, कोड कर की इस पंक्ति क्या है? हाँ? दर्शक: [अश्राव्य]. डेविड जे Malan: बिल्कुल सही. यह का हिस्सा आवंटन है एक पूर्णांक के आकार है कि स्मृति. और वह आधा जवाब है. आप सही जवाब दिए अभिव्यक्ति की आधी. पर क्या हो रहा है बराबर चिह्न के बाएं हाथ की ओर? हाँ? दर्शक: और प्रदान यह चर एक्स के लिए? डेविड जे Malan: और प्रदान यह चर एक्स के लिए. संक्षिप्त, दाएँ हाथ की ओर आवंटित करने के लिए तो पर्याप्त स्मृति एक पूर्णांक स्टोर करने के लिए. लेकिन malloc विशेष रूप से पता देता है आपने जो स्मृति की है कि हिस्सा है, सिर्फ एक्स में जमा हो जाता है प्रस्ताव रखा. तो क्या निक Binky साथ पिछली बार किया था है वह है कि सूचक बाहर घसीटा, मिट्टी, स्मृति की एक सफेद हिस्सा पर अब बात करने के लिए कि एक पूर्णांक के आकार के बराबर है. और वास्तव में, कि मतलब है चार बाइट्स का प्रतिनिधित्व करने के लिए. कोड की अब, अगली पंक्ति इस किया था, सितारा x 42 हो जाता है. तो 42 पर सीधा है दाएँ हाथ की ओर, जीवन का अर्थ. बाएं हाथ की ओर, स्टार एक्स क्या मतलब है? यह ठीक है gone-- वह भी हो सकता है. ठीक. दर्शक: असल में, [अश्राव्य] के लिए जाना डेविड जे Malan: अच्छा. दर्शक: [अश्राव्य]. डेविड जे Malan: बिल्कुल. बाएं हाथ की ओर एक्स के लिए जाने का मतलब है. एक्स पता है. यह 33 ऑक्सफोर्ड स्ट्रीट, या OX1 की तरह है. और स्टार एक्स कि करने के लिए जाने का मतलब पता और क्या वहाँ रखा है? 42. तो वास्तव में, कि निक ने ठीक यही किया. उन्होंने कहा, द्वारा के साथ शुरू अनिवार्य रूप से, मानसिक रूप से एक उंगली पर इंगित एक्स, तीर निम्नलिखित दाएँ हाथ पर सफेद बॉक्स करने के लिए पक्ष, और वहाँ 42 नंबर डाल. लेकिन फिर चीजें मिल गया एक थोड़ा खतरनाक है, है ना? Binky की उसके सिर खोने के बारे में. स्टार Y क्या मतलब, 13, दुर्भाग्य बराबर होती है? तो सितारा वाई साधन वाई में पता करने के लिए जाना. लेकिन वाई में पता क्या है? ठीक है, यह कचरा मूल्य सही है? मैं एक प्रश्न चिह्न के रूप में यह आकर्षित किया. निक एक कर्ल करवाने तीर के रूप में यह आकर्षित किया. और जैसे ही आप करने की कोशिश के रूप में वहां जाने के लिए कह रही, सितारा वाई करते, लेकिन एक वैध नहीं है पता है, यह कुछ फर्जी स्थान है, कार्यक्रम दुर्घटना के लिए जा रहा है. और Binky के सिर जा रहा है यह रूप में किया था, यहां से उड़ान भरने के लिए. अंत में, इस कार्यक्रम तो सिर्फ फ्लैट बाहर दोष था. यह एक छोटी गाड़ी कार्यक्रम था. और यह तय होने की जरूरत है. और एक ही तरीका है, वास्तव में, यह तय करने के लिए हो सकता है, उदाहरण के लिए, इस लाइन, हम भी करने के लिए नहीं मिला है, जो क्योंकि कार्यक्रम भी जल्द ही दुर्घटनाग्रस्त हो गया. लेकिन हम इसे ठीक करने के लिए गए थे, तो क्या प्रभाव वाई बराबर एक्स कर रही है? खैर, यह अनिवार्य रूप में वाई अंक जो भी मूल्य एक्स पर इशारा कर रहा है. निक की कहानी में तो, या Binky की कहानी, दोनों एक्स और वाई में इशारा कर रहे थे स्मृति का सफेद हिस्सा, इसलिए कि, अंत में, जब आप वाई फिर 13 के बराबर होती स्टार है, आप में से 13 डाल अंत उचित स्थान. तो इन लाइनों के सभी पूरी तरह से कर रहे हैं वैध, इस एक को छोड़कर, यह आप से पहले हुआ जब वास्तव में वाई कुछ मूल्य सौंपा. अब शुक्र है, तुम नहीं करते सभी के माध्यम से कारण है अपने दम पर मुद्दों के इन प्रकार के. मुझे आगे जाना है और खोलने के चलो यहां एक टर्मिनल विंडो के ऊपर और बस एक पल के लिए, खोल, एक सुपर छोटे प्रोग्राम है कि भी तरह की व्यर्थ है. यह बदसूरत है. यह उपयोगी कुछ भी हासिल नहीं होता है. लेकिन यह मुद्दों को प्रदर्शित करता है स्मृति की, तो चलो एक नज़र रखना. मुख्य, सुपर सरल. यह जाहिरा तौर पर एक समारोह कॉल, च, और फिर 0 देता है. यह गड़बड़ यह अप करने के लिए मुश्किल की तरह है. तो मुख्य अब तक, बहुत अच्छा है. तो च समस्याग्रस्त है. और अभी ज्यादा नहीं डाली यह नामकरण में प्रयास यहाँ, कोड पर ध्यान केंद्रित रखने के लिए. च दो लाइनें है. और चलो अब क्या हो रहा है देखते हैं. तो एक तरफ here-- और मुझे बनाते हैं पिछले साथ इस संगत एक ओर example--, बाएं हाथ की ओर है अंग्रेजी में, क्या कर रहे हो? यह is-- दर्शक: एक सूचक बना रहा. डेविड जे Malan: एक सूचक बनाना एक पूर्णांक के लिए और बुला यह एक्स. तो यह उन बक्से में से एक बना रहा है मैं टच स्क्रीन पर ड्राइंग आते. और अब, दाएँ हाथ पर पक्ष, malloc, ज़ाहिर है, स्मृति का एक हिस्सा आबंटित है. और अभी स्पष्ट होना करने के लिए, कैसे ज्यादा स्मृति जाहिरा तौर पर यह है आवंटन, आप तो बस एक तरह से यहां गणित है? तो यह 40 बाइट्स है. और मुझे पता है कि मैं एक पता ही है क्योंकि पूर्णांक, CS50 उपकरण पर, कम से कम, चार बाइट्स है. तो 10 गुना 4 40 है. तो यह एक एक्स जमा कर रहा है, पता 40 ints की पहली बाहर की कि वापस अंतरिक्ष आवंटित किया गया है, वापस करने के लिए, वापस करने के लिए, वापस करने के लिए. और वह malloc के बारे में महत्वपूर्ण क्या है. यह एक छोटी सी स्मृति नहीं ले करता है यहाँ, एक यहाँ थोड़ा, थोड़ा यहाँ. यह आप स्मृति का एक हिस्सा देता है समीप, परिचालन से प्रणाली. अब इस बारे में क्या, एक्स ब्रैकेट 10 0 के बराबर होती है? कोड की मनमानी लाइन. यह उपयोगी कुछ भी हासिल नहीं होता है. लेकिन यह दिलचस्प है एक्स ब्रैकेट 10-- क्योंकि? हाँ? दर्शक: [अश्राव्य]? डेविड जे Malan: एक्स ब्रैकेट 10 अशक्त होने की जरूरत नहीं है. अशक्त विस्तार ही खेलने में आता है तार के साथ एक स्ट्रिंग के अंत में. लेकिन एक अच्छा विचार. कितना बड़ा भी, इस सरणी है मैं 40 बाइट्स आवंटित किया है, हालांकि? यह सही, नौ के माध्यम से 0 है? यह कुल, 10 ints है. 40 बाइट्स, लेकिन 10 ints, 0 के माध्यम से 0 अनुक्रमित. इसलिए कि एक्स ब्रैकेट 10 क्या है? यह वास्तव में कुछ अज्ञात कचरा मूल्य. यह मेरे लिए नहीं है कि स्मृति है. मुझे लगता है कि छू नहीं होना चाहिए बाइट संख्या 41, 42, 43, 44. मैं बहुत दूर थोड़ा जा रहा हूँ. और वास्तव में, मैं चलाने अगर इस कार्यक्रम, यह बहुत अच्छी तरह से दुर्घटना हो सकती है. लेकिन कभी कभी, हम भाग्यशाली मिल जाएगा. और तो सिर्फ प्रदर्शित करने के लिए this-- और स्पष्ट रूप से, आप पहले कभी पता नहीं it-- की इस दौड़ करते हैं. यह वास्तव में दुर्घटना नहीं किया. लेकिन मैं के लिए यह बदलते हैं उदाहरण के लिए, 1000 की तरह बनना वास्तव में यह सुनिश्चित करने के लिए जानबूझकर, चलो देखते हैं हम प्राप्त कर सकते हैं अगर यह इस समय दुर्घटना करने के लिए. ठीक है, यह दुर्घटना नहीं था. कैसे 100,000 के बारे में? चलो यह रीमेक करते हैं, और अब यह फिर से दौड़ना. ठीक. ओफ़्फ़. ठीक है. तो जाहिर है, फिर से, इन स्मृति के क्षेत्रों, तो बात है, इसलिए हम कर सकते हैं, काफी बड़ी हैं बार बार भाग्यशाली हो. लेकिन अंत में, एक बार आप हास्यास्पद मिल और वास्तव में, स्क्रीन पर अब तक बाहर जाना आपको लगता है कि वास्तव में स्मृति को छूने वास्तव में आप से संबंधित नहीं है. लेकिन स्पष्ट रूप से, इन कीड़े की तरह जा रहे हैं कठिन है और कठिन हो अपने दम पर यह पता लगाने की. लेकिन शुक्र है, प्रोग्रामर के रूप में, हम हैं हमें हमारे लिए ऐसा करने की अनुमति उपकरण है कि. तो यह शायद, एक है ugliest कार्यक्रमों की, GDB के उत्पादन से भी uglier. लेकिन यह हमेशा एक लाइन है या सुपर उपयोगी होते हैं कि दो. वेलग्रिंड में मदद करता है कि एक कार्यक्रम है आप एक कार्यक्रम डिबग नहीं, दर असल, लेकिन स्मृति से संबंधित लगता है समस्याओं, विशेष रूप से. यह स्वतः के लिए अपने कोड चलेगा आप और कम से कम दो बातों के लिए देखो. एक, आप कुछ करना था स्पर्श स्मृति की तरह आकस्मिक कि आप का नहीं था? यह आपको उन मामलों को खोजने में मदद मिलेगी. और दो, यह मदद मिलेगी तुम्हें बुलाया कुछ मिल स्मृति लीक, हमारे पास जो पूरी तरह से नजरअंदाज कर दिया, भोलेपन से, कुछ समय के लिए और सानंद. लेकिन यह सब पता चला है, इस समय, जब भी आप getString में बुलाया है हमारे कार्यक्रमों के इतने, आप ऑपरेटिंग पूछ रहे हैं स्मृति के लिए प्रणाली, लेकिन आप किसी भी याद है कभी यह दे रही है पीठ, कर unalloc, या नि: शुल्क, यह कहा जाता है के रूप में. नहीं, क्योंकि हम कभी नहीं किया है ऐसा करने के लिए कहा. लेकिन यह सब समय, कार्यक्रमों तुम सी में लिख रहा हूँ स्मृति लीक किया गया है, ऑपरेटिंग पूछ अधिक से अधिक के लिए प्रणाली तार और whatnot के लिए स्मृति, लेकिन यह वापस सौंपने कभी नहीं. और अब यह एक सा है एक अति सरलीकरण की, लेकिन क्या आपने कभी सोचा है, तो अपने मैक चलाने या कुछ समय के उद्घाटन के लिए अपने पीसी कार्यक्रमों के बहुत सारे, शायद, कार्यक्रम समापन और भले ही अपने कंप्यूटर दुर्घटनाग्रस्त हो जाने से नहीं हुआ है, यह तो बहुत धीमी हो रही है यह सच है के रूप में हालांकि स्मृति का एक बहुत का उपयोग या संसाधनों, भले ही, अगर तुम नहीं हो भी कीबोर्ड को छू, कि be-- लेकिन नहीं always-- सकती थी कार्यक्रमों आप चल रहे हैं कि हो सकता है खुद को स्मृति लीक है. और वे अधिक से लिए ओएस पूछते रहते हैं अधिक स्मृति, लेकिन इसके बारे में भूल, वास्तव में, यह प्रयोग नहीं लेकिन इसलिए दूर स्मृति लेने यह चाहते हो सकता है कि अन्य कार्यक्रमों से. तो यह है कि एक आम विवरण है. अब यहाँ कहाँ वेलग्रिंड की है उत्पादन पूरी तरह से है उन कम करने नृशंस और समान रूप से और अधिक आरामदायक. लेकिन दिलचस्प सामान यहाँ सही है. यह मुझे की एक अवैध लिखने कह रही है आकार चार, इस कार्यक्रम में होता है विशेष रूप से, memory.c की लाइन 21 पर. मैं एचएम, वहाँ वास्तव में, 21 लाइन के लिए जाओ आकार चार की एक अवैध लिखना है. क्यों आकार चार? खैर, इस number-- और यह anything-- हो सकता है एक पूर्णांक है. तो यह चार बाइट्स है. इसलिए मैं चार बाइट्स डाल रहा हूँ जहां वे संबंधित नहीं है. कि क्या वेलग्रिंड है वास्तव में मुझे बता रहा है. इसके अलावा, यह भी होगा हम देखेंगे, मुझे बताओ, आप इस एक भविष्य pset में चलाने के रूप में, अगर और आप जो वास्तव में स्मृति, लीक कर दिया है जब मैंने फोन किया है, क्योंकि मैं है malloc, लेकिन मैं वास्तव में नहीं है नि: शुल्क, इस मामले में, कहा जाता है, जो हम अंततः देखेंगे malloc के विपरीत है. तो अब, मैं एक अंतिम उदाहरण लगता है. तो यह एक छोटे से अधिक है रहस्यमय है, लेकिन यह शायद है के लिए सबसे बड़ा कारण , स्मृति के साथ सावधान रहना और कारण यह है कि कई कार्यक्रमों और यहां तक ​​कि इस दिन के लिए / या वेब सर्वर,, कहीं बुरे लोगों द्वारा उठाए गए हैं इंटरनेट पर किसी भी तरह कौन हैं अपने सर्वर से फर्जी पैकेट भेजने अपने खातों समझौता करने की कोशिश कर रहा, या अपने डेटा ले, या बस आम तौर पर एक मशीन पर ले. बफर अतिप्रवाह, के रूप में नाम का मतलब पता चलता है नहीं एक पूर्णांक, लेकिन एक बफर बह निकला. और एक बफर सिर्फ एक अच्छा तरीका है कहने का यह स्मृति का एक गुच्छा है. और वास्तव में, मैं एक स्ट्रिंग बुलाया बजाय एस के बफर, पहले. यह एक बफर है क्योंकि अगर, यूट्यूब अर्थ में जैसे, या आप एक वीडियो देख रहे हैं किसी भी समय, आप शब्द बफरिंग देखा हो सकता है, डॉट, डॉट डॉट. यह अविश्वसनीय रूप से परेशान है. और ये सिर्फ मतलब अपने वीडियो प्लेयर है कि बहुत से डाउनलोड करने के लिए कोशिश कर रहा है बाइट्स की बाइट्स की, बहुत सारे इंटरनेट से एक वीडियो से. लेकिन यह धीमी है, तो यह कोशिश कर रहा है उनमें से एक गुच्छा डाउनलोड करने के लिए इतना है कि एक बफर, एक कंटेनर को भरने के लिए आपको लगता है कि यह तो कर सकते हैं पर्याप्त बाइट्स है , आप वीडियो दिखाने लगातार रोक के बिना. लेकिन यह आप कर सकते हैं, पता चला है यह बड़ा करने के लिए एक बफर है. लेकिन में इतना डेटा रखने की कोशिश यह, और बहुत बुरी बातें हो सकता है. उदाहरण के लिए तो, चलो हम देखते हैं एक उदाहरण के इस अंतिम चिढ़ाने. यह एक कार्यक्रम है कि, पहली नज़र में, सुपर उपयोगी कुछ भी नहीं है. यह एक मुख्य समारोह मिल गया है कि च, कि समारोह कहता है. और उस समारोह, एफ, यहाँ है, एक चार सरणी, आकार 12 के, सी कहा जाता है. और फिर यह इस का उपयोग कर रहा है नई समारोह strncpy बुलाया. यह इस सरल के साथ, पता चला है कि कोड की सरल रेखा, बस दो लाइनों, हम, मेरे पूरे कार्यक्रम बनाया है और इसलिए, अपने पूरे कंप्यूटर, और मेरा उपयोगकर्ता खाता, और मेरे हार्ड किसी को भी संभावित कमजोर ड्राइव कौन जानता है और चलाने के लिए काफी अच्छा है एक खास कमांड लाइन के साथ इस कार्यक्रम तर्क. दूसरे शब्दों में, अगर यह बुरा लड़का टाइप करके argvargv [1] के अंदर डालता है कुंजीपटल एक बहुत विशेष रूप से तैयार की जाती है पर स्ट्रिंग, नहीं एबीसी, 123, लेकिन अनिवार्य रूप से, निष्पादन योग्य का प्रतिनिधित्व करते हैं कि द्विआधारी चिह्न कोड, वह या वह लिखा था कि एक कार्यक्रम, जो इस साधारण प्रोग्राम के साथ कार्यक्रमों के हजारों के प्रतिनिधि कि, हिम्मत, वैसे ही कमजोर कर रहे हैं वह या वह अंततः सभी को नष्ट कर सकते हैं मेरे हार्ड ड्राइव पर फाइल, एक मिल वह या वह कर सकते हैं कि इतना शीघ्र निमिष अपने दम पर आदेश टाइप करें, खुद के लिए सभी फाइलों को ईमेल करें. मैं क्या कर सकता है कि कुछ भी है, वह या वह इस कोड के साथ कर सकते हैं. हम अभी तक इस का समाधान नहीं होगा. और वास्तव में, यह जा रहा है एक छोटी सी तस्वीर शामिल इस तरह, हम जल्द ही आता हूँ जो सभी को बेहतर समझने के लिए. लेकिन आज के लिए, पर अंत एक से थोड़ा अधिक उम्मीद है, क्या है समझा जा xkcd मजाक, हम अगली बार फिर से शुरू तक. ठीक है. बुधवार को मिलते हैं. [संगीत खेल] अध्यक्ष: और अब, गहरी Daven Farnham द्वारा विचार,. स्मृति का एक ढेर में कूद की तरह है एक रविवार की दोपहर को स्वर्ण पत्तियों. हवा बह रही, पोट अपने ओह hair--, मैं दिन when-- याद आती है [हंसी]