[MUSIC پخش] DAVID J. مالان: خوب. این CS50 است. و این آغاز هفته 5 است. و به عنوان شما ممکن است متوجه شده، برخی از مواد گرفتن کمی بیشتر پیچیده، متراکم تر کم است. و این بسیار آسان است، به خصوص اگر شما در این عادت برای برخی از زمان بوده است، به تلاش به خط ناخوانا پایین ترین هر چیزی که ما انجام می دهیم، می گویید در کلاس. اما متوجه، که شاید رویکرد آموزشی ایده آل به یادگیری این نوع از مواد، و مطالب دیگر. بنابراین، ما به خوشحال اعلام خود Gheng که CS50 است گونگ را آغاز کرده است برای آماده سازی مجموعه ای استاندارد از یادداشت ها برای این دوره، به امید این است که، یک، این نه تنها به عنوان یک خدمت مرجع و منبع برای بررسی مواد و رفتن از طریق ماده ای که ممکن است شما فرار اولین بار در اطراف، اما همچنین به طوری که سر خود را می تواند بیشتر تا از پایین، زمانی که آن را می آید زمان به سخنرانی، به طوری که شما ممکن است درگیر تر ملاحظه، به عنوان مخالف برهم است. با که گفت، چیزی است که شما را پیدا در وب سایت مدارک مانند این است. و توجه کنید، در سمت چپ بالا، وجود دارد نه تنها یک جدول از محتویات، بلکه کد هم که بلافاصله شما پرش به بخش مناسب در این ویدئو آنلاین. و چه چانگ اینجا انجام داده است است، در اصل، مستند آنچه در این اتفاق افتاده است سخنرانی خاص است. و بسیاری از سخنرانی ها می باشد در حال حاضر آنلاین در حال حاضر با این URL. و ما را به باقی مانده ادامه از کسانی که تا پایان این هفته، بنابراین کار را به استفاده از منابع که. پس بدون ado بیشتر، ما شروع به پوست کندن پشت لایه شده است که رشته برای برخی از زمان. و آنچه را که به ما می گویند یک رشته در واقع در هفته گذشته است؟ ستاره بنابراین کاراکتر. و ستاره کاراکتر، به خوبی، چه بود که واقعا چیست؟ خب، تمام این زمان، اگر ما ام شده است فراخوانی یک تابع، مانند getString، و نگهداری بازگشت به اصطلاح ارزش getString در variable-- آن را به نام نوع بازدید کنندگان string-- ما نوشتن شده است خط از کد وجود دارد که در بالا. و این تنها زمانی که من می بینم من دست خط اینجا بزرگ من متوجه چقدر بی رحم این است. با این حال، اجازه دهید فرض کنیم که، در سمت راست است، با این وجود، معقول تصویر چه شده است در جریان تمام این زمان با getString. getString، البته، می شود یک رشته است. اما آنچه که واقعا چیست؟ این بدان معنی است می شود یک تکه از حافظه از سیستم عامل با تماس با یک تابع، malloc به نام. اما بیشتر در مورد که بعدا. و سپس آن را پر که تکه از حافظه با حروف به کاربر تایپ در، به دنبال، البته، یک شخصیت تهی، یا بک اسلش صفر در پایان. در همین حال، در سمت چپ این داستان، در تمام این زمان، ما شده است اعلام یک متغیر، مانند است. و این متغیر آنچه در حال حاضر است شروع خواهد شد خواستار یک اشاره گر. این یک جعبه که در داخل آن نمی ما را از رشته، Daven، فی نفسه، بلکه ما در این میدان قرار داده جعبه در سمت چپ که دقیقا چه چیزی؟ آره؟ رسید آدرس جایی که در حافظه قرار دارد. DAVID J. مالان: دقیقا. آدرس که در آن Daven در حافظه قرار دارد. و نه که در آن همه از Daven واقع شده است، در هر سه، اما به طور خاص آدرس از چه؟ آره؟ رسید حرف اول. DAVID J. مالان: اولین شخصیت در Daven، که، در این مورد، من پیشنهاد خودسرانه بود و غیر واقع بینانه 1، OX1، که فقط بدان معناست که تعداد هگزادسیمال، از مجموع 1 اما این احتمالا به تعداد بسیار بزرگتر که ما ممکن است در قرعه کشی با 0x نمایش به عنوان پیشوند، به نمایندگی از یک شخصیت هگزادسیمال. و از آنجایی که ما لازم نیست بدانید که بقیه شخصیت های Daven هستند، به دلیل آنچه طراحی ساده تصمیم گیری است که سال ها پیش ساخته شده بود؟ آره؟ رسید ممیز معکوس 0. DAVID J. مالان: بله، دقیقا. بک اسلش 0 شما اجازه می دهد تا، البته در زمان خطی، به گذشتن از رشته، راه رفتن از چپ به راست، با حلقه for، یا در حالی که حلقه، یا چیزی شبیه به آن، و تعیین، آه، اینجا در پایان این رشته خاص است. پس فقط با آدرس در آغاز یک رشته، ما می توانیم تمامیت دسترسی این، به خاطر این همه در حالی که، یک رشته است فقط یک ستاره کاراکتر. پس از آن قطعا خوب به ادامه با استفاده از کتابخانه CS50 و این انتزاع، پس به صحبت می کنند، اما ما شروع به دیدن دقیقا آنچه در جریان بوده است در زیر این زمان تمام. بنابراین شما ممکن است این مثال یاد می آورند، بیش از حد، از زمان گذشته، مقایسه 0، که در واقع مقایسه نیست. اما ما شروع به حل این. اما شاید به عنوان یادآوری، ممکن است کسی علاقه من در یک فیل صورتی امروز، همچنین توسط چانگ ساخته شده؟ چگونه در مورد شما در مقابل؟ [نامفهوم]. بیا تا. و در عین حال، عنوان شما می آیند تا، اجازه دهید در نظر برای فقط یک لحظه چه این کد در واقع انجام شد. این اعلام دو متغیر تا بالا، و تی، و خواستار getString. این یک برنامه بسیار کاربر پسند نیست، به دلیل آن را به شما نمیگوید که چه کاری انجام دهید. اما اجازه دهید فقط فرض کنیم ما تمرکز بر بخش آبدار. و پس از آن کار می کنیم، اگر بازدید کنندگان برابر برابر تی، باید تابع () printf می گویند، شما هم همین را تایپ. سلام. نام شما چیست؟ JANELLE: Janelle. DAVID J. مالان: Janelle، ملاقات با شما خوشبختم. بنابراین چالش خود را در دست این فیل است به اولین ما رسم تصویری از آنچه است در این دو برای اولین بار نشان داده خطوط. بنابراین s و t ممکن است چگونه بر روی صفحه نمایش نشان داده شده؟ و شما فقط می توانید آن را در قرعه کشی با انگشت خود را بر روی این صفحه نمایش بزرگ. پس دو نیمه به وجود از هر طرف که معادله است. پس در سمت چپ وجود دارد، و پس از آن getString در سمت راست. و پس از آن تی وجود دارد در سمت چپ، و پس از آن getString در سمت راست. پس چگونه ممکن است که ما شروع رسم یک تصویر است که نشان دهنده چه خبر است در اینجا در حافظه، به شما می گویند؟ و اجازه دهید به شما اجازه توضیح آنچه شما انجام که شما بروید. JANELLE: OK. خب، اول، این امر می تواند درخواست شما برای دریافت رشته ورودی. و این امر می store-- آه، ببخشید. DAVID J. مالان: OK. خوب. و این است که به نام چه؟ اوه، OK. رفتن نگه دارید. من نمی خواستم وقفه. JANELLE: متاسفم. بنابراین آن را ورودی آن را به آدرس of-- مطمئن نیست. من دقیقا نمی تواند به یاد داشته باشید تعداد، اما من اعتقاد دارم که آن را با 0 شروع شد. DAVID J. مالان: این همه حق است، چون من به شماره ساخته شده، بنابراین هیچ جواب درست وجود دارد. JANELLE: شروع با 0 کمان. DAVID J. مالان: OK، بنابراین عنصر 0. مطمئنا. JANELLE: و پس از آن اگر بود مانند فقط یک دو letter-- DAVID J. مالان: OK، به شما. JANELLE: بنابراین عنصر 0، و پس از آن عنصر 1 یا 2 عنصر. DAVID J. مالان: و که بخشی از تصویر شما در حال حاضر رسم؟ دعوت به getString؟ یا اعلام آخرین ارسال ها JANELLE: در این بیانیه به از بازدید کنندگان، به اعتقاد من. آه، getString، به دلیل آن را به هر [وارد کردهاید؟ منطقه است. ؟] DAVID J. مالان: خوب. دقیقا. حتی اگر این به طور موثر یک آرایه، فراخوان می گرداند، هنگامی که ما به عقب بر گردیم یک رشته، ما می توانیم صفحه اول به آن رشته با استفاده از 01 و 2. مشخصات فنی، این احتمالا ارائه شده توسط آدرس های فردی، اما این خوب است. بنابراین فرض، اگر من فقط می تواند سریع به جلو به جایی که ما به سمت چپ خاموش زمان گذشته، اگر یکی از رشته گرم ب ه بود، بک اسلش 0، در نتیجه به نمایندگی گیب است ورودی، چگونه ممکن است ما را نمایندگی ها در حال حاضر؟ اگر این حافظه که است توسط getString بازگشت؟ JANELLE: آیا آن را ارائه شده توسط یک قوس؟ DAVID J. مالان: توسط یک قوس؟ خب، نه. اجازه دهید فقط می گویند، pictorially، اجازه دهید من فقط به جلو و پیشنهاد می کنند که، اگر این است، این مقدار بازگشتی getString است. و شما این را به عنوان 0، 1، 2، رسم کرده ایم که کاملا معقول است، زیرا ما می توانید صفحه را به رشته، به عنوان مثل. اما فقط باید سازگار با زمان آخرین، اجازه دهید من به جلو و خودسرانه پیشنهاد می کنند که این آدرس 1 است، این آدرس 2 است، این آدرس 3، و غیره است. و به این ترتیب، فقط به فوق العاده روشن، چه خبر است به در به عنوان یک نتیجه از که اولین خط از کد، به شما می گویند؟ JANELLE: آدرس 1؟ DAVID J. مالان: دقیقا. بنابراین 0x1 آدرس. و در عین حال، اجازه دهید من به جلو و تکراری بسیاری از آنچه شما انجام داده ام و اضافه کردن تن خود من در اینجا. اگر من به نوع در گیب دوباره، بار دوم، زمانی که با getString درخواست، که در آن، البته، گیب برای رفتن؟ خوب، presumably-- JANELLE: مانند در اینجا؟ DAVID J. مالان: آره. JANELLE: یا آن را نیز در جعبه های مشابه؟ DAVID J. مالان: اجازه بدهید من پیشنهاد، آره، دقیقا، بنابراین در این جعبه های اضافی. اما چه چیزی اصلی است که، حتی هر چند که من کشیده ام این بسیار نزدیک together-- 0x1، این است 0x2-- در واقع، این در حال حاضر ممکن است آدرس 0x10، به عنوان مثال، و 0x11، 0x12 و، و غیره. و به این ترتیب، اگر علت این باشد، چه خبر است برای پایان دادن به در اینجا در تی؟ JANELLE: 0x10؟ DAVID J. مالان: دقیقا. بنابراین 0x10. و به این ترتیب در حال حاضر، سوال نهایی است. شما، تا حد زیادی، به حال به کار سخت ترین برای یک فیل تا کنون. در حال حاضر، اگر من را بالا بکشد کد دوباره، زمانی که من، در خط سه، اگر بازدید کنندگان برابر برابر تی، چیزی که من در واقع هستم مقایسه که ما در اینجا کشیده ام؟ JANELLE: دو آدرس؟ DAVID J. مالان: دقیقا. پس من ادعا است ها برابر به T؟ به عبارت دیگر، برابر با 1 به 10 برابر است؟ و البته، پاسخ واضح در حال حاضر، هیچ. و به این ترتیب این برنامه در نهایت رفتن به چاپ چه چیزی، چه می گفتی؟ JANELLE: آیا آن را، شما هم همین را تایپ؟ DAVID J. مالان: بنابراین اگر بازدید کنندگان 1 است و t 10 است؟ JANELLE: شما چیزهای مختلف تایپ. DAVID J. مالان: دقیقا. شما چیزهای مختلف تایپ. خوب. بنابراین دور از تشویق، اگر ما می تواند، در اینجا. [تشویق حضار] این دردناک بود. من می دانم. سادگی انجام می شود. بنابراین در حال حاضر بیایید ببینید که اگر ما می توانیم کسی را دست انداختن از هم جدا چه ثابت بود. و البته، هنگامی که ما ثابت this-- که من در حال حاضر شما در green-- نشان ما یک زن و شوهر از پیشرفت در اینجا. اول، فقط به عنوان یک سلامت عقل بررسی کنید، من برای اولین بار چک اگر بازدید کنندگان برابر با صفر و t برابر است با صفر. و فقط روشن، زمانی که ممکن است و یا تی تهی در کد مثل این؟ هنگامی که ممکن است و یا تی تهی باشد. آره؟ رسید [نامفهوم]. DAVID J. مالان: دقیقا. اگر رشته است که کاربر تایپ در راه است بیش از حد طولانی به جا در حافظه، و یا برخی از مورد گوشه های عجیب و غریب مانند آن، getString، به عنوان خواهیم دید، به معنای واقعی کلمه امروز، در اسناد و مدارک آن، می گوید null به عنوان باز خواهد گشت ارزش نگهبان ویژه، یا فقط نوعی از نماد های خاص این بدان معناست که چیزی را اشتباه رفت. بنابراین ما می خواهیم برای بررسی که، به دلیل آن معلوم است که تهی ارزش بسیار خطرناک است. اغلب، اگر شما سعی می کنید برای انجام کاری با تهی که شامل function-- انتقال آن به عنوان ورودی، برای instance-- که تابع ممکن است بسیار سقوط خواهد کرد و همراه با آن، خراب کردن تمام برنامه های خود را. بنابراین این خط سوم در حال حاضر فقط عقل است چک، چک کردن خطا، اگر شما خواهد شد. این عادت خوب در حال حاضر برای ما به هر زمان ما سعی کنید به استفاده از ارزش که می تواند به طور بالقوه، تهی باشد. در حال حاضر، در خط چهارم در اینجا، "اگر strcmp (S، T)،" خوب، چه چیزی است که با اشاره به؟ خب، ما گفت: این بسیار موجز بود نام تابع برای مقایسه رشته است. و هدف خود را در زندگی است که به مقایسه اولین بحث خود را در برابر آن دوم، اما از نظر آدرس خود را، که ما ناخواسته بود لحظه ای پیش با کد قرمز، اما نه به مقایسه این دو رشته ها در مثل انسان بصری راه با مقایسه این، در برابر این، در برابر این، در برابر این، و پس از آن متوقف کردن اگر و وقتی که یکی از و یا هر دو از انگشتان من بازدید یک بک اسلش 0. strcmp سال پیش کسی اجرا برای پیاده سازی برای ما عملکرد که ما امیدوار بودیم که ما را بدست تنها با مقایسه دو مقدار ساده است. حالا رک و پوست کنده، من نگه نقاشی تمام این شماره های مختلف. اما واقعیت این است، من بوده ام ساخت این تا کل زمان. بگذارید من فقط به جلو و با شتاب نوشتن این از به یک نقطه که در پایان از روز و حرکت رو به جلو، ما واقعا نمی خواهیم درباره مراقبت چه چیزهایی در واقع آدرس در حافظه است. من می خواهم به رسم این انواع اعداد بسیار دیگر، من دور فقط یک چکیده این هستم کمی دوستانه تر فقط با فلش. به عبارت دیگر، اگر یک اشاره گر است، خوب، اجازه دهید فقط آن قرعه کشی، به معنای واقعی کلمه، به عنوان یک اشاره گر، فلش اشاره از خود به چیز دیگری، و نگران نباشید خیلی خیلی بیشتر در مورد minutia از این آدرس که، دوباره، من ساخته شده تا به هر حال. اما ما به این آدرس مراجعه کنید، گاهی اوقات، هنگامی که اشکال زدایی کد. در حال حاضر در عین حال، این برنامه در اینجا رفع، البته، این مشکل با مقایسه این دو رشته. اما ما به مشکل دیگری زد. این بود از کپی برنامه زمان آخرین، به موجب آن، من در تلاش بود تا سرمایه گذاری فقط اولین کاراکتر در یک رشته است. اما آنچه علامت بود ما آخرین زمانی که دیدم یک کاربر تایپ در یک ارزش، مانند گیب در کوچک، برای بازدید کنندگان، پس از آن ما را به بازدید کنندگان تی اختصاص داده، همانطور که در خط سوم وجود دارد، و پس از آن من به سعی سرمایه گذاری تی براکت 0؟ اثر چه بود تغییر تی براکت 0 که اینجا هستید؟ رسید این تغییر است. DAVID J. مالان: آره، من تغییر، و همچنین. از آنجا که واقعا چه خبر است؟ خوب، اجازه دهید را ببینید اگر من می توانم پاک تا این تصویر، به شرح زیر است. اگر باشد، دوباره، کلمه گرم، الف، ب، ه، بک اسلش، 0 و بازدید کنندگان ما طراحی به عنوان یک جعبه ادامه در اینجا، اما آدرس نه بیشتر. بیایید متوقف ساخت تا چیز. اجازه دهید فقط در قرعه کشی یک عکس برای ساده سازی جهان است. وقتی که من تی تی با رشته اعلام، که تکه از حافظه ایجاد می کند. میدان اتفاق می افتد به 32 بیت در بسیاری از رایانه است. در واقع، اگر شما تا کنون از شنیده کامپیوتر داشتن یک معماری 32 بیتی، واقعا علاقه داشتن به صحبت می کنند، که فقط به معنی استفاده از آدرس های 32 بیتی. و به عنوان یک فنی به کنار، اگر شما تا کنون فکر کرده اید چرا کامپیوتر های قدیمی تر، اگر شما در واقع سعی کردم به سوپ آنها را با مقدار زیادی از RAM، تنها می تواند حداکثر دارای از چهار گیگابایت RAM، خوب است که به این دلیل، به معنای واقعی کلمه، کامپیوتر قدیمی خود می تواند تنها تعداد عنوان بالا به عنوان 4 میلیارد، 4 میلیارد بایت، چرا که آن را با استفاده از 32 بیتی تعداد آدرس. اما در هر صورت، در این به عنوان مثال، داستان بسیار ساده تر. T فقط اشاره گر دیگری است، یا واقعا یک ستاره کاراکتر، نام رشته. و چگونه می توانم من می خواهم برای به روز رسانی این تصویر در حال حاضر با آن خط دوم کد، پس از نقطه، نقطه، نقطه؟ وقتی که من انجام رشته تی برابر با نقطه و ویرگول ها، چگونه این تصویر را تغییر دهید؟ آره؟ رسید [نامفهوم]. DAVID J. مالان: آره. دقیقا. من فقط از قرار دادن فلش جعبه: t به همان آدرس، حرف اول همان در به. یا از لحاظ فنی، در صورتی که این پسر هنوز در 0x1 بود، آن را به عنوان هر چند من تا به حال 0x1 0x1 در اینجا و اینجا. اما باز هم، که مراقبت در مورد آدرس؟ این فقط ایده که در حال حاضر مهم است. بنابراین این چیزی است که در اینجا اتفاق می افتد. پس البته، اگر شما تی براکت 0 است که نماد آرایه، از course-- و رک و پوست کنده، آن را به نظر می رسد مثل یک آرایه وجود دارد در اینجا، اما در حال حاضر این چیزی که عجیب و غریب وجود دارد. می دانیم که زبان برنامه نویسی، C، شما ارائه می دهد این ویژگی، به موجب آن، حتی اگر t است اشاره گر، یا یک اشاره گر است، شما هنوز هم می تواند که آشنا استفاده کنید، براکت راحت نماد برای رفتن به عنصر اول، یا عنصر دوم، و یا هر عنصر که اشاره گر اشاره به دلیل، احتمالا، آن است، که در این مورد، اشاره در برخی از آرایه. پس چگونه ما این مسئله را حل؟ صادقانه بگویم، این است که در آن آن را کردم کمی در نگاه اول خسته کننده باشد. اما در اینجا یک نسخه جدید و بهبود یافته است. بنابراین برای اولین بار، من گرفتن خلاص شدن از شر از کتابخانه CS50، فقط به افشای که این در واقع یک ستاره کاراکتر، فقط مترادف. و t نیز یک ستاره کاراکتر. اما آنچه در جریان است در سمت راست آن خط که در آن t تخصیص داده شده است ارزش؟ malloc چیست؟ چه آن را strlen؟ sizeof (کاراکتر) چیست؟ چرا هک می کند این خط نگاه خیلی پیچیده است؟ آن چه در سطح بالا انجام می دهند؟ آن چه در تی ذخیره؟ آره؟ رسید آن اختصاص مقدار مشخصی از فضای حافظه است. این برای ذخیره، من حدس می زنم، نامه [نامفهوم]. DAVID J. مالان: کامل. کامل. این تخصیص خاص مقدار از فضای حافظه برای ذخیره، احتمالا، نامه های آینده است. و به طور خاص، malloc بنابراین بازگشت چه؟ رسید برگشت [نامفهوم]؟ DAVID J. مالان: دقیقا. برگشت آدرس آن حافظه، که راه فانتزی گفتن است، آدرس گرداند اولین بایت از حافظه که. این مسئولیت بر دوش من به یاد داشته باشید چه مقدار حافظه من در واقع اختصاص داده و یا malloc خواست برای. در حال حاضر چه مقدار است؟ خب، حتی اگر وجود دارد بسیاری از پرانتز در اینجا، malloc فقط یک آرگومان می گیرد. و من مشخص strlen از بازدید کنندگان، به من بدهید من به عنوان بسیاری از بایت به عنوان در ها وجود دارد، اما یکی اضافه کنید. چرا؟ آره؟ رسید بک اسلش 0. DAVID J. مالان: دقیقا. ما باید به انجام خانه داری کم است. بنابراین چون یک بک اسلش وجود دارد 0، ما بهتر است به یاد داشته باشید که. در غیر این صورت، ما در حال رفتن برای ایجاد یک رشته است که کند که نابودگر خاص ندارد. در همین حال، فقط به فوق العاده مقعد، I sizeof (کاراکتر) داشته باشد، فقط در مورد کسی که اجرا می شود من کد نه در دستگاه CS50، اما شاید یک کامپیوتر مختلف روی هم رفته که در آن کاراکتر یکی بایت، قرارداد، اما دو بایت، و یا چیزی بزرگتر از آن است. این فقط به فوق العاده، فوق العاده مخالف به خطا. اگر چه، در واقع، آن را به احتمال زیاد برای رفتن به یک 1. در حال حاضر، در عین حال، من پیش بروید و کپی رشته، تی براکت من برابر با تی براکت است. و من به آخرین هفته تسلیم خواهد کد منبع برای دیدن آنچه که اتفاق افتاده است. اما غذای آماده کلیدی، و دلیل من در حال حاضر در سبز قرار دادن کد، است چرا که خط آخر، تی براکت 0 برابر toupper، اثر از سرمایه گذاری که رشته؟ تی و / یا جدید؟ این خط آخر کد. فقط تی، به دلیل آنچه که اتفاق افتاد این بار، اگر من کمی که آخرین مرحله خنثیسازی، آنچه که اتفاق افتاده است، زمانی که من malloc تماس بگیرید، من در اصل یک تکه از حافظه که به همان اندازه به عنوان اصلی است، چرا که این حساب را من انجام داد. من ذخیره سازی در تی آدرس آن تکه از حافظه است. حتی اگر این به نظر می رسد خوب است و زیبا، خوب و خالی، واقعیت این است که وجود دارد، آنچه که ما از شما نگه داشتن تماس، ارزش زباله در اینجا. این تکه از حافظه ممکن است بسیار همچنین قبل از استفاده شده است، چند ثانیه، چند دقیقه پیش. پس کاملا می تواند اعداد است یا نامه وجود دارد، فقط به طور تصادفی. اما آنها معتبر نیست، تا زمانی که من خودم جمعیت این تکه از حافظه با کاراکتر واقعی، به عنوان I در آن کار را برای حلقه وجود دارد. اکنون درست است؟ بنابراین در حال حاضر، نقطه اوج این سه مثال که به ظاهر شکسته شد زمان گذشته، این مبادله به عنوان مثال، این تابع به این معنا کار کرده است که آن را تعویض a و b. اما این کار را به چه معنا دیگر کار نمی کند؟ آره؟ رسید [نامفهوم]. DAVID J. مالان: دقیقا. اگر من به تماس این تابع از another-- به عنوان مثال، از یک تابع مانند اصلی، که در آن من یک متغیر، x و y، به عنوان I در هفته گذشته انجام داد، همان کد، و من در x و y عبور به تعویض، و پس از آن Swap-- این تماس، البته، نسخه صحیح است چیزی است که ما در مورد به هستی see-- آن کار نمی کند. پس چه ثابت است؟ خوب، بنابراین فقط به روشن، اجازه دهید من به جلو and-- من یکی را دوم در اینجا، و ببینید اگر من می تواند به شما یکی از آخرین، نشان می دهد که خواهد بود in-- بیایید ببینید اگر من می توانم پیدا کردن این OK fast-- واقعی، [نامفهوم]. OK، وجود دارد آن است. بنابراین دستورات من فقط تایپ را نادیده گرفت. من می خواهم آن را به بازیابی در آخرین لحظه یک مثال از زمان گذشته، که در حال حاضر هیچ بهره شبانه گفته می شود. بنابراین هیچ مبادله است که در آن ما را ترک کردن زمان گذشته، به موجب آن، من مقدار دهی اولیه x به 1 و y به 2. من پس از آن تعویض تماس بگیرید، عبور در 1 و 2. و سپس این تابع از آن کار می کرد، اما تا به حال هیچ دائمی اثر بر x و y. بنابراین سوال در دست است، چه در حال حاضر ما در واقع این مشکل را حل کنم؟ راه حل چیست که در دست؟ خوب، در swap.c، جدید است که امروز، متوجه زن و شوهر از تفاوت. x و y با هم برابر است. اما آنچه به وضوح در مورد خط 25 متفاوت است؟ چه جدید وجود دارد، اگر شما به یاد داشته باشید آنچه در آن مانند یک ثانیه پیش نگاه کرد؟ رسید [نامفهوم]. DAVID J. مالان: آره. بنابراین آمپرسندهای کاربردی یک قطعه جدید نحو نه تنها در این برنامه، بلکه به طور کلی در CS50. تا به امروز، من فکر نمی کنم ما هر نمونه دیده ام و یا واقعا در مورد آنها را در هر صحبت جزئیات، به غیر از، شاید، پیشگیرانه در بخش، یک علامت شبیه به این. خوب، آن را تبدیل به یک علامت است از آخرین قطعه از نحو جدید ما قصد داریم به یاد بگیرند. بلکه به معنای آن است که آدرس برخی از متغیر. در چه آدرس x را زندگی می کنند؟ اما چه آدرس سالانه زندگی می کنند؟ از آنجا که اگر مشکل اساسی قبل از شد که x و y در حال تصویب شد به عنوان نسخه، چیزی است که ما واقعا می خواهید به انجام است ارائه مبادله مانند یک گنج نقشه که منجر به که در آن x و y در واقع در RAM می باشد، به طوری که مبادله می تواند که نقشه را دنبال و به هر کجا که x یا y را نشانه نقطه و تغییر مقادیر واقعی 1 و 2 وجود دارد. بنابراین تعویض نیاز به تغییر کمی بیش از حد. و در نگاه اول، این ممکن است به نظر می رسد کمی شبیه به ستاره کاراکتر. و در واقع آن است. بنابراین یک اشاره گر به نوع داده ای است، بر اساس این بخش را برجسته؟ پس از آن اعضای هیات است. بنابراین دیگر اعضای هیات، آن آدرس یک int است. و به طور مشابه، ب در حال حاضر رفتن به آدرس یک int. بنابراین، هنگامی که من در حال حاضر تماس مبادله از بخش اصلی، من قصد ندارم که به مبادله 1 و 2. من قصد دارم به آن را مانند را گاو نر، گاو نر و چیزی چیزی، دو آدرس که منجر خواهد شد تعویض به مکان واقعی خود را در حافظه کامپیوتر من است. بنابراین در حال حاضر، اجرای باقی مانده من نیاز به تغییر یک بچه کوچک. چه به وضوح های مختلف در حال حاضر در این سه خط کد؟ است این ستاره لعنتی همه وجود دارد جا، همه حق است؟ پس چه خبر است اینجا؟ آره؟ رسید آن است بدیهی است [نامفهوم]. DAVID J. مالان: دقیقا. بنابراین در این context-- و این بود بهترین تصمیم، طراحی، مسلما، سال پیش. در این زمینه، که در آن شما فقط باید یک ستاره، و شما یک نوع داده را نداشته باشند، برای مثال، int، بلافاصله به سمت چپ، به جای شما یک علامت مساوی، به وضوح، در این زمینه، زمانی که به شما می گویند ستاره، این بدان معناست که به آدرس که در یک. دنبال نقشه گنج، پس به صحبت می کنند. و در عین حال، در خط 37، به این معنی همان چیزی که. برو به آدرس، و آنچه وجود دارد؟ هر چه باشد در مکانی که ب مشخص می کند. به عبارت دیگر، به ب. دریافت که ارزش. برو به و، در برابر ثبت نام، عملگر انتساب، قرار داده است که ارزش وجود دارد. به طور مشابه، دمای هوشمند فقط برای اعضای هیات است. هیچ چیز در مورد نیاز به درجه حرارت تغییر می کند. این فقط یک شیشه یدکی از آننبرگ است برای برخی از شیر یا آب پرتقال. اما من نیازی به گفتن نیست، به ب. برو به مقصد و قرار دادن مقدار در دمای وجود دارد. پس چه اتفاقی می افتد و سپس؟ هنگامی که من در واقع تماس بگیرید تعویض این زمان، اگر این سینی اولین بار در اینجا نشان دهنده اصلی، این سینی دوم نشان دهنده مبادله، هنگامی که I عبور علامت x و y را علامت از بخش اصلی به تعویض، فقط به روشن، چه این پشته قاب دریافت است؟ آره؟ رسید [نامفهوم]. DAVID J. مالان: دقیقا. آدرس x و آدرس y است. و شما می توانید از این فکر می کنم مانند آدرس پستی. 33 خیابان آکسفورد و 35 خیابان آکسفورد، و شما می خواهم به حرکت دو ساختمان که در آن محل می باشد. این نوع از ایده مضحک است. اما همه ما با آدرس معنا است. از کجا در جهان می تواند شما این دو نوع داده int پیدا کردن؟ از کجا در جهان می تواند به شما پیدا کردن این دو ساختمان؟ بنابراین اگر در نهایت، بعد از همه ی این مدت من رفتن به کد منبع و کامپایل امروز تعویض و اجرا ./swap، در نهایت، برای اولین بار ما در واقع می بینیم که ارزش من در واقع با موفقیت جابجا شده است. و در حال حاضر، ما حتی می تواند توجه داشته باشید از این در، می گویند، از gdb. بنابراین، اجازه دهید به همان فایل را به. اجازه بدهید من به جلو و اجرا از gdb از ./swap. و در حال حاضر، در مبادله، من قصد دارم به جلو و نقطه شکست در بخش اصلی تنظیم شده است. و در حال حاضر من قصد دارم به پیش رو و برنامه را اجرا کنید. و در حال حاضر ما کد من را ببینید که در آن خط متوقف شد. اگر من به جلو و چاپ x و آنچه که باید در اینجا ببینید I؟ این یک سوال است. بگو دوباره؟ رسید [نامفهوم]. DAVID J. مالان: پس اعداد تصادفی، شاید. شاید من خوش شانس، و آن را زیبا و ساده، مثل 0. اما شاید برخی از آن عدد تصادفی است. در این مورد، من خوش شانس. این فقط اتفاق می افتد به 0. اما در واقع شانس، چون تا زمانی که من نوع بعدی و سپس چاپ ایکس است که خط از کد، خط 19، اعدام شده اند. در همین حال، اگر نوع I بعد دوباره، و در حال حاضر چاپ از سال، من قصد دارم برای دیدن 2. حال اگر نوع I بعد، آن را به یک کمی گیج کننده است، چرا که در حال حاضر، تابع () printf است که به نظر می رسد در صفحه نمایش، به عنوان آن را انجام داد. * 1 است. اجازه دهید این را دوباره انجام دهید. و در حال حاضر، در اینجا است که همه چیز جالب است. قبل از اینکه من تعویض و یا حتی مرحله تماس بگیرید به آن، اجازه دهید زیرچشمی نگاه کردن کم است. x باشد، دوباره، 1. Y است، البته، سلامت عقل سریع چک، 2، خیلی سخت نیست. اما آنچه علامت x است؟ جواب، آن را به نوع بد بو به دنبال. اما ستاره int در پرانتز فقط راه تولید ناخالص داخلی از گفتن این آدرس است. این نه یک int، آن را به یک اشاره گر به یک است اعضای هیات، و یا در غیر این صورت به عنوان یک آدرس شناخته شده است. این چیزی که دیوانه چیست؟ ما چیزی ندیده ام کاملا مانند که قبل از. پس این آدرس را در کامپیوتر من است حافظه که x اتفاق می افتد به زندگی می کنند. این گاو نر چیزی است. و این است، رک و پوست کنده، چرا من آغاز شده ام طراحی فلش، به جای اعداد، چون که واقعا اهمیت بده که اعضای هیات خود را در یک خاص آدرس این است که بزرگ است. اما bffff0c4، این ها همه در واقع اعداد هگزادسیمال، که از طریق اف می باشد 0. بنابراین ما نمی پردازد بیش از حد طولانی درباره این چیزها می شود. اما اگر من نسخه قابل چاپ کردن سال، البته، من 2. اما بصورت سالانه، من این آدرس مراجعه کنید. و توجه کنید، برای کنجکاو، چگونه دور از هم x و y هستند؟ شما می توانید از آدرس را نادیده گرفت. چهار بایت. و این سازگار با ما پیش از آن ادعا می کنند که یک int چقدر بزرگ است؟ چهار بایت. پس آن را مانند پوشش همه چیز را تا به نظر می رسد سادگی، به عنوان شما ممکن است امیدوارم، در حافظه است. بنابراین در حال حاضر، اجازه دهید فقط سریع به جلو به پایان این داستان. اجازه دهید به پیش بروید و تایپ مرحله، به شیرجه رفتن به تابع تعویض. حالا متوجه، اگر من تایپ، آن را یکسان به آدرس x را. اگر من نوع ب، آن را یکسان به آدرس y است. پس چه باید اگر من I می گویند، به آدرس بروید؟ بنابراین چاپ ستاره. بنابراین ستاره به معنی رفتن وجود دارد، در این زمینه. علامت به معنی چیزی است که آدرس است. بنابراین ستاره به معنی 1. و ستاره چاپ ب من می دهد 2. و اجازه دهید فرض کنیم، برای لحظه ای، که حداقل کد که درآمد حاصل از اجرای هم اکنون می توانید از طریق در راه است که استدلال. اما ما این ایده را قبل از اینکه طولانی دوباره. بنابراین این نسخه از تعویض در حال حاضر صحیح و اجازه می دهد تا ما به مبادله این نوع داده خاص است. بنابراین هر گونه سوال پس از آن در تعویض؟ در ستاره؟ در آدرس؟ و شما می بینید، با مشکل تنظیم 4، نوع، اما مشکل مجموعه 5، قطعا، این که چگونه این چیزهای مفید می باشد و خیلی بیشتر راحت با آنها، به عنوان یک نتیجه. در همه هر چیزی؟ خوب. بنابراین malloc است، باز هم، این تابع که فقط اختصاص حافظه، حافظه تخصیص. و چرا این مفید است؟ خب، تمام این مدت، شما شده است با استفاده از malloc. اگر شما در نظر در حال حاضر چگونه getString آثار، احتمالا، آن را درخواست شده کسی که برای یک تکه از حافظه، در هر زمان که کاربر در انواع رشته در، چرا که ما قطعا نمی دانم، به عنوان کارکنان CS50، چگونه این رشته بزرگ است که انسان در حال رفتن به تایپ ممکن است. بنابراین اجازه دهید، برای اولین بار، شروع به پوست پشت چگونه کار کتابخانه CS50، از طریق چند مثال که به ما وجود دارد منجر شود. بنابراین اگر باز کنم تا gedit و باز کردن scanf 0، ما در حال رفتن برای دیدن کد زیر. Scanf 0، در دسترس در وب سایت برای امروز، است نسبتا چند خط کد در اینجا، 14 تا 20. و اجازه دهید ببینیم که چه چیزی آن را انجام می دهند. اعلام اعضای هیات، به نام ایکس. این گزارش می گوید چیزی شبیه به، تعداد، لطفا. و در حال حاضر آن را می گوید، scanf٪ من، و ایکس. پس یک دسته از مسائل جدید وجود دارد وجود دارد. اما scanf، شما نوع می تواند فکر می کنم به عنوان مخالف از تابع () printf. تابع () printf، البته، چاپ به روی صفحه نمایش. مرتب کردن بر اساس scanf اسکن از کاربر صفحه کلید چیزی که او تایپ کرده است. ٪ من درست مثل تابع () printf است. این به این معنی انتظار کاربر برای تایپ هوشمند. و در حال حاضر، چرا شما فکر می کنم من ممکن است عبور از scanf و ایکس؟ اگر هدف در زندگی از scanf است به چیزی از کاربر، چه معنی است انتقال آن، و x و در حال حاضر؟ آره؟ رسید [نامفهوم]. DAVID J. مالان: دقیقا. هر چه من، انسان، تایپ، ورودی من قرار است در آن مکان ذخیره شود. این کافی نیست، به یاد می آورند، به تنها عبور در x، چرا که ما قبلا دیده ام، هر زمان که شما فقط یک متغیر اولیه عبور می کند، مانند یک int، به برخی از عملکرد های دیگر، مطمئن شوید، آن را می توانید تغییر دهید که متغیر، اما نه به طور دائم. این می تواند یک اثر در بخش اصلی ندارد. این فقط می تواند کپی های محلی خود را تغییر دهید. اما اگر به جای آن شما باید انجام دهید من اعضای هیات واقعی را، اما شما به من جهت دادن به که اعضای هیات، من در حال حاضر، در حال scanf، مطمئنا، من به دنبال که آدرس قرار داده و تعداد وجود دارد بنابراین شما به آن دسترسی دارند. بنابراین، هنگامی که من این برنامه را اجرا کنید، اجازه دهید را ببینید. را scanf 0 نقطه اسلش، scanf 0. و اگر من در حال حاضر تعداد نوع مانند 50، با تشکر برای 50. اگر من در حال حاضر یک عدد مانند نوع منفی 1، برای منفی 1. من در حال حاضر تعداد نوع مانند 1.5، HM. چرا برنامه من به من چشم پوشی است؟ خوب، به دلیل سادگی، به من گفته آن را به انتظار یک int تنها. خوب. به طوری که یک نسخه از این است. اجازه دهید همه چیز را تا درجه یک و پیشنهاد می کنند که این خوب نیست. و در اینجا نهفته است یک مثال بسیار ساده چگونه ما می توانیم نوشتن کد شروع که افراد دیگر می توانند بهره برداری و یا سازش با انجام کارهای بد. بنابراین خط 16، به طوری مشابه در روح به قبل، اما من اعلام آن اعضای هیات این زمان. من اعلام آن ستاره کاراکتر، نام رشته. اما آنچه که واقعا چیست؟ بنابراین اگر من address-- مشخص نیست و من خواستار آن خودسرانه، بافر، اما من می توانم به آن ها، به simple-- و پس از آن من این کار را، به من توضیح دهد، اگر شما می توانید، بر اساس قبلی منطق، آنچه که scanf در خط 18 انجام می دهند، اگر پاس٪ و بافر، یک آدرس است که؟ scanf چیست، اگر شما درخواست همین منطق دقیق آن به عنوان نسخه 0، سعی به انجام این کار در اینجا، هنگامی که چیزی انواع کاربر در؟ آره؟ رسید [نامفهوم]. DAVID J. مالان: دقیقا. Scanf، با منطق پیش از آن، می گذرد را به رشته که تایپ انسان in-- آن در حال حاضر یک رشته، این تعداد نیست، احتمالا، اگر او cooperates-- و آن را به تلاش برای قرار دادن که رشته در حافظه در هر آدرس بافر مشخص می کند. و این فوق العاده است، چرا که بافر در واقع به معنای به یک آدرس. اما من ادعا می کنند این برنامه حشره دار در است راه بسیار جدی است، زیرا آنچه ارزش است بافر به طور پیش فرض؟ چه من را به مقداردهی اولیه؟ چه تکه از حافظه؟ من، درست است؟ بنابراین حتی اگر من اختصاص داده ام ستاره کاراکتر است که به نام دیگر است، آن را به جای نام، buffer-- تا اجازه دهید نام آن در آرگومان رسم در حال حاضر به عنوان buffer-- اگر من ندارد نام getString یا malloc در اینجا، که بدان معنی است که بافر فقط برخی از ارزش زباله است. در حال حاضر به چه معنا است؟ این بدان معنی است که من scanf گفته اند به انتظار یک رشته از کاربر. و شما می دانید چه؟ هر چه این چیز اشاره شده است to-- و من علامت سوال قرعه کشی، اما در واقعیت، آن را به چیزی شبیه به OX1، 2، 3، درست است؟ این برخی از ارزش های ساختگی است که فقط اتفاق می افتد وجود داشته باشد از قبل. پس راه دیگری قرار داده، آن را هر چند به عنوان بافر است فقط اشاره به چیزی در حافظه است. من هیچ ایده چه چیزی. بنابراین اگر در گیب نوع I در حال حاضر، آن را به منظور تلاش برای قرار دادن گرم ب ه / 0 وجود دارد. اما چه کسی می داند چه چیزی است؟ و در گذشته، هر زمان ما سعی در لمس حافظه که بدان تعلق ندارند به ما، چه اتفاقی افتاده است؟ یا تقریبا در هر زمان. گسل تقسیم بندی، درست است؟ این فلش، من هیچ نظری ندارم که در آن آن را اشاره. آن را فقط به برخی از ارزش های تصادفی. و البته، اگر شما تفسیر یک مقدار تصادفی به عنوان آدرس، شما در حال رفتن به رفتن به برخی از قسمت های تصادفی. بنابراین گیب ممکن است در واقع سقوط برنامه های من در این مورد اینجا. پس چه می توانیم بکنیم که تقریبا به عنوان بد؟ در نظر بگیرید این سوم و به عنوان مثال نهایی از scanf. این نسخه به چه معنا بهتر است؟ اگر شما احساس راحتی با می مشکل قبلی، این بهتر است. چرا؟ رسید [نامفهوم]. DAVID J. مالان: خوب. بنابراین این مورد از خط 16 بهتر است، به این معنا که ما به صراحت می تخصیص حافظه. ما با استفاده از نه malloc، ما با استفاده از هفته 2 رویکرد فقط اعلام یک آرایه. و ما قبل از آن یک رشته گفته ام فقط یک آرایه از کاراکتر ها است، پس این کاملا مشروع است. اما، البته، به عنوان شما توجه داشته باشید، اندازه ثابت، 16. پس این برنامه است کاملا بی خطر، اگر نوع I در رشته های یکی از شخصیت ها، دو شخصیت رشته ها، 15 رشته کاراکتر. اما به محض این که من شروع به تایپ 16، 17، 18، 1000 رشته کاراکتر، که در آن است که رشته رفتن برای پایان دادن به؟ آن را برای پایان دادن به تا حدی به اینجا. اما پس از آن که چه چیز دیگری می داند است فراتر از مرزهای از این آرایه خاصی را دارد؟ این را به عنوان اینکه من اعلام 16 جعبه اینجا. بنابراین به جای بیرون کشیدن از تمام 16، ما فقط وانمود که من کشیده ام 16. اما اگر من سپس سعی کنید به خواندن یک رشته که بسیار طولانی، مانند 50 حرف، من قصد دارم برای شروع قرار دادن الف، ب، ج، د، x و y و z. و این است که احتمالا برخی از بخش دیگری از حافظه که، دوباره، ممکن است باعث شود برنامه من به سقوط، چون من خواسته ام هر چیزی بیشتر از 16 بایت. پس چه کسی اهمیت میدهد؟ خوب، در اینجا کتابخانه CS50 است. و بیشتر از این است که فقط مانند دستورالعمل تا بالا. کتابخانه CS50، تمام این مدت، تا به این خط در خط 52 بود. ما typedef دیده می شود، و یا شما typedef را ببینید در pset 4، که فقط ایجاد یک مترادف به موجب آن ستاره کاراکتر می تواند بیشتر به سادگی به عنوان رشته شناخته می شود. پس این یکی از است چند چرخ آموزش ما مخفیانه در زیر هود استفاده می شود. در همین حال، در اینجا تابع است، getchar. در حال حاضر ظاهرا، به آن هیچ بدن وجود دارد. و در واقع، اگر من نگه دارید پیمایش، من در واقع نه هر گونه پیاده سازی را مشاهده کنید از این توابع. در بررسی سلامت عقل، به همین دلیل است که؟ رسید [نامفهوم]. DAVID J. مالان: آره. پس این فایل هدر است. و فایل های هدر شامل نمونه های اولیه، به علاوه برخی از چیزهای دیگر، به نظر می رسد، مانند typedefs. اما در CS50.c، که ما کرده ایم هرگز به شما داده آشکار، اما در دستگاه CS50 تمام شده است این زمان، درون پوشه آن، توجه کنید که یک کل وجود دارد دسته از توابع در اینجا. در واقع، اجازه دهید در پایین حرکت. اجازه دهید بسیاری از آنها را نادیده بگیرد، در حال حاضر. اما جواب را در getInt و ببینید که چگونه کار می کند getInt. بنابراین در اینجا getInt است. و اگر شما واقعا هرگز به مراقبت چگونه دریافت اعضای هیات کار می کند، در اینجا مستندات خود را است. و در میان همه چیز آن را می گوید آن را به شما می گوید چه محدوده از ارزش های آن را می توانید بازگشت. این اساسا منفی 2 میلیارد به مثبت 2 میلیارد، دادن یا گرفتن. و معلوم، این همه زمان، حتی اگر ما هیچ وقت بود که شما برای آن را بررسی کنید، اگر چیزی را اشتباه می رود، معلوم است که همه این زمان، getInt است شده است از بازگشت ویژه ثابت، نه تهی، بلکه int_max، که کنوانسیون فقط یک برنامه نویس است. این بدان معنی است اینجا یک مقدار خاص است. اطمینان حاصل کنید که برای این بررسی، فقط در مورد چیزی را اشتباه می رود. اما ما هرگز ناراحت کرده ام با که تا به امروز، دلیل دیگر، این به معنای ساده. اما چگونه getInt دریافت اجرا؟ خب، یک، آن را بدون آرگومان می گیرد. ما می دانیم که. این یک int برمی گرداند. ما می دانیم که. پس چگونه آن را در زیر هود کار می کند؟ پس ظاهرا بی نهایت وجود دارد حلقه، لااقل در ظاهر از یک. توجه کنید که ما با استفاده از getString. به طوری که جالب است. getInt فراخوانی تابع خود ما، getString. و در حال حاضر به همین دلیل ممکن است که این مورد باشد؟ چرا من دفاعی بودن در اینجا در خط 165؟ چه چیزی می تواند در خط اتفاق می افتد 164، فقط به روشن باشد؟ این پاسخ مانند قبل است. ممکن است فقط از حافظه باشد. چیزی را اشتباه می رود با getString، ما باید قادر به آن است. و دلیل من بر نمی گرداند تهی است که، از نظر فنی، پوچ یک اشاره گر است. getInt را به بازگشت یک int. بنابراین من خودسرانه تصمیم گرفت، در اصل، که 2 میلیارد، دادن یا گرفتن، در جریان است به یک ارزش ویژه ای است که من هرگز می تواند در واقع از کاربر دریافت کنید. این فقط یک مقدار من قصد دارم در به هدر برای نشان دادن یک کد خطا. بنابراین در حال حاضر، همه چیز یک فانتزی کم است. و آن را کاملا تابع یکسان نیست به عنوان قبل از، اما آن را بسیار مشابه است. بنابراین متوجه، من در اینجا اعلام، در خط 172، هر دو نفر اعضای هیات و کاراکتر ج. و پس از آن من استفاده از این خط بد بو، sscanf، که آن را تبدیل یک رشته از صفحه کلید اسکن نیست. این غرفه یک رشته موجود است که کاربر در حال حاضر در تایپ. بنابراین من در حال حاضر به نام getString، که یعنی من یک رشته در حافظه است. sscanf چیزی است که شما می خواهم یک تابع تجزیه تماس بگیرید. این در رشته من به نظر می رسد تایپ در، شخصیت های شخصیت، و چیزی مفید است. این رشته در خط ذخیره می شود. و من می دانم که تنها با رفتن تا از اینجا و گفت، آه، OK، من آن را نمی امتیازات این زمان، اما خط نامیده می شود. و در حال حاضر این است که کمی متفاوت است. اما این به معنای، به دلایل ما تا حدودی دست ما را موج در امروز، که ما در حال بررسی به ببینید در صورتی که کاربر تایپ در و اعضای هیات و شاید یکی دیگر از شخصیت. اگر کاربر تایپ در یک int، آن را رفتن به در n ذخیره می شود، چون من عبور از این توسط آدرس، ترفند جدید ما امروز دیده ام. اگر کاربر همچنین تایپ در مثل 123x، که x است که برای پایان دادن به نامه ای در شخصیت ج. حالا معلوم است که sscanf به من بگو، هوشمندانه، چگونه بسیاری از متغیرهای sscanf شد با موفقیت قادر به پر کردن. بنابراین با این منطق، اگر تابع من پیاده سازی شده است getInt، اما من دارم، به طور بالقوه، برای کاربر که در یک int تایپ به دنبال چیز دیگری، چه چیزی می خواهید sscanf من مقدار بازگشتی واقعا می شود؟ اگر هدف این است که برای به دست آوردن فقط یک int از کاربر؟ بنابراین اگر sscanf بازده 2، به چه معنا است؟ کاربر تایپ در چیزی شبیه به، به معنای واقعی کلمه، 123x، که این بی معنی است. این خطا است، و من می خواهم برای آن تیک بزنید. بنابراین اگر کاربر در انواع این در، های این منطق، چه sscanf بازگشت، به نظر شما؟ بنابراین آن را به بازگشت 2، به دلیل 123 در حال رفتن به رفتن در اینجا، و ایکس است که برای پایان دادن به در اینجا. اما من نمی خواهم ایکس به پر شده است. من می خواهم به sscanf به تنها موفق در پر کردن اولین متغیر است. و به طوری که به همین دلیل من می خواهید sscanf به بازگشت 1. و اگر این بیت بر سر است برای لحظه ای، که کاملا خوب است. تحقق بخشیدن به هر چند، که یکی از ارزش getInt و getString این است که ما در حال انجام یک معامله از بسیاری از چک کردن خطا مثل این تا که، تا به امروز، شما می توانید تقریبا نوع هر چیزی در صفحه کلید خود را، و ما آن را گرفتن. و ما قطعا، کارکنان، قطعا نمی منبع از مشکلات را در خود برنامه، چرا که ما دفاعی هستیم چک کردن برای همه از احمق چیزهایی که یک کاربر ممکن است، مانند تایپ کردن یک رشته، زمانی که شما واقعا می خواستم هوشمند. بنابراین برای now-- ما آمده به این قبل از long-- اما همه این زمان، getString و getInt دارند در زیر هود با استفاده از این بوده است ایده اولیه از آدرس حافظه است. بنابراین در حال حاضر، اجازه دهید همه چیز کاربر پسند کمی بیشتر است. همانطور که شما ممکن است به یاد، از Binky آخرین time-- اگر موس من تا cooperate-- خواهد ما این کد، به حال که رک و پوست کنده، نسبتا مزخرف. این کد رسیدن به هیچ چیز مفید است، اما آن را به عنوان مثال بود که استاد Parlante استفاده به منظور نشان دادن آنچه که قرار بود در یک برنامه های مربوط به حافظه است. بنابراین اجازه دهید این بازگو داستان به طور خلاصه فوق العاده. این دو خط اول، در انگلیسی، آنچه، به شما می گویند؟ فقط در منطقی بشر، اما کمی از لحاظ فنی، یک چاقو. رسید [نامفهوم]. DAVID J. مالان: OK، شما در حال ایجاد آدرس برای x و متغیر y است. نه کاملا، چون x و y هستند متغیر در معنای سنتی. x و y آدرس می و یا آدرس را ذخیره کنید. بنابراین اجازه دهید سعی کنید این بار دیگر. نه یک شروع بد، هر چند. آره؟ رسید [نامفهوم]. DAVID J. مالان: خوب. من فکر می کنم که یک پاک کن کوچک است. اعلام دو اشاره گر، دو عدد صحیح. و ما آنها را x و y تماس. و یا اگر ما به منظور جلب این به عنوان یک عکس، دوباره، به خاطر سادگی تمام ما در حال انجام با آن خط اول رسم یک جعبه مانند این، با برخی از ارزش زباله در آن، و خواستار آن X، و پس از آن جعبه دیگری شبیه به این، با برخی از ارزش زباله در آن، آن را y است. ما اعلام کرده ایم دو اشاره گر است که در نهایت آدرس از یک int را ذخیره کنید. به طوری که همه وجود دارد. بنابراین، هنگامی که Binky این کار را کرد، خاک رس درست مثل این نگاه کرد. و نیک فقط نوع پیچیده کردن فلش، به عنوان اینکه آنها اشاره جایی نمی به طور خاص، زیرا آنها فقط می ارزش زباله. آنها به صراحت راه اندازی نشده است در هر نقطه خاص است. در حال حاضر در خط بعدی از کد، فراخوان، این بود. بنابراین در معقول کاربر پسند، اما تا حدودی فنی انگلیسی، آنچه در این خط از کد انجام است؟ آره؟ رسید [نامفهوم]. DAVID J. مالان: کامل. این اختصاص تکه از حافظه که به اندازه یک int است. و این نیمی از پاسخ. شما حق پاسخ نیمی از بیان است. چه اتفاق می افتد در سمت چپ از علامت مساوی؟ آره؟ رسید و اختصاص آن را به متغیر x؟ DAVID J. مالان: و اختصاص آن را به متغیر x. بنابراین برای روکش، راست سمت اختصاص حافظه کافی برای ذخیره یک int. اما به طور خاص malloc آدرس گرداند آن تکه از حافظه، که شما در فقط پیشنهاد می شود ذخیره می شود در x. پس چه نیک زمان آخرین با Binky انجام است او کشیده میشوند که اشاره گر از، خاک رس، به نقطه در حال حاضر در یک تکه سفید حافظه که به اندازه یک int برابر است. و در واقع، که به معنای برای نشان دادن چهار بایت. در حال حاضر، خط کد بعدی این را، ستاره ایکس می شود 42. بنابراین 42 سر راست در است سمت راست، معنای زندگی است. سمت چپ، ستاره ایکس یعنی چه؟ که بیش از حد ممکن است gone-- که OK. OK. رسید در واقع، رفتن به [نامفهوم] DAVID J. مالان: خوب. رسید [نامفهوم]. DAVID J. مالان: دقیقا. سمت چپ به معنای رفتن به x. ایکس آدرس است. آن را مانند 33 خیابان آکسفورد، و یا OX1 است. و ستاره ایکس به معنی رفتن به آن آدرس و آنچه وجود دارد؟ 42. پس در واقع، این دقیقا همان چیزی نیک را انجام داد. او با با آغاز شده، اساسا، ذهنی با اشاره انگشت در x و بعد از فلش به جعبه سفید در دست راست طرف، و قرار دادن شماره 42 وجود دارد. اما پس از آن همه چیز کمی خطرناک است، درست است؟ Binky در مورد از دست دادن سر خود را. ستاره سالانه برابر 13، شانس بد، یعنی چه؟ بنابراین معنی ستاره سالانه به آدرس در y است. اما آدرس در سال است؟ همه حق است، آن را به ارزش زباله، درست است؟ من آن را به عنوان یک علامت سوال به خود جلب کرد. نیک آن را به عنوان یک پیکان فر به خود جلب کرد. و به محض اینکه شما را امتحان کنید انجام ستاره سال، گفت: رفتن وجود دارد، اما مشروع وجود ندارد آدرس، آن را در برخی از مکان جعلی است، برنامه رفتن را به سقوط. و سر Binky در جریان است به پرواز کردن در اینجا، به عنوان آن را انجام داد. بنابراین در پایان، این برنامه فقط عیب از صاف بود. این یک برنامه حشره دار بود. و این نیاز به ثابت. و تنها راه، واقعا، آن را برطرف خواهد بود، به عنوان مثال، این خط، که ما حتی برای به دست آوردن نیست، چرا که برنامه خیلی زود سقوط کرد. اما اگر ما به حل این مشکل چه اثر می کند انجام سالانه برابر x را داشته باشد؟ خوب، آن را اساسا اشاره y در هر مقدار x است اشاره در. بنابراین در داستان نیک، و یا داستان Binky، هر دو x و y در اشاره شد تکه های سفید حافظه، به طوری که، در نهایت، هنگامی که شما آیا ستاره سالانه معادل 13 دوباره، شما را تا پایان با قرار دادن 13 در محل مناسب. پس همه این خطوط کاملا مشروع، به جز این یکی، هنگامی که آن را قبل از اینکه شما اتفاق افتاده است در واقع سالانه اختصاص داده ارزش باشد. در حال حاضر خوشبختانه، شما نمی باید از طریق تمام استدلال از این نوع از مسائل در خود تغییر دهید. اجازه بدهید من به جلو و باز کردن یک پنجره ترمینال در اینجا و باز کردن، برای فقط یک لحظه، یک برنامه فوق العاده کوتاه است که همچنین نوع بی معنی است. این زشت است. این هیچ چیزی مفید دست یابد. اما آن را نشانی از نشان دادن مسائل حافظه، پس بیایید نگاهی به. بخش اصلی، فوق العاده ساده است. ظاهرا خواستار یک تابع، ج، و سپس 0 را برمی گرداند. این نوع از سخت به یک ظرف غذا این است. بنابراین بخش اصلی خیلی خوب است، تا کنون. بنابراین ج مشکل ساز است. و فقط خیلی قرار داده نشده است تلاش به نامگذاری آن در اینجا، برای حفظ تمرکز بر کد. ج دارای دو خط. و اجازه دهید ببینیم که چه چیزی در حال حاضر در جریان است. بنابراین از یک طرف here-- و اجازه دهید این سازگار با قبلی example-- از یک سو، در سمت چپ است انجام آنچه، به زبان انگلیسی؟ این is-- رسید ساخت یک اشاره گر. DAVID J. مالان: ایجاد یک اشاره گر به یک int و آن را ایکس. پس از آن به ایجاد یکی از آن جعبه من در حفظ و رسم بر روی صفحه لمسی. و در حال حاضر، در دست راست سمت، malloc، البته، است اختصاص یک تکه از حافظه است. و فقط به روشن باشد، چگونه حافظه آن است که ظاهرا تخصیص، اگر شما فقط نوع انجام محاسبات ریاضی که اینجا هستید؟ پس از آن 40 بایت. و من می دانم که تنها به خاطر من می دانم اعضای هیات، در دستگاه CS50، حداقل، چهار بایت است. بنابراین 10 برابر 4 40 است. بنابراین این ذخیره سازی x و آدرس از از اول 40 نوع داده int است که اند فضای اختصاص داده شده است به عقب، به عقب، به عقب، به پشت. و این چیزی است که این مهم در مورد malloc. این حافظه کمی را ندارد در اینجا، کمی در اینجا، کمی اینجا. این به شما می دهد یک تکه از حافظه، contiguously، از عامل سیستم. در حال حاضر آنچه در مورد این، ایکس براکت 10 برابر 0؟ خط خودسرانه از کد. این هیچ چیزی مفید دست یابد. اما جالب است، چون ایکس براکت 10--؟ آره؟ رسید [نامفهوم]؟ DAVID J. مالان: ایکس براکت 10 اختصاص ندارد به تهی باشد. جزئیات null تنها به بازی می آید با رشته ها، در پایان یک رشته است. اما فکر خوب است. این آرایه چقدر بزرگ است، حتی هر چند که من 40 بایت اختصاص داده ام؟ این 0 الی نه، درست است؟ این 10 نوع داده int است، در کل. 40 بایت، اما 10 نوع داده int، از 0 نمایه شده 0. پس چه که x براکت 10 است؟ این در واقع برخی از ارزش زباله در دست نیست. این حافظه که به من تعلق ندارد. من نمی باید لمس شود که بایت تعداد 41، 42، 43، 44. من قصد دارم کمی بیش از حد. و در واقع، اگر من اجرای این برنامه، آن را به خوبی ممکن است سقوط. اما گاهی اوقات، ما خوش شانس دریافت کنید. و بنابراین فقط برای نشان دادن this-- و رک و پوست کنده، شما هرگز قبل از اینکه شما می دانید انجام it-- اجازه دهید این را اجرا کنید. این در واقع سقوط نیست. اما اگر این تغییر من به عنوان مثال، به مانند 1000 باشد، به این واقعا عمدی، بیایید ببینید اگر ما می توانیم آن را به سقوط این زمان. OK، اما این سقوط نیست. چگونه در مورد 100000؟ اجازه دهید آن را بازسازی، و در حال حاضر آن را دوباره. OK. دارید.حالا. خوب. بنابراین ظاهرا، دوباره، این بخش های حافظه، پس به صحبت می کنند، منطقی بزرگ، بنابراین ما می توانیم خوش شانس دوباره و دوباره. اما در نهایت، هنگامی که شما مسخره و واقعا به دور از بر روی صفحه نمایش، شما حافظه لمس است که واقعا، واقعا متعلق به شما نیست. اما رک و پوست کنده، این انواع اشکالات در حال رفتن به سخت تر و سخت تر به شکل در خود تغییر دهید. اما خوشبختانه، به عنوان برنامه نویسان، ما ابزار است که به ما اجازه این کار را برای ما. پس این است که، شاید، یک از زشت ترین برنامه ها، حتی زشت تر خروجی از gdb است. اما همیشه یک خط و یا دو که فوق العاده مفید است. Valgrind برنامه ای است که کمک می کند است شما اشکال زدایی برنامه نیست، در هر سه، اما مربوط به حافظه مشکلات، به طور خاص. این به طور خودکار کد شما اجرا خواهد شد برای شما و برای حداقل دو چیز است. یکی، آیا شما چیزی را اتفاقی مانند حافظه تماس که به شما تعلق ندارد؟ این کمک خواهد کرد که آن موارد را پیدا کنید. و دو، آن کمک خواهد کرد شما در پیدا کردن چیزی به نام نشت حافظه، که ما به طور کامل نادیده گرفته میشوند، ساده لوحانه، برای برخی از زمان و خوش. اما معلوم است، همه این زمان، هر زمان که شما getString در نام کرده ام بسیاری از برنامه های ما، شما در حال درخواست از عامل سیستم حافظه، اما شما هر گونه خاطره از هر زمان دیگری به آن پشت، انجام unalloc، و یا آزاد، به عنوان آن را به نام. نه، چون ما هیچ وقت از شما خواسته به انجام این کار. اما همه این زمان، برنامه شما در C نوشتن اند نشت شده حافظه، درخواست از عامل سیستم برای بیشتر و بیشتر حافظه برای رشته و فلان چیز، اما هرگز آن را توزیع دوباره. و در حال حاضر این کمی است از ساده، اما اگر شما همیشه اجرا مک خود و یا PC خود را برای مدتی، باز تعداد زیادی از برنامه ها، شاید بسته شدن برنامه ها، و حتی اگر شما کامپیوتر تا به سقوط نیست، آن را گرفتن بسیار آهسته تر، به عنوان اینکه واقعا با استفاده از مقدار زیادی از حافظه یا منابع، حتی اگر، اگر شما حتی دست زدن به صفحه کلید، است که می تواند be-- اما always-- نمی توانست باشد که برنامه شما در حال اجرا خود دارای حافظه. و آنها را نگه دارید درخواست OS برای بیش و حافظه بیشتر، از آن فراموش کردن در مورد آن، در واقع با استفاده از آن نیست، اما بنابراین در نظر گرفتن حافظه دور از برنامه های دیگر که ممکن است آن را می خواهم. به طوری که توضیح معمول است. در حال حاضر در اینجا است که در Valgrind خروجی به طور کامل بی رحم به کسانی که کمتر و راحت تر به طور یکسان. اما جالب مسائل مناسب است در اینجا. این است که من نوشتن نامعتبر است از گفتن اندازه چهار اتفاق می افتد در این برنامه، به طور خاص، در خط 21 از یاد. اگر من به خط 21، HM وجود دارد در واقع، نوشتن نامعتبر اندازه چهار است. چرا اندازه چهار؟ خوب، این number-- و آن را می تواند anything-- یک int است. پس از آن چهار کلمه در ادامه متن. بنابراین من قرار دادن چهار بایت چرا که آنان تعلق ندارد. این چیزی است که Valgrind است که در واقع به من گفتن. علاوه بر این، آن را نیز خواهد شد به من بگویید، به عنوان خواهیم دید، به شما به عنوان این اجرا در یک pset آینده، اگر و هنگامی که حافظه، که در واقع شما به بیرون درز کرده ام من، چون من به نام ام malloc، اما من در واقع ندارد نامیده می شود، در این مورد، رایگان، که ما آن را در نهایت خواهید دید در مقابل از malloc است. بنابراین در حال حاضر، من فکر می کنم، به عنوان مثال نهایی است. پس این یکی یک کمی بیشتر محرمانه است، اما شاید بزرگترین دلیلی برای مراقب باشید با حافظه، و به این دلیل است که بسیاری از برنامه های و / یا سرور وب، حتی تا به امروز، ها توسط بچه ها بد جایی گرفته در اینترنت که به نحوی می باشد ارسال بسته های جعلی به سرور شما تلاش برای مصالحه حساب خود را، و یا اطلاعات خود را، و یا فقط به طور کلی بیش از یک ماشین است. سرریز بافر، به عنوان نام آن پیداست، به معنی جاری نمی هوشمند، اما یک بافر. و یک بافر فقط یک راه فانتزی گفت: آن را به یک دسته از حافظه است. و در واقع، من یک رشته به نام قبل از بافر، به جای است. از آنجا که اگر آن را به یک بافر است، مثل به این معنا یوتیوب، و یا هر زمان که شما در حال تماشای یک ویدیو، شما ممکن است را دیده اند، بافر کلمه، نقطه، نقطه، نقطه. این فوق العاده آزار دهنده است. و این فقط به این معنی است که دستگاه پخش ویدئو خود را در تلاش است تا دانلود کنید مقدار زیادی از بایت، تعداد زیادی از بایت از یک ویدیو از اینترنت. اما آهسته، پس از آن تلاش دانلود یک دسته از آنها برای پر کردن یک بافر، یک ظرف، به طوری که شما باید بایت به اندازه کافی است که پس از آن می توانید شما این ویدیو نشان می دهد، بدون توقف به طور مداوم. اما معلوم است، شما می توانید یک بافر در این بزرگ است. اما سعی کنید برای قرار دادن این داده های زیادی را در آن، و بسیار چیزهای بد اتفاق می افتد. بنابراین به عنوان مثال، اجازه دهید نگاه این تیزر نهایی به عنوان مثال. این یکی دیگر از برنامه است که، در نگاه اول، هیچ چیزی فوق العاده مفید نمی کنند. آن را به یک تابع اصلی که خواستار آن تابع، ج. و این تابع، ج، اینجا، است یک آرایه کاراکتر، به نام ج، اندازه 12. و سپس آن را با استفاده از این عملکرد جدید به نام strncpy. به نظر می رسد که، با این ساده، خط ساده از کد، فقط دو خط، ما تمام برنامه های من ساخته شده، و در نتیجه، کل کامپیوتر من، و حساب کاربری من، و سخت من رانندگی به طور بالقوه به هر کسی آسیب پذیر که می داند و به اندازه کافی خوب است برای اجرا این برنامه را با یک خط دستور خاص بحث. به عبارت دیگر، اگر این پسر بد قرار می دهد در داخل argvargv [1] با تایپ در صفحه کلید به خصوص بسیار گردد رشته، نه بی سی، 123، اما در اصل، علائم دودویی است که نشان دهنده اجرایی کد، برنامه ای است که او نوشت، با این برنامه ساده است که نماینده هزاران نفر از برنامه که به طور مشابه آسیب پذیر، جرات گفتن، او در نهایت می تواند همه را حذف کنید فایل ها بر روی دیسک سخت من، یک چشمک زدن سریع به طوری که او می تواند نوع دستورات خود به خود، ایمیل همه فایل ها را به خودم. هر چیزی که می توانم انجام دهم، او یا او می تواند با این کد انجام دهد. ما نمی خواهد کاملا حل این است. و در واقع، آن را به شامل یک عکس کوچک مثل این است که ما به زودی می آیند برای درک همه بهتر است. اما امروز، اجازه دهید در پایان چه چیزی، امیدوارم، کمی بیشتر قابل درک شوخی XKCD، تا زمانی که ما هم بعد از سر گرفت. خوب. شما در چهارشنبه کنید. [MUSIC پخش] SPEAKER: و اکنون، عمیق افکار، توسط Daven Farnham. حافظه مانند پریدن به شمع از برگ طلایی در یک بعد از ظهر یکشنبه. وزش باد، حول خود hair-- آه، من روز when-- دست [خنده]