[پخش موسیقی] دیوید J. مالان: همه حق. [خنده حضار] خوش آمدید. این CS50 است. و این پایان هفته پنج. و تا به حال، ما تقریبا در نظر گرفتن برای مسلم است که وجود دارد این کامپایلر، صدای جرنگ جرنگ، که شما وجود دارد از طریق این استناد ابزار دیگری به نام که به نحوی جادویی تبدیل کد منبع خود را به کد شیء، صفر و آنهایی که که CPU کامپیوتر شما، مرکزی واحد پردازش، در واقع درک می کند. اما معلوم است که وجود دارد در زیر هود در بین ورودی و خروجی. و من می خواهم به پیشنهاد که ما گوشت که در جزئیات کمی بیشتر به این چهار مرحله، چیزی به نام قبل از پردازش، چیزی نام گردآوری، که ما را دیده اند، چیزی به نام مونتاژ، و چیزی به نام ارتباط. بنابراین تا در حال حاضر، در برخی از ما برنامه ها، ما تا به حال تیز شامل. اخیرا ما تا به حال برخی از تیز تعریف می کند برای ثابت. بنابراین معلوم است که آن چیزهایی است که با نماد هش یا پیشوند نماد پوند پیش پردازنده دستورالعمل. این فقط یک راه فانتزی از گفتن آن یک خط از کد را که در واقع تبدیل به چیز دیگری قبل از کامپیوتر حتی تلاش برای تبدیل شما برنامه را صفر و آنهایی که. به عنوان مثال، تیز شامل استاندارد I / O. ساعت، تقریبا حالت فقط بدان معناست بروید جلو، با شتاب محتویات فایل stdio.h و چسباندن آنها را به سمت راست وجود دارد. بنابراین هیچ صفر و آنهایی که که در آن نقطه هنوز. این واقعا تنها یک تعویض است. و این در طول به اصطلاح انجام می شود مرحله پیش پردازش، هنگامی که شما در واقع صدای جرنگ جرنگ اجرا و یا به طور خاص را در اکثر موارد. بنابراین همه این اتفاق می افتد شده است برای اولین بار به طور خودکار تا کنون. سپس مرحله تدوین می آید. اما ما ساده بوده ام تلفیقی. کامپایل یک برنامه واقعا به معنی آن را از چیزی شبیه به C، کد منبع ما نوشتن، پایین به چیزی به نام مونتاژ. زبان اسمبلی سطح پایین تر است زبانی که، خوشبختانه، ما نمی خواهد بسیار مناسبت به ارسال این ترم. اما آن را در پایین ترین سطح در معنا که شما به معنای واقعی کلمه شروع به نوشتن اضافه کردن و تفریق و ضرب و بار از حافظه و ذخیره به حافظه، دستورالعمل های بسیار اساسی است که یک کامپیوتر، در زیر هود، در واقع می فهمد. در نهایت، مونتاژ طول می کشد که زبان به صفر و آنهایی که ما بوده ام توصیف تا کنون. و واقعا در نهایت، به اصطلاح وجود دارد مرحله اتصال، که ما در یک لحظه، که ترکیبی از دیدن صفر و کسانی که با صفر و آنهایی که افراد دیگر قبل از شما ایجاد کرده است. بنابراین این برنامه فوق العاده ساده را در نظر بگیرند. از هفته 1 بود. فقط گفت، سلام جهان، بر روی صفحه نمایش. ما این کار را از طریق صدای جرنگ جرنگ زد. یا ما زد آن را از طریق ساختن که زد صدای جرنگ جرنگ. و در آن زمان خروجی که در آن برخی از صفر و آنهایی که. اما معلوم وجود دارد مرحله میانی. اگر من در اینجا - اوه، نداشت می خواهم او را ببیند هنوز. اگر من در اینجا به دستگاه من و من باز کردن hello.c، در اینجا که همان برنامه است. و آنچه که من قصد دارم در ترمینال من پنجره در اینجا من قصد دارم به اجرای صدای جرنگ جرنگ به جای ساخت، که خودکار هر چهار این مراحل را برای ما. و من قصد دارم به صدای جرنگ جرنگ-S و سپس hello.c و پس از آن را وارد کنید. و من سریع چشمک می زند دوباره، که خوب است. و در حال حاضر در یک پنجره کمی بزرگتر، من قصد دارم برای باز کردن نرمافزاری gedit در اینجا. و من قصد دارم برای باز کردن یک فایل است که، معلوم است، به نام این hello.s شامل که زبان اسمبلی من به آن اشاره پیش از آن. و این همان چیزی است که مونتاژ نامیده می شود زبان، سطح نسبتا کم دستورالعمل که CPU اینتل شما و یا هر آنچه در آن است که در داخل درک می کند. و ویدئویی است برای حرکت. تماس برای خواستار یک تابع سطح بسیار پایین. زیر است برای تفریق است. بنابراین، هنگامی که شما باید یک پردازنده خاص در داخل از کامپیوتر شما، چه چیزی باعث آن مجزا، در مقابل دیگر پردازنده بازار، است که دستورالعمل آن درک می کند و اغلب چگونه کارآمد آن است، با چه سرعتی آن را در اجرای برخی از این دستورالعمل. در حال حاضر بیشتر در مورد این، شما می توانید CS61 پاییز آینده در کالج. اما در اینجا ما باید، به عنوان مثال، چند شناسه که ممکن است نگاه آشنا. hello.c نام از این برنامه است. متن - بسیاری از علاقه وجود ندارد فقط در حال حاضر، به یاد بیاورید که متن بخش، به عنوان روز دوشنبه، این است که جایی که در حافظه برنامه شما در واقع به پایان می رسد. به طوری که حداقل مبهم آشنا وجود دارد. در اینجا، البته، ذکر است تابع اصلی ما است. نوار پیمایش پایین، این اشاره به همه چیز اصطلاح ثبت، تکه های بسیار کوچک حافظه داخل CPU واقعی خود را. و اگر من حتی پایین علاوه بر این، من می بینم نوعی اشاره غیر مستقیم ASCII. و در آنجا، در واقع، آن رشته است، خوش آمدید، کاما، جهان است. بنابراین داستان کوتاه مدت، این بوده است برای شما اتفاق می افتد، به طور خودکار، در زیر کاپوت این زمان. و آنچه که اتفاق می افتد واقعا یک بار شما صدای جرنگ جرنگ اجرا شود، و یا از طریق ساخت، شما در حال گرفتن برای اولین بار، از کد منبع، به اصطلاح زبان اسمبلی. سپس صدای جرنگ جرنگ تبدیل این مجموعه زبان را به صفر و آنهایی که. و این اسلاید است که ما آغاز شده است بحث ما در هفته 0 - و سپس هفته 1. و سپس در نهایت، کسانی که از صفر و آنهایی که با صفر و آنهایی که ترکیب از کسانی که کتابخانه ما مصرف بوده ام مانند استاندارد I / O یا اعطا کتابخانه رشته و یا حتی کتابخانه CS50. بنابراین دست به کار شد و رنگ این تصویر بصری، ما باید hello.c. و این، البته، با استفاده از چون printf تابع می گویند، سلام جهان. مرحله تدوین آن طول می کشد را به که فایل ما فقط و شاهد hello.s، حتی هر چند که به طور معمول حذف شده به طور خودکار برای شما. اما این کدهای اسمبلی در مرحله میانی است. و سپس هنگامی که ما جمع آوری مونتاژ زبان، پس به صحبت می کنند، که زمانی که شما دریافت آن صفر و آنهایی که. بنابراین ما به طور موثر در امروز در بزرگنمایی کرده ام آنچه ما مصرف بوده ام اعطا، بدان معنی است که کد منبع به کد شیء. اما در نهایت، در حال حاضر که همان تصویر - اجازه دهید آن را پرتاب را به سمت چپ. و توجه داشته باشید که در بالای صفحه وجود دارد من stdio.h ذکر شده است. این یک فایل است که ما را گنجانده ام در تقریبا تمام برنامه های ما نوشته شده است. و این فایل که محتویات دریافت یک کپی چسبانده، به طور موثر در بالای کد شما. اما معلوم است که بر روی یک کامپیوتر سیستم در جایی، احتمالا وجود دارد فایل stdio.c را که کسی سال نوشت پیش که پیاده سازی توابع است که اعلام شد در stdio.h. در حال حاضر در واقع آن را احتمالا در مک شما و یا کامپیوتر خود را و یا حتی در CS50 دستگاه یک کد خام C است. کسی در حال حاضر از آن وارد شده و فایل کد شیء یا یک فایل، که اشاره به یک کتابخانه مشترک که از قبل نصب شده و قبل وارد شده برای شما. اما فرض کنید که در واقع وجود دارد در stdio.c کامپیوتر خود را به صورت موازی با صدای جرنگ جرنگ. کد خود را در حال تدوین است و مونتاژ. کد stdio.c است که در حال تدوین است و مونتاژ، به طوری که این بسیار گذشته گام، پایین در اینجا، ما به نوعی لینک، پس به صحبت می کنند، صفر و آنهایی که خود را با صفر و آنهایی که خود و یا او را به یکی از برنامه ساده است که در نهایت به نام فقط خوش آمدید. به طوری که همه از سحر و جادو که اتفاق می افتد شده است تا کنون. ادامه خواهد داد و به این فرایندها برای اعطا شده است، اما متوجه بسیاری از جزئیات آبدار وجود دارد در زیر وجود دارد. و این همان چیزی است که خود را کامپیوتر با اینتل در داخل به ویژه متمایز است. بنابراین در آن توجه داشته باشید، اگر شما می خواهم به به ما بپیوندید برای ناهار روز جمعه، نمی رویم به مکان معمول cs50.net/rsvp، 1:15 PM این جمعه. و در حال حاضر چند اطلاعیه ها. بنابراین ما باید برخی از اخبار خوب است. و ما باید برخی از اخبار بد است. شروع با برخی از خبر خوب در اینجا. [ناله] بسیار خوب. خوب، آن را از لحاظ فنی یک روز تعطیل است، بنابراین آن نه آنقدر هدیه ای از ما. اما پس از آن خبر بد البته. [ناله] من زمان زیادی را صرف در این انیمیشن. [خنده حضار] خواهد بود یک جلسه بررسی وجود دارد این آینده دوشنبه. این رفتن در 5:30 بعد از ظهر باشد. ما شما را از تمام این جزئیات به یاد از طریق ایمیل در درس وب سایت را در فقط یک زن و شوهر از زمان روز. از آن خواهد شد فیلم برداری شده و در دسترس مدت کوتاهی پس از آن. بنابراین اگر شما می توانید که دوشنبه شکاف شب، نگران نباشید. بخش ها این هفته آینده نیز خواهد شد تمرکز بر بررسی برای مسابقه. اگر بخش خود را در روز دوشنبه، که در واقع تعطیلات دانشگاه، ما خواهد شد هنوز هم در بخش دیدار خواهد کرد. اگر می توانید به سادگی نیست که بخش دلیل این که شما در حال رفتن دور کند، آن برنامه خوب است. شرکت یکشنبه و یا بخش سه شنبه یا هماهنگ به بخش جیسون، که آنلاین در دسترس است. بنابراین، خبر بد تر. بنابراین با توجه به برنامه درسی، ما باید سخنرانی جمعه آینده. اما خبر خوب - به روشنی، من زمان زیادی را در این مورد به سر برد. [خنده حضار] خواهیم آینده سخنرانی روز جمعه را لغو نمایید. به طوری که یک هدیه ای برای ما خواهد بود، بنابراین شما واقعا می تواند یک استراحت خوبی در بین این هفته و دو هفته از این رو. بنابراین هیچ هفته آینده سخنرانی ها، فقط یک کوچک مسابقه کمی، که شما باید هیجان زده شدن به طور فزاینده ای. پس اجازه دهید در حال حاضر به نوبه خود توجه ما را به چیزی است که در واقع بصری تر و هیجان انگیز تر و به مجموعه ای از مرحله چه خبر است در آسمان شهر فقط یک زن و شوهر از هفته. پس از مسابقه اول، ما به نوبه خود تمرکز از مجموعه مسائل ما به دیگری مشکل دامنه خاص، که از پزشکی قانونی و یا امنیت به طور کلی. در واقع، سنت با این مشکل مجموعه برای من یکی از آموزش همکار یا CAS راه رفتن در سراسر پردیس در نظر گرفتن برخی از عکس ها شناسایی اما غیر از مردم آشکار، مکان ها، یا چیزها، پس از آن هر سال من به نحوی مدیریت به طور تصادفی حذف یا فاسد کارت رسانه های دیجیتال که در داخل دوربین ما. اما هیچ معامله بزرگ است. من می توانید پیش بروید و پلاگین که به کامپیوتر من. من می توانم یک تصویر قانونی از آن، بنابراین به صحبت می کنند، با کپی کردن صفر و آنهایی که در این بازی که کارت حافظه، اعم از یک کارت SD خود و یا کارت کامپکت فلش یا هر آنچه که شما با آن آشنا هستید. و پس از آن ما می توانیم از دست آن. و به این ترتیب چالش پیش رو در میان دیگر همه چیز برای شما، خواهد بود برای نوشتن کد C که بهبود یک دسته کامل از عکس JPEG را برای من و نشان خواهد بود این افراد، مکان ها، و یا همه چیز. و ما نیز باید در این مسئله صحبت می کنید، مجموعه ای و در روزهای آینده، در حدود گرافیک به طور کلی. ما به آنها استفاده می شود، البته، برای شکستن. اما تو مرتب کردن بر اساس گرفته شده برای اعطا وجود دارد این مفاهیم سطح بالا وجود دارد مستطیل و بیضی است. اما در زیر کاپوت پیکسل وجود دارد. و شما تا به حال برای شروع فکر کردن در مورد کسانی که. و یا شما برای P-مجموعه 4 باید به فکر می کنم در مورد شکاف بین آجر های خود را، چگونه به سرعت شما در حال توپ در حال حرکت در سراسر شکستن صفحه نمایش برای. بنابراین این مفهوم وجود دارد نقطه بر روی صفحه نمایش خود را که آمده را به بازی در حال حاضر. حالا چه می بینید، هر چند، آن چیزی است که شما بر روی صفحه نمایش کامپیوتر دریافت کنید. اگر شما تا کنون به تماشای برخی از خوب یا تلویزیون بد، شانس آنها تقریبا درمان مخاطبان مانند technophobes ها که واقعا نمی می دانم که خیلی در مورد محاسبات. و پس از آن بسیار آسان است برای پلیس کارآگاه به گفتن نیست، می تواند به شما تمیز کردن که برای من؟ یا افزایش، درست است؟ افزایش است مانند کلمه وزوز در هر نشان می دهد مربوط به جرم و جنایت. و واقعیت این است که اگر شما را بسیار تصویر تار یک مظنون انجام چیزی بد، شما می توانید فقط آن را بالا ببرد. شما نمی توانید در بی نهایت زوم. شما نمی توانید در تابیدن کسی را ببینید چشم که مرتکب جرم خاص، با وجود شیوع این در تلویزیون. و به طوری که با اجازه انگیزه که مشکل آینده با یک نگاه اجمالی در برخی از نشان می دهد که با شما ممکن است آشنا باشد. [پخش ویدئو] OK را بزنید. در حال حاضر، بیایید یک نگاه خوبی در شما. ، نگه از آن. اجرای آن پشت. یک دقیقه صبر کنید. برو درست است. وجود دارد. یخ که. صفحه نمایش کامل. OK را بزنید. یخ که. سفت کردن بر روی آن، بله؟ بردار در آن مرد چرخ عقب. زوم در حق در اینجا در این نقطه است. با استفاده از تجهیزات مناسب، عکس برداری را می توان بزرگ و تیز. چه خبر؟ این برنامه افزایش است. آیا می توانم به شما روشن است که تا هر؟ من نمی دانم. بیایید آن را بهبود بخشد. بهبود بخش A-6. -I جزئیات افزایش یافته است و - من فکر می کنم به اندازه کافی به منظور ارتقاء وجود دارد. انتشار آن را به روی صفحه نمایش من. افزایش انعکاس در چشم او. بیایید این را از طریق اجرا افزایش کیفیت ویدئو. ادگار، می تواند شما را بالا ببرد؟ قطع. کار I've در این انعکاس. کسی که بازتاب. انعکاس. انعکاس وجود دارد صورت مرد. بازتاب. وجود دارد یک انعکاس است. زوم در آینه. شما می توانید بازتابی را ببینید. آیا می توانم تصویر شما را در توسعه از اینجا؟ آیا می توانم او را به شما افزایش حق در اینجا؟ آیا می توانم آن را به شما را بالا ببرد؟ آیا می توانم آن را به شما را بالا ببرد؟ آیا ما می توانیم این را بالا ببرد؟ آیا می توانم آن را به شما را بالا ببرد؟ نگه دارید در دوم، من را بالا ببرد. زوم بر روی درب. -X10. زوم. [خنده حضار] حرکت شوید. صبر کنید، متوقف شود. توقف. آن تامل است. چرخش 75 درجه در اطراف لطفا عمودی است. [خنده حضار] توقف، و بازگشت به بخش در مورد درب دوباره. کردم یک تقویت کننده تصویر است که می تواند بیت مپ؟ شاید ما می توانیم پرادیپ سن استفاده روش برای دیدن به ویندوز. این نرم افزار دولت از هنر است. ارزش آیکون خاموش است. با ترکیب راست الگوریتم باشد. او الگوریتم های نور گرفته سطح بعدی و من می توانم آنها را به استفاده از افزایش این عکس. قفل و تصویر را بزرگ تر ببینید. محور z. -Enhance استفاده کنید. -Enhance استفاده کنید. -Enhance استفاده کنید. یخ و بالا ببرد. [END پخش ویدئو] دیوید J. مالان: بنابراین مشکل تنظیم 5 همان چیزی است که در پیش روست وجود دارد. بنابراین ما به زودی خواهید درک بهتر از زمانی که و به همین دلیل شما می توانید و ما نمی تواند در آن راه را بالا ببرد. اما در ابتدا، اجازه دهید به توجه ما به برخی از بلوک های ساختمان خواهیم نیاز به قادر به گفتن این داستان. بنابراین به یاد بیاورید که ما به خود جلب کرد این تصویر در دوشنبه و یک کمی هفته گذشته است. و این توصیف طرح از چیزهایی در حافظه کامپیوتر شما در هنگام برخی از برنامه های در حال اجرا. بخش فن آوری تا بالا، به یاد می آورند، اشاره دارد به صفر واقعی و آنهایی که که برنامه شما را تشکیل می دهند. ، زیر آن وجود دارد، برخی از مقداردهی اولیه و یا داده های مقدار دهی نکردن، که به طور معمول اشاره به چیزهایی مانند ثابت یا رشته یا متغیر جهانی است که در پیشبرد اعلام شده است. پشته وجود دارد، اما ما می آیند برگشت به که در یک بیت. و پس از آن پشته وجود دارد. بسیار شبیه به انبوهی از سینی های در کافه تریا، این است که در آن حافظه می شود لایه و چند لایه هر زمان که شما به آنچه که در برنامه؟ استفاده از پشته برای چیست؟ آره؟ عملکرد. هر زمان که شما یک تابع، آن را آن به بریدن حافظه داده متغیرهای محلی و پارامترهای آن. و در pictorially، ما می بینیم که با هر تابع های پی در پی نامیده می شود، زمانی که تماس B تماس C تماس D، بر روی پشته لایه. و در هر یک از آن برش حافظه است که اساسا یک دامنه منحصر به فرد است برای این تابع، که، البته، مشکل است اگر می خواهید به دست از یک تابع خود را به یکی دیگر از قطعه داده است که شما آن را می خواهم جهش یا تغییر. پس چه راه حل ما را قادر می سازد یک تابع ارائه شده توسط یک پشته قاب برای تغییر حافظه داخل یکی دیگر از قاب پشته؟ چگونه می توانم این دو بحث به یکدیگر؟ بنابراین از طریق اشاره گر ها یا آدرس، که، دوباره، فقط توصیف جایی که در حافظه، راه خاص تعداد نیش می زنند، خاص ارزش را می توان یافت. بنابراین زمان گذشته به خاطر بیاورید بیش از حد ما ادامه داد: داستان و نگاه نسبتا برنامه حشره دار. و این برنامه حشره دار برای چند است دلایل، اما یکی از نگران کننده ترین است دلیل آن است که نتواند برای بررسی چه؟ بله، با مشکل مواجه شد به بررسی ورودی. پوزش می طلبیم؟ اگر آن را بیش از 12 کاراکتر است. بنابراین بسیار هوشمندانه، در هنگام فراخوانی memcopy، که، به عنوان نام نشان می دهد، فقط کپی حافظه از آرگومان دوم آن به آرگومان اول خود را. آرگومان سوم، بسیار هوشمندانه است، بررسی تا مطمئن شوید که شما انجام نمی کپی بیش از، در این مورد، طول بار، تعدادی از شخصیت های، به مقصد، این است که آرایه C. اما مشکل این است که آنچه اگر C به خودی خود به اندازه کافی بزرگ نیست که مسئولیت رسیدگی به که؟ شما در حال رفتن به کپی کردن تعداد کلمه در ادامه متن است که به شما داده شده ام. اما چه چیزی شما را در واقع بیشتر بایت از شما اتاق را برای؟ خوب، این برنامه بسیار احمقانه فقط در کورکورانه درآمد حاصل را به هر آنچه در آن است داده می شود، سلام بک اسلش 0 بزرگ اگر رشته کوتاه است به اندازه کافی، مانند پنج کاراکتر. اما اگر آن را در واقع 12 کاراکتر یا 1،200 کاراکتر، ما هم گذشته را دیدم که شما فقط رفتن به طور کامل بازنویسی حافظه که به تو تعلق ندارد. و بدترین حالت، اگر شما بازنویسی که بخش قرمز وجود دارد که ما به نام بازگشت آدرس - این است که در آن کامپیوتر به صورت خودکار، برای شما، در پشت صحنه، tucks دور یک مقدار 32 بیتی است که آن را به چه آدرس آن را باید به یاد بازگشت زمانی که تولی، این تابع دیگر، انجام شده است اجرا. این خرده های نانی از انواع که به آن برمی گرداند. اگر شما بازنویسی که به طور بالقوه، اگر شما پسر بد هستید، می تواند می تواند به طور بالقوه سر می برد کامپیوتر کسی. و شما قطعا سقوط آن را در اکثر موارد. در حال حاضر این مشکل فقط تشدید شد همانطور که ما شروع به صحبت کردن در مورد حافظه مدیریت به طور کلی. و malloc برای تخصیص حافظه است، تابع است که ما می توانیم با استفاده از به اختصاص حافظه زمانی که ما را در پیشبرد دانم که که ما ممکن است برخی از نیاز. بنابراین، برای مثال، اگر من به عقب برگردید به لوازم در اینجا. و من باز کردن از آخرین باری hello2.c، یاد این برنامه در اینجا، که نگاه چیزی کمی شبیه به این، فقط سه خط - نام خود را، پس از آن نام رشته، دولت در سمت چپ، برابر getstring است. و سپس ما آن را چاپ، نام کاربر. بنابراین این یک برنامه فوق العاده ساده بود. برای روشن، اجازه دهید من جلو بروید و سلام-2. من قصد دارم برای انجام نقطه علامت ممیز خوش آمدید 2. دولت نام خود را - دیوید. را وارد کنید. سلام دیوید. به نظر می رسد به کار خوب. اما آنچه که واقعا در رفتن در زیر کاپوت اینجا؟ اول اجازه دهید به پوست پشت برخی از لایه های. رشته فقط یک مترادف ایم تحقق برای چه؟ ستاره چار. پس آن را کمی بیشتر محرمانه را بگذارید اما بیشتر از لحاظ فنی درست است که این یک ستاره کاراکتر، که بدان معنی است که نام، بله، متغیر است. اما آنچه نام فروشگاه آدرس کاراکتر، که احساس کمی عجیب و غریب است چون من گرفتن یک رشته. من از برگشت های متعدد کاراکتر یک کاراکتر. اما البته، شما فقط برای اولین بار نیاز آدرس کاراکتر به یاد داشته باشید که در آن تمام رشته است، زیرا چرا؟ چگونه می توانم به شما از شکل که در آن پایان رشته دانستن آغاز؟ بک اسلش صفر. بنابراین با این دو سرنخ را کشف کردن قبل از شروع و پایان هر رشته هستند، تا زمانی که آنها به درستی که با تهی تشکیل نابودگر، که اسلش صفر. اما این تماس getstring. و معلوم است که getstring تمام این مدت بوده است نوع تقلب برای ما. انجام شده است، تا مطمئن شوید این کار، گرفتن یک رشته از کاربر. اما در جایی که حافظه از آینده؟ اگر ما به عقب برویم به تصویر و اعمال تعریف از تنها لحظه ای پیش، که پشته است که در آن حافظه می رود زمانی که توابع نامیده می شوند، با این منطق، زمانی که با شما تماس getstring، و سپس من در تایپ D-A-V-I-D را وارد کنید، که در آن D-A-V-I-D بک اسلش صفر ذخیره می شود، بر اساس داستان ما به ما گفته ایم دور؟ به نظر می رسد در پشته، درست است؟ هنگامی که با شما تماس گرفتن رشته شما قطعه کمی از حافظه در پشته. پس از آن می ایستد به همین دلیل است که D-A-V-I-D بک اسلش صفر ذخیره شده است وجود دارد در پشته. اما صبر کنید یک دقیقه، getstring بازده این رشته، پس به صحبت می کنند، که به معنی سینی از کافه تریا گرفته شده است پشته. و ما گفت: در زمان گذشته است که به زودی به عنوان یک تابع برمی گرداند، و شما را که سینی، پس به صحبت می کنند، خارج از پشته، چه می تواند به شما در مورد باقی مانده از فرض که حافظه؟ من مرتب از آنها را به عنوان علامت سوال redrew زیرا آنها به طور موثر تبدیل ارزش های ناشناخته. می توان آنها را زمانی که برخی از مورد استفاده مجدد قرار تابع بعدی نامیده می شود. به عبارت دیگر، اگر ما اتفاق می افتد به ذخیره سازی - من یک عکس سریع خواهید در قرعه کشی در اینجا از پشته. اگر ما اتفاق می افتد را به رسم و پایین از بخش حافظه من، و ما می گویم که این محل از حافظه است اشغال شده توسط اصلی و شاید ارگ c و ارگ v و هر چیز دیگری در این برنامه، هنگامی که getstring نامیده می شود. احتمالا getstring می شود یک تکه از حافظه در اینجا. و سپس D-A-V-I-D هر طور شده به پایان می رسد تا در این تابع. و من قصد دارم به ساده. اما بیایید فرض کنیم که آن D-A-V-I-D بک اسلش صفر. بنابراین بسیاری از این بایت در استفاده می شود از قاب برای getstring. اما به محض به عنوان بازده getstring، ما گفت: آخرین باری که این حافظه بیش از در اینجا تمام می شود - woops! - تمام می شود به طور موثر پاک شده است. و ما می توانیم از این در حال حاضر به عنوان سوال فکر می کنم علائم به دلیل که می داند چه خبر است برای تبدیل شدن به آن حافظه است. در واقع، من بسیار اغلب عملکردهای تماس دیگر از getstring. و به محض این که من به برخی دیگر تابع از getstring است، شاید نه در برنامه های ویژه ما فقط نگاه اما برخی دیگر، قطعا برخی دیگر از تابع ممکن است در نهایت با توجه به این نقطه بعدی در پشته. بنابراین آن می تواند این باشد که فروشگاه های getstring D-A-V-I-D در پشته چون من بلافاصله پس از از دست دادن دسترسی به آن را. اما ما می دانیم که آنها getstring تنها می گرداند چه؟ آن را به بازگشت نیست من شش حرف. آنچه در آن است واقعا بازگشت بود نتیجه می گیریم زمان آخرین؟ آدرس اول. تا به نحوی، وقتی شما نام getstring، تخصیص یک تکه از حافظه رشته است که نوع و کاربران آدرس پس از بازگشت از آن. و معلوم است که هنگامی که شما می خواهید تابع برای تخصیص حافظه در این راه و بازگشت به فردی که به نام این تابع، آدرس که تکه حافظه، شما کاملا می توانید آن را در پشته قرار داده نشده پایین، به دلیل عملکرد آن را فقط رفتن به شما نمی شود بسیار سرعت، بنابراین شما احتمالا می توانید حدس بزنید که در آن احتمالا ما در حال رفتن به آن بازی شیر یا خط به جای آن، به اصطلاح پشته. بنابراین بین پایین از حافظه خود را طرح و بالا از حافظه خود را طرح یک دسته کامل از بخش. یکی از این پشته، و راست در بالای آن پشته است. و پشته فقط یک تکه مختلف حافظه است که برای توابع استفاده نمی زمانی که آنها نامیده می شود. آن را برای حافظه دراز مدت استفاده می شود، زمانی که شما می خواهید یک تابع برای گرفتن برخی از حافظه و قادر به چسبیدن به آن بدون از دست دادن کنترل بر آن. حالا شما می توانید شاید بلافاصله ببینید که این نیست لزوما یک طراحی کامل است. به عنوان برنامه خود را به حافظه اختصاص داده شده پشته، و یا به عنوان با شما تماس بیشتر و توابع بیشتری را، و یا به عنوان شما اختصاص حافظه در پشته با malloc به عنوان getstring انجام شده است، چه به وضوح به نظر می رسد مشکل اجتناب ناپذیر است؟ سمت راست. مانند این واقعیت است که این فلش در هر یک از دیگر اشاره به خوبی جواب نمی دهد. و در واقع، ما خیلی به سرعت می تواند سقوط یک برنامه در هر تعداد از راه. در واقع، من فکر می کنم ما ممکن است این به طور تصادفی یک بار انجام می شود. یا اگر نه، بیایید آن را انجام دهد. عمدا در حال حاضر. اجازه دهید من جلو بروید و نوشتن فوق العاده به سرعت برنامه به نام dontdothis.c. و در حال حاضر من در اینجا بروید و انجام تیز عبارتند از: stdio.h. اجازه دهید اعلام تابع تولی طول می کشد بدون آرگومان است، که نیز از درجه اعتبار ساقط می شود. و تنها چیزی که تولی رفتن به انجام است تماس تولی، که احتمالا نه باهوش ترین ایده است، اما پس از آن می شود. گوش و حلق و از درجه اعتبار ساقط اصلی. در حال حاضر تنها چیزی که اصلی در حال رفتن است انجام دهیم این است تماس تولی نیز هست. و فقط برای ضربات، من قصد دارم به رفتن پیش رو در اینجا و می گویند چون printf "خوش آمدید از تولی. " OK را بزنید. بنابراین اگر من هر گونه اشتباه را ندارد، dontdothis نقطه بریده بریده. و اجازه دهید آن را در یک پنجره بزرگتر - نقطه اسلش dontdothis. بیا. اوه اوه. ظاهرا شما می توانید این کار را انجام دهند. لعنت. OK را بزنید. صبر کنید. ایستاده. آیا ما - ما آن را با استفاده. [آه] من می دانم، اما من فکر می کنم ما تنها حذف که. آه، آره. لعنت. حل این راب. چیست؟ این بسیار ساده است. بله، ما بهینه سازی خاموش است. خوب، ایستاده خداحافظ. حالا من احساس می کنم بهتر است. OK را بزنید. بسیار خوب. بنابراین کامپایل مجدد این - شما را dontdothis. شما ممکن است مجبور به تغییر نام این dothis.c در فقط یک لحظه. گرامی می رویم. متشکرم. OK را بزنید. بنابراین این واقعیت بود که من چاپ چیزی از واقع فقط کند کردن روند که توسط آن ما رسیده اند که نقطه. OK را بزنید. Phew! بنابراین چه چیزی است که در واقع در جریان است؟ دلیل وجود دارد، فقط به عنوان یک کنار، انجام هر کاری در شرایط ورودی و خروجی گرایش به آهسته چون شما برای نوشتن کاراکتر به صفحه نمایش، آن را به حرکت. بنابراین داستان کوتاه مدت، من تا به حال در واقع اتفاق افتاده است بسیار بی تاب است، ما باید این نتیجه نهایی نیز هست. حالا که من سوار از چاپ یو پی اس، ما آن را حق دور. پس چرا این اتفاق می افتد. خوب، توضیح ساده، البته، است که تولی احتمالا نباید شود که خود را. در حال حاضر در شرایط عمومی، این بازگشتی است. و ما فکر چند هفته پیش بازگشتی خوب است. بازگشت این راه جادویی است بیان خود را فوق العاده موجز. و آن را فقط کار می کند. اما یکی از ویژگی های کلیدی از همه وجود دارد برنامه های بازگشتی که ما صحبت کرده ام و نگاه تا کنون، که این بود که آنها تا به حال چه؟ مورد پایه، که برخی از سخت رمزی بود مورد است که در برخی از شرایط گفت: تولی است، که به وضوح را صدا نمی زنم نه اینجا. بنابراین آنچه که واقعا اتفاق می افتد در این تصویر؟ خوب، هنگامی که اصلی تماس تولی، می شود یک تکه از حافظه است. هنگامی که تولی خواستار تولی، از آن میشود یک تکه از حافظه است. هنگامی که تولی خواستار تولی، آن را می شود یک تکه است. این می شود یک تکه است. این می شود یک تکه است. از آنجا که تولی هرگز بازگشت. ما هرگز پاک کردن یکی از آن فریم از پشته. بنابراین ما از طریق دمیدن پشته، به ذکر است که می داند چه چیز دیگری، و ما در حال تجاوز از مرزهای ما به اصطلاح بخشی از حافظه است. خطا در تقسیم بندی نادرست. بنابراین راه حل وجود دارد واضح است که این کار را انجام نمی. اما مفهوم بزرگتر است که، بله، مطلقا برخی از محدودیت وجود دارد، حتی اگر آن را به خوبی تعریف نشده است، که چگونه بسیاری از توابع شما می توانید در تماس بگیرید برنامه، چند بار یک تابع می تواند خود تماس بگیرید. بنابراین حتی اگر ما را موعظه بازگشت به عنوان این چیزی که به طور بالقوه جادویی چند هفته پیش برای سیگما تابع، و هنگامی که ما داده ها ساختارها و CS50، خواهید دید که دیگر برنامه های کاربردی برای آن، آن را لزوما بهترین چیز. زیرا اگر تابع خود را خواند، خود را خواند، حتی اگر یک پایه وجود دارد مورد، اگر شما که به حالت پایه برخورد کند برای 1،000 تماس و یا 10،000 تماس، آن زمان شما ممکن است از اتاق خود را در به اصطلاح پشته و آمار برخی از بخش های دیگر از حافظه است. بنابراین آن را بیش از حد می باشد طراحی تجارت کردن بین ظرافت و بین نیرومندی خاص خود را پیاده سازی. بنابراین یکی دیگر از حرکت نزولی وجود دارد و یا مارپیچ دیگری به آنچه که ما انجام شده است تا کنون. هنگامی که من به نام getstring - اجازه دهید برگردم به خوش آمدید-2. توجه داشته باشید که من خواستار getstring، که بازگشت به یک آدرس. و ما امروز ادعا می کنند که آدرس از پشته. و در حال حاضر من چاپ رشته ای که در آن آدرس. اما ما هرگز به نام ام مقابل getstring. ما تا به حال هرگز به calll یک تابع مانند ungetstring، جایی که شما پشت دست که حافظه. اما رک و پوست کنده ما احتمالا باید بوده است. از آنجا که اگر ما در حفظ و پرسیدن از کامپیوتر برای حافظه، از طریق کسی مثل getstring اما هرگز آن را به عقب، قطعا که بیش از حد موظف است منجر به مشکلات به موجب آن ما اجرا از حافظه. و در واقع، ما می توانیم برای این نگاه مشکلات با ابزار جدید که استفاده از کمی مرموز به نوع است. اما اجازه دهید من جلو بروید و ترشح آن را بر روی صفحه نمایش فقط در یک لحظه. من قصد دارم به جلو بروید و اجرا Valgrind ها با پارامتر که اولین فرمان بحث خط نام که برنامه سلام-2. و متاسفانه به خروجی طرز فجیعی پیچیده بدون هیچ دلیل خوبی است. بنابراین ما تمام این ظروف سرباز یا مسافر را ببینید. دیوید نام من به دولت. به طوری که این برنامه در واقع در حال اجرا است. و در حال حاضر ما این خروجی دریافت کنید. بنابراین Valgrind مشابه در روح به GDB. این یک دیباگر فی نفسه نیست. اما این جستجوگر حافظه است. این برنامه ای است که خود را اجرا خواهد کرد برنامه ریزی و به شما بگویم اگر از شما خواسته کامپیوتر برای حافظه و هرگز آن را به دست پشت، در نتیجه به این معنی که شما باید نشت حافظه. و نشت حافظه تمایل به بد. و شما کاربران از کامپیوتر احتمالا این احساس، که آیا شما یک مک و یا کامپیوتر. آیا شما تا به حال کامپیوتر خود را برای استفاده از در حالی که راه اندازی دوباره (Reboot) اجرا نشده است و در چندین روز، و یا شما فقط رو بسیاری از برنامه های در حال اجرا، و چیز لعنتی به متوقف ساختن آسیاب را کند می کند، و یا حداقل آن فوق العاده آزار دهنده است استفاده کنید، زیرا همه چیز فقط آهسته فوق العاده. حالا که می تواند هر تعداد از دلایل. این می تواند یک حلقه بی نهایت، اشکال در کد کسی، و یا به سادگی بیشتر، از آن این معنی است که شما با استفاده از بیشتر حافظه، و یا تلاش برای از خود کامپیوتر واقع است. و شاید یک اشکال در برخی از برنامه وجود دارد که نگه داشتن درخواست برای حافظه. مرورگرهای وب برای سال برای بدنام بود این، درخواست برای حافظه بیشتر و بیشتر اما هرگز آن را توزیع. مطمئنا، اگر شما فقط یک محدود مقدار حافظه، شما نمی توانید بپرسید بسیاری از بی نهایت بار برای برخی از این حافظه. و بنابراین، آنچه که شما اینجا را ببینید، حتی اگر دوباره خروجی Valgrind است بی ارزش پیچیده به نگاه در برای اولین بار، این بخش جالب است. هیپ - در استفاده در خروج. بنابراین در اینجا چقدر حافظه بود در استفاده در پشته در زمان برنامه من خارج شد - ظاهرا شش بایت در یک بلوک. بنابراین من قصد دارم به موج تو دست من در چه بلوک است. فکر می کنم از آن است که فقط یک تکه، کلمه فنی برای تکه. اما شش بایت - شش بایت که چه هستند هنوز هم در حال استفاده بود؟ دقیقا. D-A-V-I-D بک اسلش صفر، پنج نامه نام علاوه نابودگر تهی. بنابراین این برنامه Valgrind می متوجه شد که من خواسته برای شش بایت، ظاهرا، با راه از getstring است، اما هرگز به آنها به عقب. و در واقع، این ممکن است باشد واضح است اگر برنامه من است سه خطوط، اما آن را به 300 خط است. بنابراین ما در واقع می توانید از دستور دیگری به من بدهید آرگومان خط به Valgrind آن را طولانی تر کند. این کمی آزار دهنده است به خاطر داشته باشید. اما اگر من - اجازه دهید را ببینید. نشت - بود آن را نشت - حتی من را به یاد داشته باشید آنچه در آن خاموش دست است. - چک نشت برابر. جهت مشاهده فرم خرید، از شما سپاسگزارم. - چک نشت برابر. را وارد کنید. همان برنامه در حال اجرا است. دیوید دوباره تایپ کنید. حالا من کمی جزئیات بیشتر را مشاهده کنید. اما در زیر خلاصه پشته، که یکسان است به چهار است - آه، این نوع از خوب است. در حال حاضر Valgrind است در واقع به دنبال کمی در کد من سخت تر است. و آن را گفت که، ظاهرا، malloc در خط - ما زوم کردن. در خط - ما نمی بینیم چه خط آن است. اما malloc مقصر اول است. یک وبلاگ در malloc وجود دارد. همه درست است؟ خوب، نه. درست است؟ من به نام getstring. getstring ظاهرا خواستار malloc. پس چه خط کد است ظاهرا در گسل برای داشتن اختصاص داده شده به این حافظه؟ بیایید فرض کنیم که هر کس malloc نوشت در اطراف به اندازه کافی بلند است که آن را تقصیر خود نیست. پس از آن احتمالا معدن. getstring در cs50.c - به طوری که در فایل در جایی بر روی کامپیوتر - در خط 286 به نظر می رسد مقصر است. حالا بیایید فرض کنیم که cs50 بوده است در اطراف مقدار مناسب و معقول از زمان، به طوری ما هم معصوم هستند. و پس از آن احتمالا در getstring که اشکال نهفته است، اما نه در خط سلام 2.c 18. بنابراین نگاهی به اجازه آنچه که خط 18 بود. آه. به نحوی این خط است و نه لزوما نوعی درشکه سبک یک اسبه، فی نفسه است، اما آن است که دلیل آن این است که در پشت نشت حافظه. بنابراین فوق العاده به سادگی، چه به طور مستقیم خواهد بود می شود راه حل در اینجا؟ اگر ما در حال درخواست برای حافظه، هرگز دادن آن را به عقب، و این که به نظر می رسد مشکل زیرا با گذشت زمان کامپیوتر من ممکن است از حافظه اجرا شود، ممکن است سرعت پایین، همه چیز بد ممکن است رخ دهد، به خوبی، چه راه حل ساده بصری است؟ فقط آن را به عقب می دهد. چگونه می توانم شما آزاد کردن که حافظه؟ خوب، خوشبختانه آن بسیار ساده است فقط می گویند نام رایگان است. و ما این کار را قبل از آن هرگز انجام داده ام. اما شما اساسا می توانید از فکر می کنم آزاد به عنوان مخالف malloc. رایگان مخالف است تخصیص حافظه. بنابراین در حال حاضر اجازه دهید من این کامپایل مجدد. اطمینان خوش آمدید-2. اجازه دهید دوباره آن را اجرا کنید. سلام 2 دیوید. بنابراین به نظر می رسد به کار در دقیقا به همان شیوه. اما اگر من به عقب برگردید به Valgrind و دوباره اجرا که همان دستور به تازگی من کامپایل برنامه، تایپ کردن به نام من به عنوان قبل از - خوب است. خلاصه هیپ - در استفاده در خروج - صفر بایت در بلوک های صفر. و این فوق العاده زیبا، همه بلوک های پشته آزاد شدند. بدون نشت امکان پذیر است. پس از بالا آمدن، نه با مشکل تنظیم 4، اما با مشکل تنظیم 5، پزشکی قانونی و بعد، این هم تبدیل خواهد شد اندازه گیری صحت خود را از برنامه، یا نه شما و یا نشت حافظه ندارد. اما خوشبختانه، نه تنها می تواند شما استدلال از طریق آنها به طور ذاتی، که است، مسلما، آسان برای برنامه های کوچک اما سخت تر برای برنامه های بزرگتر، Valgrind، برای کسانی که برنامه های بزرگتر، می تواند به شما کمک کند شناسایی مشکل خاص است. اما یک مشکل دیگر وجود دارد که ممکن است بوجود می آیند. اجازه بدهید من باز کردن این فایل در اینجا است که، دوباره، به عنوان مثال تا حدودی ساده است. اما اجازه تمرکز بر آنچه این برنامه می کند. این است که به نام memory.c. خواهیم این را امروز بعد از آن در ارسال پستی از کد منبع امروز. و متوجه شده که من آن را یک تابع به نام F است که بدون آرگومان و طول می کشد هیچ چیز را بر می گرداند. در خط 20، من ظاهرا اعلام اشاره گر به int و خواستار آن *. با من اختصاص بازگشت است ارزش malloc. و تنها به روشن، چگونه بسیاری از بایت AM من احتمالا از malloc در این وضعیت؟ احتمالا 40. از کجا می توانید دریافت کنید که از؟ خوب، اگر شما به یاد بیاورید که یک int است که اغلب 4 بایت، حداقل آن را در است لوازم خانگی، 10 برابر 4 است بدیهی است که 40. بنابراین malloc بازگشت آدرس یک تکه از حافظه و ذخیره سازی که آدرس در نهایت در x. بنابراین برای روشن، چه پس از آن اتفاق می افتد؟ خوب، اجازه دهید من تغییر دهید به تصویر ما اینجا. من نه فقط جلب پایین من حافظه کامپیوتر، به من اجازه رفتن به جلو و رسم مستطیل که نشان دهنده تمام حافظه من. ما می گویم که پشته در پایین است. و یک بخش متن وجود دارد در داده های مقدار دهی نکردن. اما من فقط رفتن به کسانی که انتزاعی چیزهای دیگر را به عنوان نقطه، نقطه نقطه دور. من فقط برای اشاره به این عنوان پشته در بالا. و سپس در پایین این تصویر، به نمایندگی اصلی، من قصد دارم به آن یک حافظه برش می دهد در پشته. برای F، من قصد دارم به آن یک تکه را حافظه در پشته. در حال حاضر، من به مشورت من کد منبع دوباره. متغیرهای محلی به صورت اصلی چه کسانی هستند؟ ظاهرا هیچ چیز، به طوری که برش می باشد به طور موثر خالی است و یا نه حتی به عنوان بزرگ که من آن را کشیده ام. اما در F، من یک متغیر محلی، است که X نامیده می شود. بنابراین من قصد دارم به جلو بروید و به F یک تکه از حافظه، خواستار آن *. و در حال حاضر malloc از 10 برابر 4، بنابراین: malloc 40، که در آن است که حافظه که از؟ ایم تصویر کشیده شده است پیش از این می خواهم. اما بیایید فرض کنیم که آن را به طور موثر از اینجا، بنابراین، دو، سه، چهار، پنج. و در حال حاضر من نیاز به 40 از این. بنابراین من فقط انجام نقطه، نقطه، نقطه نشان می دهد که حافظه و حتی بیشتر وجود دارد بازگشت از پشته. در حال حاضر آنچه به آدرس؟ بیایید دلخواه ما را انتخاب کنید رسیدگی به مانند همیشه - Ox123، حتی اگر آن را احتمالا رفتن به چیزی کاملا متفاوت. این آدرس اولین بایت در حافظه که من درخواست malloc برای. بنابراین در کوتاه مدت، یک بار خط 20 اجرا، آنچه که به معنای واقعی کلمه ذخیره شده در داخل از x در اینجا؟ Ox123. Ox123. و گاو غیر است. این فقط در اینجا این معنی است که عدد هگزادسیمال. اما آنچه کلیدی است که آنچه من فروشگاه در x، که یک متغیر محلی است. اما نوع داده آن، دوباره، یک آدرس از نوع int است. خوب، من قصد دارم برای ذخیره Ox123. اما باز هم، اگر که کمی بیش از حد پیچیده بی ارزش است، اگر من رفته به عقب، ما انتزاعی می تواند این دور کاملا منطقی و فقط می گویند که x اشاره گر به آن تکه از حافظه. OK را بزنید. حالا سوال در دست به شرح زیر است - خط 21، که معلوم است، نوعی درشکه سبک یک اسبه است. چرا؟ پوزش می طلبیم؟ ندارد - می گویند که یک بار دیگر. خوب، آن را آزاد نیست. به طوری که دوم. بنابراین یکی دیگر اما به طور خاص وجود دارد در خط 21. دقیقا. این خط کد ساده است که فقط یک سرریز بافر، تاخت و تاز بافر. بافر فقط به معنای یک تکه از حافظه است. اما این تکه از حافظه با اندازه 10، 10 اعداد صحیح، که این بدان معناست که اگر ما شاخص را در آن با استفاده از قند نحوی نماد آرایه، مربع براکت، دسترسی به شما * براکت 0 X براکت ها * 1، براکت نقطه، نقطه، نقطه. X براکت 9 یکی از بزرگترین است. بنابراین اگر من X براکت 10، که در آن من در واقع در حافظه؟ خب، اگر من باید 10 بین المللی - اجازه دهید در واقع تمام قرعه کشی از آنها را در اینجا. به طوری که پنج بود. در اینجا پنج نوع داده int دیگر است. بنابراین X براکت 0 است در اینجا. X براکت 1 اینجا. X براکت 9 است در اینجا. X براکت 10 است که در اینجا، که به معنی من گفتن، در خط 21، کامپیوتر برای قرار دادن شماره که در آن؟ عدد 0 که در آن؟ خوب، آن را 0، بله. اما فقط به این واقعیت که 0 آن نوع تصادف است. این می تواند تعداد 50، برای همه برای ما مهم است. اما ما در حال تلاش برای آن را در X براکت 10، که جایی است که این علامت سوال کشیده شده است، که چیز خوبی نیست. این برنامه ممکن است خیلی خوب سقوط به عنوان یک نتیجه. در حال حاضر، اجازه دهید به جلو بروید و ببینید که اگر این است، در واقع، چه اتفاقی می افتد. ساختن حافظه، از آنجایی که فایل نام memory.c. اجازه دهید به جلو و اجرا حافظه برنامه میباشد. بنابراین ما خوش شانس، در واقع، به نظر می رسد. ما خوش شانس کردم. اما اجازه دهید ببینیم که اگر ما در حال حاضر اجرای Valgrind. در نگاه اول، برنامه من ممکن است به نظر می رسد کاملا درست است. اما به من اجازه اجرا Valgrind با - چک نشت برابر کامل بر روی حافظه است. و در حال حاضر زمانی که من برای اجرای این - جالب است. نامعتبر ارسال از اندازه 4 در خط 21 از memory.c. خط 21 از memory.c به کدام یک است؟ آه، جالب. اما صبر کنید. حجم 4، این است که با اشاره به؟ من تنها یک ارسال اما آن را به اندازه 4. و چرا از آن است 4؟ به این دلیل است که آن را از نوع int، که ، دوباره، چهار بایت است. پس Valgrind یک اشکال که من، نظر اجمالی در کد من، نداشت. و شاید TF شما خواهد بود یا نه. چه و اما Valgrind برای مطمئن نشان داد که ما یک اشتباهی مرتکب شده اید، حتی اگر ما خوش شانس و کامپیوتر تصمیم گرفت، سوگند ملایمی، من قصد دارم به سقوط فقط به خاطر اینکه شما یک بایت، یک لمس ارزش اعضای هیات حافظه است که شما این کار را نکرد در واقع خود را. خوب، چه چیز دیگری در اینجا حشره دار است. آدرس - این دیوانه به دنبال آدرس می باشد در مبنای شانزده است. این حالت فقط بدان معناست جایی در پشته است صفر بایت بعد از یک بلوک از اندازه 40 اختصاص داده است. اجازه من زوم از اینجا و ببینید که اگر این است که کمی مفید تر است. جالب است. 40 بایت قطعا از دست داده است در کاهش رکورد 1 از 1. باز هم، کلمات بیشتری از اینجا مفید است. اما بر اساس خطوط برجسته، از کجا باید احتمالا تمرکز من توجه برای اشکال دیگر؟ به نظر می رسد مانند یک خط 20 memory.c،. بنابراین اگر ما به عقب برویم به 20 خط، که یکی که شما قبلا مشخص. و آن را لزوما نوعی درشکه سبک یک اسبه نیست. اما ما این معکوس اثرات آن است. پس چگونه می توانم حداقل درست یکی از کسانی که اشتباهات؟ بعد از خط 21 چه می توانم انجام دهم؟ من می توانم انجام رایگان *، پس به پس دادن آن حافظه. و چگونه می توانم این مشکل را حل کنم؟ من قطعا باید بروید دورتر از 0. بنابراین اجازه دهید من امتحان کنید و دوباره اجرای این. با عرض پوزش، قطعا دورتر از 9. اطمینان حافظه. اجازه دهید به من تکرار شده Valgrind در یک پنجره بزرگتر. و در حال حاضر نگاه کنید. خوب است. همه بلوک پشته آزاد شدند. بدون نشت امکان پذیر است. و بالاتر از اینجا، هیچ اشاره ای وجود دارد بیشتر از حق نامعتبر. فقط برای گرفتن حریص، و اجازه اگر یکی دیگر از تظاهرات (برام) می زنه نه به عنوان در نظر گرفته شده - من یک لحظه پیش خوش شانس دریافت کنید. و این واقعیت است که این 0 است که شاید بی ارزش گمراه کننده است. بیایید فقط 50، تا حدودی خودسرانه تعداد، حافظه حافظه بریده بریده نقطه - هنوز خوش شانس کنید. هیچ چیز را توفنده. فرض کنید من فقط چیزی واقعا احمقانه است، و من 100. اجازه دهید من بازسازی از حافظه، نقطه حافظه بریده بریده - دوباره خوش شانس. چگونه در حدود 1،000؟ نوع داده int فراتر از آن، تقریبا، جایی که من باید باشد؟ اطمینان حافظه - لعنت. [خنده حضار] OK را بزنید. اجازه دهید ظروف سرباز یا مسافر در اطراف دیگر. حافظه تکرار شده است. گرامی می رویم. بسیار خوب. بنابراین ظاهرا شما اول 100،000 نوع داده int فراتر از جایی که شما باید در آن قرار گرفته حافظه، همه چیز بد اتفاق می افتد. بنابراین این واضح است که نیست ، قانون سخت و سریع است. من نوع استفاده از آزمایش بود و خطا برای رسیدن به آنجا. اما دلیل این است که، داستان کوتاه مدت، حافظه کامپیوتر شما نیز تقسیم شده است به این چیزها به نام بخش. و گاهی اوقات، در واقع کامپیوتر به شما حافظه کمی بیشتر داده می شود از شما می پرسند. اما برای بهره وری، آن را تنها آسان تر به حافظه بیشتر اما فقط به شما بگویم که شما در حال گرفتن بخشی از آن را. و اگر شما خوش شانس گاهی اوقات، بنابراین، شما ممکن است قادر به لمس حافظه ای که به شما تعلق ندارند. شما هیچ تضمینی وجود ندارد که چه مقدار شما قرار داده وجود دارد باقی می ماند، زیرا کامپیوتر هنوز فکر می کند که این طور نیست مال شما، اما آن را لزوما نمی خواهید آمار بخش دیگری از حافظه در کامپیوتر و وادار به اشتباه مانند این یکی در اینجا. بسیار خوب. هر گونه سؤال و سپس در حافظه؟ بسیار خوب. اجازه دهید یک نگاهی از اینجا، و سپس، در چیزی است که ما برای گرفتن ام اعطا شده برای مدتی که در این فایلی به نام cs50.h. است بنابراین این یک فایل است. این فقط یک دسته کل از نظر تا بالا. و شما ممکن است در این اگر نگاه شما در اطراف دستگاه برخوردی خشن روبرو. اما معلوم است که در همه زمان ها، زمانی که ما استفاده می شود استفاده از رشته به عنوان یک مترادف، وسیله ای است که ما اعلام کرد که مترادف بود با این کلمه کلیدی typedef، برای تعریف نوع. و ما اساسا گفت، رشته مترادف برای ستاره کاراکتر. که وسیله ای است که پشته این چرخ آموزش شناخته شده به عنوان ایجاد رشته. حالا در اینجا فقط یک نمونه است برای getchar. ما ممکن است آن را قبل از دیده می شود، اما این در واقع آنچه در آن می کند. getchar بدون آرگومان طول می کشد، یک کاراکتر را بر می گرداند. getdouble بدون آرگومان طول می کشد، یک دو برابر می گرداند. getfloat بدون آرگومان، بازده طول می کشد شناور، و غیره. getint در اینجا این است. getlonglong در اینجا است. و getstring در اینجا است. و آن. این خط بنفش یکی دیگر از پیش پردازنده است بخشنامه به دلیل hashtag در آغاز از آن. بسیار خوب. بنابراین در حال حاضر اجازه دهید من به cs50.c. و ما نمی خواهد در این مورد صحبت کنید بیش از حد طولانی است. اما به شما یک نگاه اجمالی از آنچه به من بدهید شده است که در همه این زمان، اجازه دهید من برای رفتن - اجازه دهید انجام getchar. بنابراین getchar است که عمدتا نظر. اما آن را مانند این به نظر می رسد. بنابراین این عملکرد واقعی است getchar که ما بوده ام فرض میگیریم وجود دارد. و حتی اگر ما این یکی استفاده نکنید که اغلب، اگر تا کنون، حداقل نسبتا ساده است. بنابراین آن را ارزش مصرف نگاهی گذرا در اینجا. بنابراین getchar دارای یک حلقه بی نهایت، عمدا بنابراین ظاهرا. سپس آن را می نامد - و این نوع است استفاده مجدد از کد آرزومندیم ما خودمان را نوشت. در آن خواستار getstring. چون آنچه در آن می کند به معنای به دست آوردن یک کاراکتر؟ خوب، شما نیز ممکن است سعی کنید خط تمام متن از کاربر و پس از آن فقط در یک نگاه از کسانی که شخصیت. در خط 60، در اینجا یک کمی کمی سلامت عقل چک. در اگر getstring بازگشت تهی، اجازه دهید ادامه ندارد. چیزی را اشتباه رفت. در حال حاضر این است که تا حدودی آزار دهنده است، اما متعارف در C. کاراکتر حداکثر احتمالا نشان دهنده آنچه که فقط بر اساس نام خود را؟ این ثابت است. آن را مانند ارزش عددی بزرگترین کاراکتر شما می توانید با نشان دادن یک نیش می زنند، است که احتمالا تعداد 255، است که بزرگترین شماره شما نمایندگی هشت بیت، شروع از صفر است. بنابراین من استفاده از این، در این تابع، هنگامی که نوشتن این کد، فقط به این دلیل اگر چیزی را اشتباه می رود در getchar اما هدف خود را در زندگی این است برای بازگشت به کاراکتر، شما باید به نحوی قادر باشد به سیگنال به کاربر است که چیزی را اشتباه رفت. ما نمی توانیم تهی بازگشت. به نظر می رسد که یک اشاره گر تهی است. و دوباره، getchar برای بازگشت به کاراکتر. بنابراین این کنوانسیون، اگر چیزی می رود اشتباه است، شما، برنامه نویس، و یا در این مورد، من با کتابخانه، من تا به حال فقط تصمیم گیری خودسرانه، اگر چیزی را اشتباه می رود، من قصد دارم به بازگشت به شماره 255، است که واقعا معنی است که ما نمی توانیم، کاربر می تواند نوع شخصیت ارائه شده توسط شماره 255 از آنجا که ما تا به حال آن را سرقت به عنوان یک اصطلاح ارزش نگهبان نشان دادن یک مشکل. معلوم شد که شخصیت 255 چیزی است که شما می توانید در تایپ نیست صفحه کلید خود را، پس از آن هیچ معامله بزرگ است. کاربر متوجه نیست که من این شخصیت به سرقت رفته است. اما اگر شما همیشه در صفحات man را ببینید سیستم کامپیوتری برخی از اشاره به همه کلاه های ثابت مانند این که می گوید، در موارد از خطا این ممکن است ثابت برگردانده شود، که برخی از انسان بود سال پیش بود خودسرانه تصمیم گرفت بازگشت این مقدار ویژه و آن را ثابت در مورد چیزی را اشتباه می رود. در حال حاضر سحر و جادو اتفاق می افتد را در اینجا. اول، من اعلام کرد در خط 67 دو شخصیت، C1 و C2 است. و سپس در خط 68، در واقع وجود دارد یک خط از کد که یادآور دوستان ما چون printf، با توجه به این که آن اختصاص درصد حسابهای در نقل قول. اما متوجه آنچه در اینجا اتفاق می افتد. sscanf به معنای رشته اسکن است - معنی اسکن فرمت رشته، sscanf بنابر. به چه معنا است؟ این بدان معنی است شما عبور به sscanf یک رشته. و خط هر چه کاربر وارد شما از عبور از یک رشته فرمت مانند sscanf این است که scanf می گوید چه هستند شما امیدوار کاربر تا به تایپ شوید. بعد از آن شما عبور در آدرس دو تکه های حافظه، در این مورد، چون من دو متغیرهایی است. بنابراین من قصد دارم به آن آدرس می دهد از C1 و آدرس C2. و به یاد بیاورید که شما یک تابع را آدرس برخی از متغیر، چه مفهوم؟ چه کاری می توانید آن تابع به عنوان یک نتیجه انجام از دادن آن آدرس یک متغیر، به عنوان مخالف خود متغیر؟ می تواند آن را به سمت راست تغییر؟ اگر شما تا به حال کسی یک نقشه فیزیکی آدرس، آنها می توانند به آنجا بروند و انجام هر آنچه که آنها در آن آدرس می خواهید. ایده در اینجا همان. اگر ما به sscanf، آدرس دو عبور تکه های حافظه، حتی این کوچک تکه های کمی از حافظه، C1 و C2، اما ما آن را آدرس آنها بگویید، sscanf می توانید آن را تغییر دهید. بنابراین هدف sscanf در زندگی، اگر ما به عنوان خوانده شده صفحه مرد، به خواندن آنچه کاربر تایپ، امید برای داشتن کاربر تایپ شده در یک شخصیت و شاید یکی دیگر از شخصیت، و هر کاربر تایپ، شخصیت اول می رود در اینجا، شخصیت دوم در اینجا می رود. در حال حاضر، به عنوان یک کنار، این، و شما می توانید تنها این از اسناد می دانم، این واقعیت که من قرار دادن یک فضای خالی وجود دارد فقط بدان معنی است که من اهمیتی نمی دهند اگر کاربر بازدید نوار فضایی چند بار قبل از او طول می کشد شخصیت، من قصد دارم به چشم پوشی از هر فضای سفید است. به طوری که من می دانم اسناد. این واقعیت است که٪ دوم ج وجود دارد به دنبال فضای سفید است که در واقع عمدی. من می خواهم که قادر به تشخیص در صورتی که کاربر پیچ و یا عدم همکاری نیست. بنابراین من به امید که کاربر در تایپ در یکی از شخصیت ها، بنابراین من امیدوار است که sscanf فقط رفتن برای بازگشت به ارزش 1 به دلیل، دوباره، اگر من خواندن اسناد و مدارک، هدف sscanf در زندگی این است که بازگشت به تعداد متغیرهایی که پر شدند با ورودی کاربر. من در دو متغیر گذشت آدرس، C1 و C2. من امیدوار هستم، هر چند، که تنها یکی از آنها کشته می شود، زیرا اگر sscanf بازده 2، چه احتمالا مفهوم منطقی است؟ که کاربر نمی فقط به من یک شخصیت مانند من به او گفتم یا او. آنها احتمالا در تایپ حداقل دو شخصیت. بنابراین اگر من به جای دوم ندارد ٪ C، من فقط به حال یک، که رک و پوست کنده خواهد بود بیشتر بصری رویکرد، من فکر می کنم نگاه اول شما نمی خواهید به قادر به تشخیص در صورتی که کاربر شده است به شما بیشتر ورودی از شما در واقع می خواستم. بنابراین این فرم ضمنی است چک کردن خطا. اما متوجه آنچه من در اینجا. هنگامی که من مطمئن هستم که کاربر به من یکی هستم شخصیت، من آزاد کردن خط، انجام در مقابل getstring، که به نوبه خود با استفاده از malloc، و سپس بازگشت من C1، شخصیت که من امیدوار است کاربر ارائه و فقط ارائه شده است. بنابراین سریع را دیدم، اما هر گونه سوال در getchar؟ ما به برخی از دیگران می گردد. خوب، اجازه دهید من جلو بروید و این کار را - فرض کنید در حال حاضر، فقط برای ایجاد انگیزه ما بحث در هفته به علاوه زمان، این یک فایل به نام structs.h است. و دوباره، این فقط یک طعم از چیزی که در پیش روست. اما توجه کنید که بسیاری از این نظر است. پس به من اجازه برجسته تنها بخش جالب در حال حاضر. typedef - دوباره که همان کلمه کلیدی وجود دارد. typedef استفاده می کنیم برای اعلام رشته به عنوان یک نوع داده ویژه. شما می توانید typedef برای ایجاد نام تجاری جدید استفاده کنید انواع داده ها وجود نداشت هنگامی که C اختراع شد. به عنوان مثال، اعضای هیات همراه با C. کاراکتر همراه با C. دو می آید با C. اما هیچ اندیشه ای از یک دانش آموز وجود دارد. و در عین حال این امر می تواند بسیار مفید باشد قادر به نوشتن یک برنامه است که فروشگاه ها در یک متغیر، شماره شناسنامه دانش آموز، نام خود و خانه خود را. به عبارت دیگر، سه قطعه از داده ها، مانند int و رشته و رشته دیگر. با typedef، چه بسیار قدرتمند در مورد این و و sturct کلمه کلیدی برای ساختار، شما، برنامه نویس در سال 2013، در واقع می تواند خود را تعریف انواع داده ها که سال وجود ندارد پیش اما که متناسب با اهداف خود را. و بنابراین در اینجا، در خطوط 13 تا 19، ما در حال اعلام یک نوع داده جدید، مانند هوشمند، اما خواستار آن را دانش آموزان. و در داخل این متغیر در حال رفتن به سه چیز - بین المللی، یک رشته، و یک رشته. بنابراین شما می توانید از آنچه واقعا فکر می کنم در اینجا اتفاق افتاده است، حتی اگر این کمی ساده برای امروز، یک دانش آموز است که اساسا در حال رفتن است شبیه به این. خود را برای رفتن به یک تکه حافظه با یک ID به، نام زمینه و یک میدان خانه. و ما قادر خواهید بود به استفاده از آن تکه های حافظه و دسترسی به آنها به شرح زیر است. اگر من به struct0.c بروید، در اینجا یک نسبتا طولانی است، اما پس از الگو، از کد که با استفاده از این ترفند جدید است. پس اول، اجازه دهید توجه کنید. به قطعات جالب تا بالا. شارپ تعریف دانش آموزان 3، اعلام کرد ثابت نام دانش آموزان و اختصاص آن فردی را خودسرانه شماره 3، فقط بنابراین من باید سه دانش آموزان با استفاده از این برنامه در حال حاضر. در اینجا می آید بخش اصلی است. و توجه کنید، چگونه می توانم اعلام کنم مجموعه ای از دانش آموزان؟ خوب، من فقط استفاده از همان نحو. کلمه دانش آموز به وضوح جدید است. اما دانش آموز، کلاس، دانش آموزان براکت. بنابراین متاسفانه زیادی وجود دارد استفاده مجدد از شرایط اینجا. این فقط یک عدد است. پس این است که ضرب المثل مثل حکایت سه. کلاس تنها چیزی است که من می خواهم متغیر تماس بگیرید. من می توانم آن را به دانش آموزان تماس بگیرید. اما کلاس، این است که یک کلاس در شی گرا نوع جاوا از راه. این فقط یک کلاس از دانش آموزان است. و نوع داده ها از هر عنصر در آن آرایه دانش آموز است. پس این است که کمی متفاوت است و از گفتن چیزی شبیه به این، آن را فقط - من گفت: من سه دانشجو را و تماس که کلاس آرایه. بسیار خوب. حالا در اینجا یک حلقه چهار است. های آشنا این مرد - تکرار از صفر در دو تا سه. و در اینجا قطعه جدید از نحو است. این برنامه را به من بی درنگ، انسان، یک دانش آموز را به آن بدهد ID، که از نوع int است. و در اینجا به نحو که شما با آن می توانید این کارها را بکنید ذخیره چیزی در زمینه ID در محل کلاس براکت I. بنابراین این نحو است که جدید نیست. این حالت فقط بدان معناست هشتم را من دانش آموز در کلاس. اما این نماد جدید است. تا در حال حاضر، ایم می تواند نقطه استفاده نمی شود، حداقل در کد شبیه به این. این به این معنی به ساختار شناخته شده به عنوان یک دانش آموز قرار داده و چیزی وجود دارد. به طور مشابه، در این خط بعد، 31، پیش رو قرار داده و هر نوع کاربر برای یک نام در اینجا و چه آنها را برای انجام خانه، همین، پیش بروید و قرار داده و آن را در خانه. پس چه چیزی این برنامه در نهایت کاری انجام دهید؟ شما می توانید یک تیزر کمی وجود دارد را ببینید. اجازه دهید من به جلو و انجام ساخت ساختمانها 0 نقطه بریده بریده ساختار 0، شماره دانشجویی 1، می گویند دیوید ماتر، دانشجوی ID 2. راب مکتوب، دانشجوی ID 3. لورن Leverit - و تنها چیزی که این برنامه انجام داد، است که فقط به طور کامل خودسرانه، من می خواستم برای انجام کاری با این داده ها، در حال حاضر که من به ما آموخت که چگونه به استفاده از ساختمانها، من فقط به حال این حلقه اضافی در اینجا. من بیش از مجموعه ای از دانش آموزان تکرار شود. من استفاده می شود، دوست شاید در حال حاضر ما آشنا، رشته مقایسه، stircomp منزل دانش آموز 8TH در است برابر با ماتر؟ و اگر چنین است، تنها چیزی چاپ خودسرانه دوست، بله، آن هست. اما باز هم، فقط به من دادن فرصت برای استفاده و استفاده مجدد و استفاده مجدد از این نماد نقطه جدید. پس چه کسی اهمیت میدهد، درست است؟ آیند تا با یک برنامه دانشجویی است تا حدودی خودسرانه، اما معلوم است که ما می توانیم چیزهای مفید را با انجام این، برای مثال به شرح زیر است. این یک ساختار بسیار پیچیده تر است در C دوجین یا زمینه، تا حدودی نام cryptically. اما اگر شما تا کنون از گرافیک شنیده فرمت فایل به نام بیت مپ، BMP، نظر می رسد که فرمت فایل های بیت مپ تقریبا به نظر می رسد که این. این احمق کمی صورت لبخند است. این یک تصویر کوچک است که من در بزرگنمایی کرده ام بسیار بزرگ است به طوری که من می تواند هر کدام را ببینید از نقاط یا پیکسل های فردی. در حال حاضر، آن را تبدیل از ما می توانیم نمایندگی نقطه سیاه و سفید، می گویند، با عدد 0. و یک نقطه سفید با شماره 1. بنابراین به عبارت دیگر، اگر شما می خواهید را به منظور جلب چهره خندان و صرفه جویی در آن تصویر را در یک کامپیوتر، آن را کافی است برای ذخیره صفر و آنهایی که شبیه به این، که در آن، دوباره، آنهایی که سفید هستند و صفر سیاه و سفید هستند. و با هم، اگر شما به طور موثر اماده کردن و صفرها، شما باید شبکه پیکسل، و اگر شما از گواهانم. آنها را، شما باید ناز چهره لبخند کم است. در حال حاضر، فرمت فایل های بیت مپ، BMP، به طور موثر که در زیر هود، اما با پیکسل بیشتر SOT است که شما در واقع می تواند نشان دهنده رنگ. اما هنگامی که شما به پیچیده تر فرمت های فایل مانند BMP و JPEG و GIF که با آن شما ممکن است آشنا، کسانی فایل ها بر روی دیسک به طور معمول نه تنها صفر کرده اند و آنهایی که برای پیکسل، اما آنها برخی از ابرداده به عنوان - متا به این معنا است که واقعا نمی داده، اما آن را مفید داشته باشند. بنابراین این زمینه در اینجا دلالت، و ما این را در جزئیات بیشتر در P-مجموعه را ببینید 5، که قبل از صفر و آنهایی که نمایندگی پیکسل در یک تصویر، یک دسته از ابرداده وجود دارد مانند اندازه تصویر و عرض تصویر. و متوجه من برداشت برخی از چیزهای دلخواه در اینجا - عرض و ارتفاع. شمارش بیت و برخی از چیزهای دیگر است. بنابراین برخی از متا دیتا ها را در یک فایل وجود دارد. اما با درک چگونه فایل ها گذاشته در این راه، در واقع شما می توانید سپس دستکاری تصاویر، بازیابی تصاویر از دیسک، تغییر اندازه تصاویر. اما شما می توانید لزوما آنها را بهبود بخشید. من یک عکس مورد نیاز است. پس من رفتم به RJ در اینجا، کسی که تو را دیدم بر روی صفحه نمایش کاملا چند وقت پیش. و اگر من باز کردن کلیدی در اینجا، این است که چه اتفاقی می افتد اگر شما سعی می کنید به زوم در و افزایش RJ. او هیچ بهتر شدن نه واقعا. در حال حاضر کلیدی از نوع مات آن است کمی، فقط به بیش از براق واقعیت است که RJ نمی شود به خصوص افزایش یافته است هنگامی که شما زوم شوید. و اگر آن را در این راه، مربع را ببینید؟ آره، شما قطعا می توانید ببینید مربع در یک پروژکتور. این چیزی است که شما می توانید هنگامی که شما را در توسعه. اما در فهم اینکه چگونه RJ ما و یا صورت خندان پیاده سازی شده است به ما اجازه در واقع نوشتن کد که دستکاری این چیزها. و من فکر کردم من می خواهم در این یادداشت پایان، با 55 ثانیه از افزایش که، من به جرات می گویند و نه گمراه کننده است. [پخش ویدئو] او دروغ می گوید. درباره چه، من نمی دانم. پس چه می دانیم؟ که در ری Santoya 09:15 در ATM بود. بنابراین سوال این است او در 9:16 انجام شده است؟ تیراندازی نه میلی متر در چیزی. شاید او را دیدم تیرانداز از خفا. یا کار با او بود. ، صبر کنید. بازگشت به عقب. چه می بینید؟ چهره اش بیاورید، صفحه نمایش کامل. عینک او. وجود دارد یک انعکاس است. که تیم بیس بال Neuvitas است. که لوگوی خود است. و او به هر کس که صحبت با پوشیدن این ژاکت. [END پخش ویدئو] دیوید J. مالان: این مشکل تنظیم 5. ما شما را در هفته آینده را ببینید. SPEAKER مرد: در CS50 بعدی. [غوغای جیرجیرک] [پخش موسیقی]