[پخش موسیقی] دیوید J. مالان: کلیه حقوق این این CS50 است و این آغاز هفته پنج است. بنابراین، امروز، در زیر مخده شما، شما هر چیزی را پیدا کند. اما در بالا، شما باید این، نشانه کمی از قدردانی ما را برای تمام کاری که شما قرار داده به بازی از پانزده. به سادگی دایره کوچک حذف پایین به شروع بازی برای باقی مانده از کلاس. بنابراین به یاد بیاورید که، یا می دانم که مشکل چهار، که به بیرون رفت این آخر هفته، شامل نوشتن یکی دیگر از بازی. اما این بار آن را شامل با استفاده از رابط کاربر گرافیکی واقعی، نه رابط متنی مانند بازی از پانزده بود. و بازی نهفته است که پیش از شما، اگر شما دیده نشده است این بعد، به نظر می رسد یک چیزی کمی مانند این. من قصد دارم برای رفتن به ترمینال من پنجره در اینجا در GDB. و من قصد دارم به جلو بروید و اجرا راه حل کارکنان، که شما می توانید دسترسی پس از در حال اجرا به روز رسانی 50 به طور معمول. اما من قصد دارم آن را به کمی حالت مخفی، کمی تخم مرغ عید پاک، به اصطلاح حالت خدا، دادن خدا در argv1. و من باید به دنبال جهت های خود من، در حال اجرا آن را در خود من مجموعه دایرکتوری مشکل. بنابراین در حال حاضر نسخه کامل شما بازی برک آوت است. در واقع، این حالت بدون دست است. پس از آن در واقع - wowed هر چند شما ممکن است - بسیار پیش پا افتاده برای اجرای حالت خدا در برک آوت، بر خلاف بازی پانزده، که برخی از شما ممکن است پنجه برای نسخه هکر. در برک آوت آن را به خدا کافی است حالت به سادگی انجام چه، به طور مستقیم با دست و پا زدن؟ فقط آن را به هر آنچه که در برابر حالت افقی توپ. و تا زمانی که شما این کار را در قدم اهسته با توپ و میدان در حال حرکت این بازی خواهد شد هرگز، هرگز، هرگز توپ را از دست و شما در هر زمان پیروز شود. اما در نسخه هکر این هفته بیش از فقط خدا حالت وجود دارد. تعدادی از ویژگی های دیگر وجود دارد. در میان آنها، لیزر. به طوری که اگر شما واقعا بی تاب شما می توانید شروع به تیراندازی کردن آجر و چند نفر دیگر. و برای کسانی از شما که می خواهم مدرج استاندارد در برابر هکر نسخه، من می توانید ببینید که این هفته نسخه هکر عمدا کمی شدنی تر، می گویند، از خدا حالت بازی از پانزده بود. بنابراین اگر شما به دنبال یک کشش و شما به دنبال برخی از سرگرم کننده اضافی ویژگی های شیرجه رفتن در اگر از علاقه. در حال حاضر عملا بیشتر، اجازه دهید به من اشاره از یک چیز نیز هست. GDB، که برخی از شما ممکن است هنوز ندارد لمس شخصا، که خوب است. اما اکنون واقعا زمان به عادت به این و راحت با این ابزار به دلیل آن زندگی خود را بسیار آسان تر است، واقعا. میانگین پستها در طول سخنرانی راب در GDB یک زن و شوهر هفته پیش، به یاد که GDB دیباگر. این یک ابزاری است که به شما اجازه می دهد تا اجرا خود را برنامه اما اجرا آن را به گام، خط به گام خط، به طوری که شما می توانید به اطراف فشار با نوک انگشت، به طوری که شما همه چیز اتفاق می افتد، بنابراین که شما می توانید نسخه قابل چاپ کردن مقادیر متغیر. به طور خلاصه، آن را به شما می دهد خیلی بیشتر قدرت از printDef کند. حالا مسلما، رابط بسیار محرمانه است. سیاه و سفید رابط متنی در بیشتر قسمت ها. دستورات هستند تا حدودی دشوار است در ابتدا به یاد داشته باشید. اما حتی اگر آن را ممکن است شما را نصف یک ساعت، یک ساعت، برای قرار دادن آن در صف مقابل سرمایه گذاری از زمان را به آن، به من اعتماد کنند. بدیهی است تا پایان ترم آن را ذخیره کنید شما منظور از قدر بیشتر زمان از آن. بنابراین در اوایل هفته شیرجه شوید. و در نظر برک آوت، می دانم که شما می توانید این کار را انجام دهند تا زمانی که شما کد توزیع یا کد خود را در پیشرفت در دایرکتوری Pst4 شما. بدانید که شما می توانید از gdb اجرا / شکست. این است که برای باز کردن یک پنجره شبیه به این. اجازه دهید من خودم بیشتر به من بدهید یک پنجره ترمینال. و سپس آنچه من قصد دارم به جلو بروید و انجام دهید، آن را نه تنها آن را اجرا کنید. من قصد دارم برای اولین بار مجموعه ای از یک نقطه شکست به یاد بیاورید، که اجازه می دهد تا شما را به مکث اعدام در یک محل خاص است. فقط به نگه داشتن چیزهای کوچک و ساده من قصد دارم در شکستن خط اول فقط با تایپ کردن شماره یک. اجازه دهید من در واقع دوباره باز کردن این پنجره به دلیل آن را گرفتن کمی کوچک وجود دارد. پس چه من در حال حاضر برای انجام در اینجا اگر من باز کردن پنجره ترمینال من. بیا، در آنجا می رویم. بنابراین در حال حاضر اگر من برگردم به Dropbox به، Pst4 و اجرا از gdb / شکست را وارد کنید، توجه من قصد دارم برای شکستن یک تنظیم نقطه شکست در خط یک است. و در حال حاضر من قصد دارم به رفتن جلو و نوع اجرا شود. و هنگامی که من انجام دهید، متوجه هیچ چیز به نظر می رسد اتفاق می افتد. هیچ پاپ تا وجود دارد. هیچ گرافیکی وجود دارد رابط کاربر است. اما این قابل درک است زیرا من به معنای واقعی کلمه در خط یک در برنامه های من است. و توجه کنید که من به سرعت فرستاده ام، به طور خاص در حال حاضر به 62، چرا که همه مسائل در بالای این فایل است چیزهایی مثل نظرات و ثابت و از غیر مسائل در حال حاضر. بنابراین در حال حاضر من در داخل از اصلی هستم، به نظر می رسد، در خط 62. و این فقط توزیع کد، فراخوان. اگر این را به من باز با رفتن، به طور مشابه، به من قطره دایرکتوری کادر را به Pst4 از، به breakout.c. و اگر من پایین و پایین و پایین، و اجازه دهید من جلو بروید و روشن شماره خط من. چیزی که من خواهید دید، اگر من به پایین خط 62، دقیقا خط که ما در متوقف کرده ایم. بنابراین در اینجا این خط، 62، که در آن ما در مورد به هستید. بنابراین در حال حاضر در GDB، اگر من جلو بروید و تایپ در حال حاضر بعد، وارد آن را به اجرای این خط. و voila، در حال حاضر به اصطلاح پنجره گرم. اگر با چه GWindow آشنا است، نگران نباشید. تنظیمات شما را به آن معرفی، به عنوان همچنین تعدادی از فیلم های خرید جاسازی شده در تنظیمات. اما در حال حاضر اجازه دهید این کمی جالب تر است. اجازه بدهید من این پنجره حرکت می کند بیش از به سمت کمی. اجازه دهید کمی پنجره بزرگتر بنابراین من می توانید اطلاعات بیشتری را ببینید. و در حال حاضر اجازه دهید من جلو بروید و بعد دوباره. و آجر وجود دارد. اگر من از نوع بعد دوباره در حال حاضر من توپ را ببینید. و اگر من از نوع بعد دوباره در حال حاضر من از دست و پا زدن را ببینید. و خوشبختانه این نرمافزاری gedit نیست واقعا همکاری با نشان دادن من همه چیز من می خواهم. اما در حال حاضر اگر من بعد دوباره، بعد دوباره، من فقط هستم اعلام برخی از متغیرها. و من می توانم هر کس نسخه قابل چاپ از این بچه ها. آجر نسخه قابل چاپ، چاپ زندگی. و در حال حاضر اگر من همچنان به انجام بعد، توجه کنید که من خواهم بود در داخل حلقه است. اما این کد برای اجرای دقیقا همانطور که من انتظار دارم. بنابراین، هنگامی که من این تابع، صبر کنید کلیک کنید، آن را به انجام به معنای واقعی کلمه از آن که. بنابراین من به نظر می رسید به کنترل از دست داده اند بیش از برنامه است. GDB من دادن سریع دیگر نیست. اما نگران نباشید. برو به بازی من، جایی را کلیک کنید. و voila، در حال حاضر آن را به خط 86 درآمد حاصل. بنابراین دوباره، آن را ارزشمند، در نهایت، برای اشکال زدایی مشکلات. از آنجا که شما به معنای واقعی کلمه می تواند از طریق گام کد خود را، همه چیز نسخه قابل چاپ کردن و خیلی، زیاد است، بیشتر است. اما در حال حاضر، این ابزار به تنهایی باید به شما خیلی دور دریافت کنید. بنابراین ما، البته، در نظر گرفتن یک نگاه در گرافیک در حال حاضر، همه ناگهانی. و در حال حاضر جهان ما کوچک می شود جالب تر. و شما می دانید، شاید، از برخی از فیلم آنلاین که ما باید این شورت که شما تماشا کردم به عنوان بخشی از مجموعه مشکل. و آنها که به ضرب گلوله کشته شده است، به عمد، در برابر یک پس زمینه سفید. و برخی از آنها تدریس Fellows در طراحی برخی از متن در صفحه نمایش که تزیین شده در کنار آنها. اما البته، این است که همه جالب در دنیای واقعی. این فقط یک سالن سخنرانی با صفحه نمایش بزرگ سفید و پس زمینه. و تولید شگفت انگیز مرتب سازی بر تیم ما به همه چیز نگاه زیبا پس از این واقعیت برداشت یا بازفرستادن هر چیزی کار می کنیم و یا نمی خواهید. در حال حاضر فقط برای ایجاد انگیزه در این هفته واقعا، که در آن شما می توانید بروید، در نهایت، با علم کامپیوتر است. نه فقط پس از مشکل مجموعه چهار. اما بعد از دیگری یا کل برنامه درسی آن شگفت انگیز است آنچه شما می توانید این روزها در شرایط گرافیک به طور خاص. برخی از شما ممکن است را دیده اند، این جریان در اطراف آنلاین. اما من فکر کردم من می خواهم به شما نشان می دهد، فقط برای چند دقیقه، یک نگاه اجمالی از آنچه تکنولوژی کامپیوتر و چه CGI، گرافیک کامپیوتری می توانید این روز را انجام دهد با یک آهنگ آشنا و شاید فیلم. [MUSIC - LANA DEL RAY، "جوان و زیبا] SPEAKER 1: این فقط یک کمی شگفت انگیز است، شاید، فقط چگونه در همه جا حاضر - [تشویق حضار] SPEAKER 1: من فقط آن را دریافت. اما این واقعا شگفت انگیز است، من فکر می کنم، فقط چگونه نرم افزار در همه جا حاضر و کد و ابزار مانند این واقعا هستند. به طوری که طعم و مزه از جهت که در آن شما می توانید بروید. اوه، هیچ لوازم خانگی امروز است. خب، این زمان در واقع غم انگیز با توجه به نقطه من فقط سعی. همه حق است، پس اجازه دهید راه اندازی فیوژن دوباره. بعدا به من یادآوری. همه حق است، و شما باید ایمیل به عنوان یک کنار اگر شما گرفتن یک متوجه مانند آن. همه حق است، پس به یاد بیاورید که در هفته گذشته ما به پوست پشت این آغاز شده بعد از آن به عنوان رشته ای شناخته شده است. رشته نوع داده هایی را که به یاد می آورد اعلام شده در کتابخانه CS50. و آن را بخشی از چرخ آموزش آغاز خواهد شد که در حال حاضر خود را به پرواز. این یک مفهوم مفید در اوایل بود. اما در حال حاضر آن را برای دریافت بیشتر جالب و قوی تر برای در واقع می بینیم که در زیر هود، یک رشته است فقط آنچه، ما گفت؟ آره، پس از آن به اصطلاح کاراکتر *. و * بیانگر گزینه ای است که پاسخ دادن به که وجود دارد نوعی آدرس درگیر. و تا زمانی که به شما می گویند کاراکتر * شما فقط به این معنی یک متغیر است که نوع داده است اشاره گر در حال حاضر. این واقعیت است که ستاره وجود دارد فقط بدان معناست که شما اعلام به اصطلاح اشاره گر. و این اشاره گر به ظاهرا ذخیره آدرس، البته، یک کاراکتر. حالا چرا این حس را؟ خب، چه رشته ای است در زیر هود؟ خب، برای برخی از زمان گفته ایم که رشته زیر هود است فقط H-L-L-O، به عنوان مثال. اما ما در مورد این عنوان صحبت ، در اصل، یک آرایه. و سپس یک آرایه را نگاه کمی بیشتر شبیه به این، با هر یک از این گرفتن نیش. و سپس ما گفته ام که وجود دارد چیز خاصی در اینجا، : بک اسلش 0، یا نابودگر تهی. بنابراین تمام این مدت، این در اینجا یک رشته بوده است. اما در واقع، یک رشته است در واقع آدرس. و آدرس، همانطور که خواهیم دید، اغلب با 0x نمایش توسط کنوانسیون پیشوند. چه 0x نمایش به عنوان عملگر؟ آیا هر کسی می دانم؟ پس از آن فقط به معنی هگزادسیمال می باشد. بنابراین شما ممکن است به یاد بیاورید، در واقع، از PST 1، به اعتقاد من، یکی از گرم کردن در واقع در مورد خواسته نماد هگزادسیمال علاوه بر دودویی و دهدهی. و انگیزه در اینجا این است که با هگزادسیمال شما 16 ارقام در اختیار شما. 0، 1، 2، 3، 4، 5، 6، 7، 8، 9، به دنبال توسط A، B، C، D، E، F. و اگر شما تعداد دفعات مشاهده همه کسانی که تا، شما می توانید در مجموع 16. پس این است که در مقایسه با اعشاری، که در آن در حال حاضر 10 رقم، 0 الی نه. آن را در تضاد با باینری که در آن ما فقط 0 و 1. اما در پایان روز شما می توانید تنها نشان دادن اعداد مشابه، اما تا حدودی متفاوت است. و هگزادسیمال مشترک است چرا که به عنوان آن معلوم است - و ما این را ببینید بعد از آن در دوره - حتی هنگامی که ما برنامه نویسی وب در زمینه HTML و کد رنگ، هگزادسیمال خوب است. از آنجا که هر یک از رقم، معلوم است، نشان دهنده چهار بیت کاملا. پس از آن فقط نوع خطوط به سادگی همانطور که ما در نهایت خواهید دید. بنابراین این ممکن است Ox123 و یا چیزی مانند آن، دلالت 123 آدرس جایی درون من حافظه کامپیوتر است. اما البته، برخی از مشکلات بوجود می آیند به خاطر این اساسی پیاده سازی. به یاد بیاورید که من در زمان زخم زدن در اجرای یک تابع مانند این - مقایسه خط تیره نقطه 0 ج در هفته گذشته، که حتی اگر آن نگاه مانند آن بود حق، آن را به سادگی مقایسه نیست دو رشته صحیح می باشد. من دور انداخته ام، و من انداخته ام دور نظر فقط به تمرکز بر روی کد که مورد علاقه در اینجا. و آن را در رنگ قرمز به دلیل آن را نوعی درشکه سبک یک اسبه. به چه دلیل؟ خوب، در بالا وجود دارد وقتی که من اعلام کرد یک رشته، آنچه واقعا قرار بود در تاریخ در زیر هود؟ خوب، اجازه دهید من را به صفحه نمایش در اینجا و در قرعه کشی که. بنابراین من اعلام کرد، دوباره، GetString رشته s. بنابراین من قصد دارم به جلو بروید در حال حاضر و قرعه کشی ها برای آنچه که واقعا هست. این رفتن به یک مربع در اینجا. و من قصد دارم به ادعا که آن 32 بیت است. حداقل آن معمولا، حداقل در CS50 لوازم خانگی در بسیاری از کامپیوتر. من قصد دارم به آن تماس بگیرید. اما در حال حاضر به یاد بیاورید که ما نام GetString. بازده بنابراین GetString از، البته، یک رشته است. اگر نوع کاربر در ساعت-L-L-O را وارد کنید رشته سلام برگردانده می شود. و این رشته، همانطور که ما فقط گفت، به پایان می رسد تا جایی در حافظه کامپیوتر شما با یک بک اسلش 0 در پایان. من این کار را مانند آرایه قرعه کشی - یا بلوک به هم پیوسته از کاراکتر ها - که آن را در واقع است. و در حال حاضر، آنچه که GetString در واقع بازگشت؟ چه GetString بازگشت همه از این زمان؟ خوب، ما قبل می گویند، در هفته، این تابع یک رشته. اما از نظر فنی، چه GetString بازگشت ظاهرا؟ مخاطب: آدرس. SPEAKER 1: آدرس. به طور خاص آن را می گرداند آدرس نیش بسیار اول، هر آنچه در آن است. من فقط با استفاده از یک، دو، سه چون آن را راحت. این آدرس از اولین برمی گرداند شخصیت در رشته. و ما در هفته گذشته گفت که کافی است. از آنجا که ما همیشه می توانید شکل که در آن انتهای رشته فقط با تکرار بیش از آن، شاید، برای حلقه یا حلقه در حالی که یا چیزی شبیه به که، فقط به دنبال "بک اسلش 0"، شخصیت نگهبان خاص است. و سپس ما می دانیم که رشته اتفاق می افتد طول - در این مورد - پنج. بنابراین از لحاظ فنی آنچه GetString می کند است آن را می گرداند Ox123 در این مورد. و از لحاظ فنی آنچه پس از آن اتفاق می افتد که ما ذخیره، در داخل از بازدید کنندگان، Ox123. در پایان روز، حتی اگر این مفهوم جدید، اشاره گر ها، آنها فقط متغیر. اما آنها اتفاق می افتد برای ذخیره بیت که به نمایندگی جمعی آدرس. بنابراین از لحاظ فنی همه آنها می شود ذخیره شده در S Ox123 است. اما ما به عنوان انسان - از جمله امروز به بعد - واقعا نمی خواهید به مراقبت، به طور معمول، آنچه را که آدرس واقعی است برخی از تکه های حافظه. این فقط به سطح کم از جزئیات فکری جالب. بنابراین من قصد دارم برای خنثیسازی این. و به جای آن، سطح بالا، فقط می گویند که هنگامی که ما در حال صحبت کردن در مورد اشاره گر من قصد دارم فقط بیشتر جلب فلش کاربر پسند که انتقال همان ایده و خلاصه دور خاص از آنچه واقعی آدرس اساسی است. حال اگر ما به عقب برویم به کد، هفته گذشته اتفاق افتاده است اگر ما رشته T برابر GetString؟ خوب، اگر من دوباره، در سلام این بار من قصد دارم برای به دست آوردن تکه دیگری از حافظه است. H-E-L-L-O بک اسلش 0. اما از آنجا که من به نام GetString بار دوم - و من این را از نگاه می دانید کد منبع برای GetString - حتی هر چند آن را خاص، تصادفی که سلام بود تایپ در دو برابر، GetString نیست رفتن به تلاش برای بهینه سازی و هوشمندانه. این فقط رفتن به تکه دیگری از حافظه را از کامپیوتر است که رفتن به آدرس دیگری می باشد. بیایید خودسرانه فقط می گویند 456. و سپس آنچه در آن است به بازگشت؟ این رفتن به بازگشت 456 و ذخیره آن در تی. بنابراین چه چیزی است که واقعا در رفتن، در سمت چپ من تکه دیگر حافظه، 32 بیت به طور معمول. و در آن وجود دارد، برای رفتن Ox456. اما باز هم، من در این علاقه ای ندارند تعداد خاص دیگر. من فقط رفتن به انتزاعی رسم آن را به عنوان یک فلش. پس این است که در حال حاضر یک توضیح جدید. اما این ایده دقیقا همان است که است اتفاق می افتد تمام این مدت. و به این ترتیب دلیل پس از آن که اولین بار از این نسخه مقایسه حشره دار بود هفته گذشته این است که چرا؟ هنگامی که شما اگر S برابر برابر تی آنچه شما واقعا در زیر هود مقایسه شده است؟ شما در حال مقایسه آدرس. و فقط به طور مستقیم، به وضوح، Ox123 است که نمی به برابر Ox456. این اعداد، این بیت فقط متفاوت است. و بنابراین، به طور مداوم، در هفته گذشته گفت: شما چیزهای مختلفی را تایپ کنید، حتی اگر کلمات کلمه به کلمه مشابه بود. بنابراین ما این مسئله را حل. در شرایط خارج از حرفه یا فن خاصی است، چه ثابت بود؟ مخاطبان: استفاده از یک تابع. SPEAKER 1: استفاده از یک تابع. یا ستاره ها قطعا درگیر، اما استفاده از یک تابع برای انجام چه؟ مخاطبان: برای مقایسه رشته ها. SPEAKER 1: مقایسه رشته ها. بنابراین مشکل اساسی در اینجا این بود که من فقط با توجه به در کیفیت رشته تعریف شود مقایسه آدرس خود را. و بدیهی است که فقط گنگ در حال حاضر یک بار شما را در درک چه خبر در زیر هود. واقعا به رشته مقایسه کنید تا ببینید آنها در راه است که یک انسان برابر در نظر گرفتن دو رشته برابر ما نیاز به مقایسه آنها شخصیت شخصیت برای شخصیت. حالا من می توانستم انجام می شود به این tediously. اما آشنا، ما با استفاده از حلقه for. و فقط مقایسه براکت ها من در برابر T براکت من. براکت من به علاوه 1 در برابر تی براکت من به علاوه 1، و غیره، در داخل نوعی از حلقه. و اگر من نقطه هر دو شخصیت که متفاوت است، یا اگر من می دانم که اوه، است کوتاه تر از تی یا بیشتر از t من بلافاصله می گویند نادرست، آنها یکسان نیست. اما اگر من را از طریق S و T و می گویند همان، همان، همان، همان، همان، پایان هر دو رشته، می توانم بگویم درست است، آنها با هم برابرند. خوب، خوشبختانه، سال ها پیش کسی که کد را برای ما نوشت. و آنها آن را به نام StrComp برای مقایسه رشته. و حتی اگر آن را کمی شمارنده بصری، StrComp 0 را برمی گرداند اگر آن دو رشته، S و T یکسان هستند. اما این ارزش منفی می گرداند اگر باید قبل از آزمون t بر اساس حروف الفبا آمده است و یا ارزش مثبت است اگر آن را باید آمد از t بر اساس حروف الفبا. بنابراین اگر شما همیشه می خواهید به مرتب کردن بر اساس چیزی، به آن معلوم که StrComp مفید است. از آنجا که آن را نه تنها می گویند آری یا نه، است مساوی یا نه. این به شما می دهد حس سفارش می خواهم یک فرهنگ لغت ممکن است. بنابراین StrComp، کاما T برابر برابر 0 به این معنی که رشته ها واقعا برابر است. چرا که هر کس این تابع نوشت سال پیش احتمالا برای حلقه استفاده می شود و یا یک حلقه یا چیزی شبیه به آن به ادغام بیش از شخصیت های دوباره و دوباره و دوباره. اما دو مشکل اینجا به وجود آمد. این copy0.c بود. و دو در قرمز است چون آن ناقص است. و چه کار می کنیم به اینجا؟ خب، اول من به نام GetString. و من مقدار بازگشتی در ثانیه ذخیره می شود. به طوری که تقریبا همان این قسمت بالای تصویر. اما آنچه پس از آن می آید؟ خوب، اجازه دهید من جلو بروید و خلاص شدن از شر یک دسته کامل از این. ما در زمان به جایی که ما فقط عقب ، که در حال حاضر سازگار با خط تا یکی وجود دارد. چک کنم. اگر برابر برابر 0 است. در حال حاضر، سمت توجه داشته باشید سریع، زمانی که ممکن است GetString بازگشت 0 حافظه به اندازه کافی وجود ندارد. درست است؟ این نادر است که این اتفاق خواهد افتاد، مطمئنا در یک کامپیوتر است که صدها مگ یا حتی کنسرتهایی رم. اما آن می تواند، در تئوری، بازگشت 0، به خصوص اگر کاربر اختصاص همکاری نمی کنند. راه برای وانمود مثل شما ندارد وجود دارد هر چیزی ورودی و ترفند GetString به بازگشت 0 به طور موثر. پس از آن که تیک بزنید. از آنجا که اگر هر کدام از شما شروع کرده اند ، در حال حاضر، گسل تقسیم بندی - است که احتمالا یک منبع برخی از سرخوردگی - کسانی که تقریبا همیشه نتیجه حافظه مربوط به خطا. به نحوی شما با توجه به messed تا اشاره گر، حتی اگر شما را درک نمی کنند یک اشاره گر وجود دارد. بنابراین شما ممکن است ناشی از تقسیم بندی گسل به عنوان اوایل به عنوان یکی هفته با استفاده از چیزی شبیه به یک حلقه و یا در حالی که حلقه و یک آرایه با رفتن بیش از حد گذشته از مرزهای برخی از آرایه که شما در هفته دو اعلام کرد، خاص است. شما ممکن است آن را حتی در مشکل انجام می شود مجموعه چهار با برک آوت. حتی اگر شما را دیده اند، نیست. هر ستاره در کد توزیع برک آوت، معلوم است که کسانی که GRect و چنین چیزهایی GOval و دیگر، کسانی که در واقع اشاره گر در زیر هود. اما استنفورد، مانند ما، مرتب از پوست که جزئیات حداقل برای کتابخانه اهداف، بسیار شبیه ما انجام می دهیم رشته و کاراکتر *. اما GRect و GOval و همه کسانی که چیزهایی که شما بچه ها هستند و یا خواهد شد با استفاده از این هفته در نهایت آدرس های حافظه. شما فقط آن را نمیدانید. بنابراین تعجب آور نیست پس از آن، شاید، که شما ممکن است سفر بیش از برخی گسل تقسیم بندی. اما آنچه جالب است در اینجا در حال حاضر، اگر پس از 0 کار می کنیم چک می کنیم رشته T می شود. خوب، اجازه دهید من اعلام تی. من قصد دارم آن را به عنوان یک مربع قرعه کشی، 32 بیت، آن تی تماس بگیرید. و سپس من قصد دارم انجام می شود. خوب، به چه معنا است؟ خوب، آن را کمی سخت به فکر می کنم در مورد آن تصویر عاقلانه. اما اجازه دهید فکر می کنم در مورد چه داخل از x؟ آنچه به معنای واقعی کلمه در داخل این متغیر؟ ارزش Ox123. بنابراین، هنگامی که من می گویم تی رشته می شود، که فقط به معنای واقعی کلمه به معنی گرفتن تعداد در، است که Ox123 و قرار داده Ox123. یا pictorially، اگر نوع من انتزاعی دور از آن جزئیات آن است که اثر به معنای واقعی کلمه کار این عنوان است. بنابراین در حال حاضر، فکر می کنم به هفته گذشته ما اقدام به سرمایه داری T. I انجام T براکت 0. خب، تی براکت 0، حتی اگر آن را اشاره گر، شما می توانید آن را به عنوان اینکه درمان یک آرایه، با یک مربع نماد براکت. تا جایی که T براکت 0 است؟ خوب، آن ساعت است. و تا زمانی که استفاده می کنیم که خط از کد، دو فوقانی، است که در که type.h ج فایل هدر، که در آن آن را اعلام کرد. شما در حال سرمایه گذاری این H. اما البته، که ساعت دقیق همان است که در داخل از بازدید کنندگان، پس به صحبت می کنند. و بنابراین در حال حاضر شما را تغییر و یا با حروف بزرگ هر دو اصلی و به اصطلاح کپی کنید. از آنجا که شما یک نسخه از آن در را ندارد راهی است که یک انسان می خواهم آن را به. بنابراین چه چیزی را ثابت در اینجا بود، در هفته گذشته copy1.c؟ توابع، بنابراین ما در واقع می تواند کپی رشته. و اساسا، آنچه که ما نیاز به به منظور کپی کردن رشته کاری انجام دهید؟ خوب، در این نسخه سبز در اینجا من رفتن آن را به سطح نسبتا کم انجام دهد. در واقع توابع وجود دارد. آنها می توانند با این کمک کند. اما یکی از اساسی ترین و بیشترین یکی از آشنا، حداقل، به زودی خواهد شد برای ما آشنا است، به شرح زیر است - تا یکی در خط اول کد را در سبز در حال حاضر. من فقط بازنویسی به عنوان کاراکتر *. هیچ عملکردی وجود دارد تفاوت وجود دارد. من فقط انداخت دور کتابخانه CS50 و من آن را خواستار آنچه در آن است، کاراکتر *. در حال حاضر نقطه، نقطه، نقطه، به دلیل وجود داشت برخی از چک کردن خطا که نیست جالب به بحث در مورد دوباره. بنابراین در حال حاضر اعلام شده است. این هم یک کاراکتر * می باشد. بنابراین من یک مربع کوچک را به خود جلب کرد صفحه نمایش مانند قبل. اما در سمت راست، malloc، ما گفت: حافظه اختصاص دهد. بنابراین برخی از تکه های حافظه اختصاص دهد. و چگونه بسیاری از بایت آیا ما در واقع می خواهم برای تخصیص، آن را به نظر می رسد؟ خوب، طول رشته ها. بنابراین اگر این سلام که رفتن به پنج. ما می گویم H-E-L-L-O. بنابراین پنج کلمه در ادامه متن. اما پس از آن به علاوه 1، چرا 1؟ 0 کاراکتر است. اگر ما اتاق را برای این پسر را ترک نمی کند ما ممکن است به طور تصادفی ایجاد یک وضعیت که در آن رشته است H-E-L-L-Ø. و سپس GetString زمان بعدی نامیده می شود و من در نوع، به عنوان مثال، دیوید، D-V-I-D، کامپیوتر در حال رفتن است فکر می کنم که بازدید کنندگان است که در واقع H-L-L-O-D-A-V-I-D به دلیل وجود دارد شکستن در بین این کلمات. بنابراین ما نیاز داریم که استراحت. بنابراین ما پنج را نمی خواهم. ما می خواهیم شش بایت. و بایت می گویند. اما این اندازه واقعا زمان کاراکتر است. مشخصات فنی کاراکتر است تقریبا همیشه یک بایت. اما فقط به کد های قابل حمل، پس به صحبت می کنند، به طوری که آن را در کار می کند کامپیوترهای مختلف حتی اگر آنها ممکن است تا حدودی متفاوت زیر هود، من قصد دارم به عام اندازه می گویند کاراکتر به طوری که کد من همیشه کار می کنند. و من لازم نیست که آن را کامپایل مجدد فقط چرا کامپیوتر من من ارتقاء و یا استفاده از برخی از پلت فرم های مختلف. بنابراین من 6 بار اندازه کاراکتر، که اتفاق می افتد به 1. بنابراین این بدان معناست که malloc می تواند من شش بایت می دهد. که در واقع انجام این کار چیست؟ خوب، اجازه دهید به عقب در زمان در اینجا به جایی که ما در داستان هستند. بنابراین اگر برگردم اینجا، من اعلام کرده ام کاراکتر * به نام تی. من در حال حاضر به نام malloc به مدت شش بایت. و در حال حاضر من قصد دارم به رسم آن شش بایت درست مثل آرایه زودتر. اما من واقعا نمی دانم چه در داخل این آرایه است. اگر شما به حافظه اختصاص دهد معلوم است که شما نمی توانید به اعتماد که برخی از ارزش شناخته شده وجود دارد. این می توانست چیزی استفاده می شود دیگری، برخی از عملکرد های دیگر، برخی دیگر خط از کد که شما نوشت. بنابراین ما به طور کلی باید این زباله ها تماس بگیرید ارزش ها و رسم آنها، شاید، به عنوان علامت سوال، فقط نشان می دهد که ما نمی دانم چه در واقع وجود دارد. و هیچ معامله بزرگ است تا زمانی که ما به اندازه کافی هوشمند به بازنویسی آن هستند ارزش زباله با اعداد و یا کاراکتر است که ما در مورد مراقبت. بنابراین در این مورد چه هستم من کاری انجام دهید؟ خوب، خط من از کد بعد، من چهار. اعضای هیات من 0، N می شود طول رشته از بازدید کنندگان. بنابراین آشنا برای حلقه. من کمتر یا مساوی به n، که معمولا بالا است. اما این بار آن را عمدی می باشد. من + +، و سپس من به سادگی انجام براکت تی من می شود. از آنجا که عکس من به نظر می رسد شبیه به این در این لحظه، ذخیره شده در تی است آدرس که تکه تصادفی از حافظه ارزش ها که ناشناخته است. اما به زودی به عنوان من تی براکت 0 که من در اینجا قرار می دهد. و چه به پایان می رسد تا کشیده شدن وجود دارد؟ ما تا پایان دادن به h. چرا که آنچه در براکت 0. و سپس همان چیز را برای الکترونیکی، و ل، و ل، و Ø. N، چرا من بالا برود از طریق برابر با N؟ از آنجا که از 0 کاراکتر است. بنابراین فقط به روشن، و سپس، اگر من در واقع پاک کردن هر چه این زباله ها ارزشها اختلاف دارند و پس از آن در واقع در قرعه کشی من آنچه که انتظار می رود، این است که براکت 1، 2، 3، 4، به علاوه که عقبی شخصیت جدید. و بنابراین در حال حاضر اگر ما گذشته نقطه ادامه داد: نقطه، نقطه در این نسخه صحیح و با حروف بزرگ براکت تی 0 من، البته، سرمایه گذاری فقط در این پسر در اینجا، که مفهومی، در نهایت هدف. به طوری که تمام اشاره گر است. و شما شده است با استفاده از آنها برای هفته ها در حال حاضر در زمینه رشته. اما در زیر کاپوت آنها کمی پیچیده تر است. اما اگر شما در مورد آنها فکر می کنم در این شکل تصویری پیشنهاد می کنم که آنها احتمالا همه آنها به عنوان ترسناک نیست برای اولین بار ممکن است در نگاه اول به نظر می رسد، به خصوص با چنین نحو جدید. هر گونه سؤال در اشاره گر، رشته ها، و یا کاراکتر؟ آره؟ مخاطبان: آیا می توانم شما برگردید به [نامفهوم]؟ SPEAKER 1: مطمئنا. مخاطبان: پس چگونه خود را در آخر آمده خط، شما یک تی خط * ندارد * در خط؟ آیا شما با اشاره به - SPEAKER 1: آه، یک سوال واقعا خوب است. چرا من نمی * T و A * S؟ از آنجا که به طور خلاصه، در هفته گذشته، مانند ما مبادله تابع، من می گویند که زمانی که به شما باید یک اشاره گر وسیله که شما به آنجا که ما انجام داد فیزیکی بر روی صحنه، در واقع استفاده از عملگر ستاره. معلوم است که این مربع براکت نماد چیزی است که ما تماس بگیرید نحوی شکر، که فقط یک راه سکسی از گفت: نماد مختصر برای دقیقا همان چیزی است که شما توصیف. اما این کمی بصری تر است. و در خطر ابتلا ساخت این بیشتر به نظر می رسد پیچیده تر از آن نیاز به، آنچه واقعا در اینجا به شرح زیر است - اگر من می گویم * T که به معنی به آدرس ذخیره شده در تی. تا به معنای واقعی کلمه، اگر t ذخیره سازی آدرس که در ساعت در ابتدا، * T به این معناست بروید. در حال حاضر، چه تی براکت 0 چیست؟ همان چیزی دقیق. این فقط یک کاربر کمی بیشتر دوستانه به نوشتن. اما من انجام نشده است. من فقط نمی توانم بگویم * تی می شود *. از آنجا که آنچه که من انجام می شود و سپس؟ من می خواهم قرار دادن ساعت، ساعت، ساعت، ساعت، ساعت در طول همه چیز. درست است؟ از آنجا که * تی است به آدرس در تی. اما ما در داخل یک حلقه هستیم. و ارزش من افزایش، البته، در هر تکرار؟ من. اما فرصت وجود دارد در اینجا، درست است؟ حتی اگر این احساس مانند آن را گرفتن کمی پیچیده تر است از نماد براکت مربع ما برای برخی از زمان استفاده کرده ایم - اجازه من تغییر H من خنثیسازی وجود دارد - حتی اگر این در حال حاضر کمی خیال باف، ایده اصلی، اگر * یعنی در اینجا و تی * فقط به آدرس در تی بروید. اما آنچه که آدرس در تی بود؟ تعداد نگه می داریم با استفاده از؟ مانند Ox456، اجازه دهید به ارمغان بیاورد که به عقب فقط به خاطر بحث. خوب، اگر من می خواهم به در الکترونیکی در تی رشته، من فقط می خواهم برای رفتن، در اصل، 456. و یا به جای، 457. من فقط نیاز به اضافه کردن یک. اما من می توانم انجام این کار، درست است؟ از آنجا که T، حتی اگر من در حفظ و طراحی آن را در حال حاضر به عنوان یک پیکان، آن را فقط یک تعداد، Ox456. و اگر من یکی به آن اضافه کنید، یا بیشتر به طور کلی، اگر من به که من می توانم اضافه کنم در واقع دقیقا همان جایی که من می خواهم. بنابراین اگر من در واقع این کار را - و این همان چیزی است که در حال حاضر به نام اشارهگر - من می توانم این خط حذف خواهد شد. است که، رک و پوست کنده، من فکر می کنم واضح تر و یک کاربر کمی بیشتر دوستانه را بخوانید. اما این کمتر از آن ندارد درست است. این خط از کد در حال حاضر با استفاده از ریاضی اشاره گر. این گفت: به آدرس زیر را - هر چه آغاز T است، که تی به علاوه من، که در ابتدا 0 است، که فوق العاده است. از آنجا که این بدان معناست که ابتدا از t به علاوه 1 به علاوه 2، به علاوه 3، و غیره. و همان معامله با بازدید کنندگان. قند پس نحوی برای این. اما درک آنچه که واقعا در رفتن در زیر هود، من استدلال می کنند، است که در واقع به خودی خود مفید است. از آنجا که آن را به معنی در حال حاضر وجود ندارد سحر و جادو بیشتری در زیر هود. وجود دارد نخواهد بود بسیاری دیگر لایه های است که ما می توانیم پوست برگشت برای شما. این ج. و این است که برنامه نویسی است. واقعا خوب سوال. همه حق است، پس از این که حشره دار بود برنامه من با اشاره به قبل از آن بود. مبادله ناقص بود. اگر به نظر می رسد به کار کند. به یاد بیاورید که فقط با شیر دوست و آب پرتقال - که شروع کردم به نوشیدن تظاهرات امروز. بنابراین فقط به عنوان با آب پرتقال و شیر، ما مجبور به استفاده از متغیر موقت، TMP، به برگزاری یک به طور موقت به طوری که بعد از آن ما می تواند تغییر ارزش خود را و پس از آن به روز رسانی ب. اما این تابع، گفت، یا این برنامه که در آن این تابع بود نوشته شده اشتباه و ناروا و نادرست بود، چرا؟ بله؟ مخاطب: [نامفهوم]. SPEAKER 1: دقیقا، زمانی که با شما تماس SWAP - و یا به طور کلی، هنگامی که شما فراخوانی هر تابع - اگر استدلال به آن تابع می باشد بدوی، پس به صحبت می کنند، نوع داده int و کاراکتر و دو برابر و شناور، همه چیز بدون ستاره ها، شما در یک کپی از عبور آرگومان می گیرد. بنابراین اگر x 1 و y 2، به 1 و ب 2. اما آنها در حال رفتن به تکه های مختلف بیت، تکه های مختلف حافظه که اتفاق می افتد به ذخیره سازی مقادیر یکسان است. بنابراین این کد فوق العاده کامل است در مبادله a و b است. این هیچ خوب در مبادله - به عنوان مثال - در هفته گذشته x و y. چرا که باز هم آنها در دامنه اشتباه است. در حال حاضر، چگونه ما در مورد تعمیر این؟ ما تا به حال به تابع نگاه کمی زشت. اما باز هم، در نظر گرفتن آنچه این حالت فقط بدان معناست. و در واقع، به من اجازه دهید، جهت هماهنگی، تغییر یک چیز پس از آن یکسان آنچه که ما فقط. همانطور که من در هفته گذشته ذکر شد، آن را نمی کند توجه به جایی که از آن می رود. در واقع، به طور معمول شما می توانید قرار دهید ستاره در کنار نام متغیر است. اما من فکر می کنم این امر می تواند کمی ساده تر * در کنار در نظر گرفتن نوع داده ها به معنای آن یک اشاره گر به int در این مورد است. پس چه هستم من در اینجا انجام می دهند؟ من گفت: نه من از نوع int را به دنبال بین المللی دیگر، فراخوانی آنها a و b. من آدرس یک int را به من بدهید. من آدرس از نوع int دیگری به من بدهید. تماس با آن دسته A و B را. و سپس با استفاده از نماد * پایین در زیر، به هر یک از این آدرس بروید در صورت نیاز یا و یا مجموعه ای از ارزش آن است. اما یک استثنا در اینجا وجود دارد. چرا * بعدی به TMP من ندارد؟ چرا من این کار نیست، به عنوان مثال؟ احساس می کنم فقط باید به همه از و تصحیح همه چیز است. آره؟ مخاطب: [نامفهوم]. SPEAKER 1: من اعلام نشده است TMP را به عنوان یک رشته. بنابراین این اعلام، در این مورد، TMP به آدرس از نوع int است. اما این کاملا چیزی است که من می خواهم، برای یک زن و شوهر از دلایل. مخاطبان: شما نمی خواهید به آنها مبادله. SPEAKER 1: دقیقا، من نمی خواهم به مبادله هر چیزی را با TMP. TMP است یک هفته مسائل. من می خواهم یک متغیر است به ذخیره مقداری شماره. من حتی در مورد مراقبت از آدرس در این لحظه. من فقط نیاز به 32 بیت و یا بنابراین برای ذخیره یک بین المللی. و من می خواهم برای قرار دادن در آن 32 بیت آنچه در یک نیست، پس به صحبت می کنند، اما آنچه در یک، فقط به عبارت دقیق تر. از آنجا که اگر یک آدرس است، * معنی رفتن وجود دارد و مقدار 1. برای مثال، در مثال هفته گذشته و یا در مورد ب، ارزش، از مجموع 2. پس چه چیزی واقعا در رفتن؟ اجازه بدهید من یک عکس در اینجا است که خواهد شد قرعه کشی تنها کسی را دست انداختن هم جدا بخشی از امروز. اما این به نظر می رسد ادامه خواهد داد برای مدتی. من ادعا می کنند، این همان چیزی است که کامپیوتر شما حافظه به نظر می رسد مانند وقتی که شما یک برنامه، هر برنامه. هنگامی که شما یک برنامه بسیار بالا از حافظه کامپیوتر شما - بنابراین فکر می کنم این مستطیل، واقعا، خود را به عنوان RAM یا حافظه کامپیوتر، تمام 101 میلیارد بایت از آن، همه دو میلیارد بایت، دو گیگابایت از آن، هر چه مقدار است، اجازه دهید آن را به عنوان یک مستطیل رسم. و من ادعا می کنند که زمانی که یک برنامه اجرا می کنید مانند مایکروسافت ورد و یا کروم و یا هر چیزی شبیه به آن، بیت که Microsoft یا که گوگل نوشت - در موارد آن برنامه ها - به حافظه کامپیوتر شما لود می شود که در آن می توان آنها را اعدام به سرعت و تغذیه به CPU، که مغز کامپیوتر است. و در TAM آنها ذخیره می شود بالای برنامه خود، پس به صحبت می کنند. به عبارت دیگر، در صورتی که این یک تکه از حافظه، زمانی که شما دو با کلیک بر روی مایکروسافت ورد، بیت آمده است کردن هارد دیسک. آنها را به حافظه بارگذاری شده است. و ما آنها را در بالای پرتاب خواهیم کرد از این مستطیل مفهومی. خب، بقیه حافظه خود را برای کارهای مختلف استفاده می شود. در بسیار بالا می بینید مقداردهی اولیه داده ها و uninitialize از داده ها. این را انجام دهید، در اکثر موارد، با ثابت و یا متغیر های جهانی که ارزش. اما در آن زمان دیگر است. سپس شما باید پشته، که ما را به دوباره. اما در پایین بخشی است که به خصوص وابسته در حال حاضر. این پشته به اصطلاح. پس فقط در اکثر سالن D اینجا را دوست دارم پردیس، شما باید سینی های که فقط در بالای هر یک از دیگری که بر روی پشته شما می توانید غذا و فلان چیز قرار داده است. پشته در یک سیستم کامپیوتری بسیار مشابه است. به جز در حالی که سینی، همانطور که ما در حال استفاده سالن ناهار خوری، البته، به معنای برای حمل همه چیز سینی یا قاب - همانطور که ما به آنها تماس بگیرید - در یک کامپیوتر حافظه استفاده می شود برای نگه داشتن متغیرها و مقادیر. بنابراین آنچه که واقعا می رود در زیر هود؟ خوب، اجازه دهید من تلنگر به روی صفحه نمایش در اینجا. و اجازه تمرکز فقط بر روی قسمت پایین برای یک لحظه. در صورتی که این بخش پایین از من است حافظه کامپیوتر آن معلوم است وقتی که من فراخوانی تابع اصلی - که اتفاق می افتد، رک و پوست کنده، به صورت خودکار برای من - من یک تکه از حافظه در پایین رم من تا به صحبت می کنند. و این جایی است که اصلی متغیرهای محلی بروید. این جایی که تعداد آنها و شاید و argv و من هر متغیر اصلی اعلام داخل. آنها در نهایت در پایین از RAM کامپیوتر من. حالا فرض کنید که تماس های اصلی یک تابع مانند مبادله، مانند آن را در هفته گذشته انجام داد؟ خب، ما اساسا قرار دادن یک سینی جدید، قاب جدید، بر روی تکه های من از حافظه است. و من قصد دارم برای توصیف این عنوان متعلق به تابع سواپ. در حال حاضر آنچه در داخل مبادله است؟ خوب، بر اساس برنامه هفته گذشته و ما فقط شاهد گزیده ای از، در داخل قاب مبادله، و یا در مبادله سینی، چه متغیرهای؟ خوب، a و b است. از آنجا که کسانی که استدلال های محلی خود را، به علاوه یک سوم، TMP. پس در واقع، من می توانم این قرعه کشی کمی ولایه. اجازه دهید من جلو بروید و خنثیسازی برچسب. و اجازه دهید من ادعا می کنند که می دانید؟ است احتمالا برای پایان دادن به اینجا. B است که برای پایان دادن به اینجا. و TMP است که برای پایان دادن به اینجا. در حال حاضر، این سفارش ممکن است کمی متفاوت است. اما مفهومی این ایده است. و فقط در مجموع، این همان چیزی است که خواهیم قاب مبادله را، تماس بگیرید، یا سینی ناهار خوری سالن. و همان معامله با اصلی. اما من نمی ترسیم که. اما این که در آن تعداد آنها و argv را هر متغیرهای محلی خود را مانند x و y ممکن است به عنوان خوب. بنابراین در حال حاضر در نظر آنچه واقعا اتفاق می افتد هنگامی که شما مبادله می نامیم. هنگامی که شما مبادله می نامیم، اجرای کد مانند شما در حال عبور در، در نسخه حشره دار، a و b به عنوان کپی از x و y. بنابراین اگر من در حال حاضر این قرعه کشی بر روی صفحه نمایش - رو به بهتر در این - بنابراین داستان به من گفتن به خودم بود در این نسخه حشره دار بود، زمانی که ما تماس مبادله عبور در معنای واقعی کلمه a و b به عنوان اعداد صحیح، آنچه واقعا اتفاق می افتد؟ خوب، آنچه واقعا اتفاق می افتد این است. اجازه دهید من جلو بروید و خنثیسازی فقط برای روشن کردن برخی از فضا در اینجا. بنابراین این حافظه کامپیوتر من است. بنابراین اگر من، به عنوان مثال - در واقع اجازه دهید آن را در این راه - اگر من ادعا می کنند که این x است، ذخیره سازی ارزش 1 درست مثل هفته گذشته است. و این y باشد، ذخیره سازی ارزش 2 تنها در هفته گذشته می خواهم. و این اصلی است، زمانی که من مبادله می نامیم، بدین وسیله به خودم دسترسی به و ب و tmp را دارد، من قصد دارم ادعا می کنند که این است و این است که 1. این ب. این 2 است. این TMP نامیده می شود. و در ابتدا، آن را تا به برخی از ارزش زباله تا زمانی که من در واقع در آن ذخیره، 1 است. سپس من به جلو و تغییر به چه؟ ارزش B. و بنابراین در حال حاضر من دو در اینجا. و پس از آن ما گفت: ب می شود TMP. باز هم، فقط به عنوان بررسی سلامت عقل، سوم خط کد در اینجا است که به سادگی این ، ب TMP می شود. و به این ترتیب در نهایت، چه می توانم بکنم؟ میروم جلو و تغییر ب به هر ارزش TMP است، این است که 1. من TMP را لمس نمی خورند. اما در حال حاضر، مشکل این است که به محض مبادله می گرداند، زیرا آن را توزیع نمی کند پشت برخی از ارزش، بدون بازگشت وجود دارد بیانیه ای که در آن به صراحت. آنچه در واقع اتفاق می افتد؟ خوب، اساسا تمام این حافظه - خوب، ظاهرا پاک کن دوست تنها یک انگشت در یک زمان - فقط از بین می رود. در حال حاضر در واقع این طور نیست رفتن به هر نقطه است. اما شما می توانید از آن فکر می کنم در حال حاضر به عنوان علامت سوال. از آنجا که دیگر در واقع در حال استفاده است. و هیچ چیز با آن ارزشها انجام می شود. بنابراین در مورد نسخه سبز این کد چه جای است که گذشت به مبادله؟ بنابراین آدرس. بنابراین آدرس x و آدرس Y. بنابراین اگر ما دوباره به این داستان یکی از آخرین زمان، و من در واقع مبادله قرعه کشی دوباره، اما با اشاره گر، از این بودن، از این ب، و این TMP است، چه در واقع در در این سبز ذخیره می شود نسخه ای از کد من جایی که من عبور در آدرس؟ این رفتن به یک اشاره گر به x. بنابراین من می تواند فلش را بر می انگیزد. اما اجازه دهید با استفاده از همان خودسرانه به عنوان مثال مانند قبل. بیایید می گویند که این چیزی شبیه به Ox123. و این است که رفتن به Ox127 به دلیل آن چهار بایت دور است به دلیل آن را هوشمند، بنابراین Ox127. و دوباره، من در نظر گرفتن برخی از آزادی با اعداد. آنها بسیار کوچکتر از آنها را در واقع می شود و در یک نظم متفاوت است. اما این چگونه تصویر در حال حاضر متفاوت است. اما وقتی که من استفاده از این کد سبز و من TMP اعضای هیات *. * وسیله ای به انجام موارد زیر، را آدرس که در و آن را به، 1 است. و این چیزی است که من پس از آن در TMP قرار داده است. در همین حال، در خط بعدی کد در اینجا، * ب می شود، چه معنی؟ خوب، *، بنابراین در اینجا می شود * ب، که به معنی رفتن وجود دارد. و این به معنای قرار دادن ارزش وجود دارد. در نهایت، آخرین خط از کد به سادگی گفت: * ب TMP می شود. بنابراین ب می گوید وجود دارد و بازنویسی آن را با TMP که در این مورد است، رفتن می شود، دوباره، 1. و این که چرا نسخه سبز کد کار ما، در حالی که قرمز نسخه هرگز. این فقط بستگی به چگونگی حافظه مدیریت شده و که در آن در واقع در خود قرار داده است RAM کامپیوتر است. و در حال حاضر، که یکی از چیزهایی که که پشته استفاده می شود. سوالات مطرح شده در طرح؟ در اشاره گر؟ یا مبادله؟ همه حق است، بنابراین malloc، فراخوان، آیا چیزی شبیه به این. این یک مثال فوق العاده ساده بود. و این یکی بود که Binky معرفی به ما، البته کاملا به سرعت، در پایان کلاس. Dammit، در آنجا ما دوباره بروید. بنابراین به یاد بیاورید که این مثال بود که Binky ما معرفی به، البته تا حدودی به سرعت در پایان کلاس. و در اینجا ما با استفاده از malloc واقعا برای بار دوم. از آنجا که اولین بار ما از آن استفاده می ایجاد RAM کافی، تخصیص حافظه به اندازه کافی برای ذخیره یک رشته. این بار Binky آن را ساده نگه داشته است. پس از آن برای ذخیره تنها یک int، ظاهرا. و این کاملا خوب است. این کمی عجیب و غریب است، رک و پوست کنده، به استفاده از malloc برای تخصیص یک بین المللی. اما از نقطه claymation نیک بود واقعا فقط داستان چه بگویید اتفاق می افتد یا اتفاق نمی افتد زمانی که شما بدرفتاری حافظه. بنابراین در این مورد، این برنامه انجام چند چیز. در مورد اول در اینجا، آن را اعلام کرد یک اشاره گر به نام x به یک int. پس از آن اعلام کرد که یک اشاره گر به نام y به یک int است. سپس آن را در x ذخیره، چه؟ شخص دیگری در حال حاضر. چه می شود در x با توجه به ذخیره می شود خط سوم از این برنامه؟ مخاطب: [نامفهوم]. SPEAKER 1: خوب، نه کاملا بایت، در می گویند. دقیق تر در حال حاضر. چه می شود در x ذخیره می شود؟ آدرس، من فکر می کنم من آن را شنیده. پس چه malloc را برگرداند؟ malloc رفتاری اختصاص یک تکه از حافظه است. اما چگونه آن را به شما به آن دسترسی داشته باشید؟ آن را می گرداند چه؟ آدرس اولین بایت در تکه از حافظه. در حال حاضر، این ساده فوق العاده است. این فقط یک بایت است، که به معنی رسیدگی به ما باز می گردیم است آدرس همه چیز. پس در x پس از آن ذخیره می شود، آدرس است آن تکه از حافظه است. در همین حال، بعد چه اتفاقی می افتد؟ پس در واقع، اجازه دهید به جلو و رسم این سرعت از واقعی است. بنابراین اگر ما به بیش از به روی صفحه نمایش در اینجا و ما این بازی از نوع int * x و هوشمند * Y رفتن به انجام آنچه برای من؟ من ادعا می کنند که آن را فقط به انجام چیزی شبیه به این و آن را X، و این و آن Y می نامند. در همین حال، خط سوم کد رفتن به تخصیص اندازه یک int، که اتفاق می افتد - متاسفم اگر من گفتم یکی قبل از من به معنای یک بین المللی - چهار کلمه در ادامه متن بر روی یک کامپیوتر معمولی است. حداقل با دستگاه CS50. بنابراین این است که رفتن به اختصاص آن، چه کسی می داند؟ در جایی از اینجا. و این است که در برخی از ذخیره می شود گاو آدرس، چه کسی می داند؟ اما چه خبر بازگشت آن آدرس است. اما ما خواهید این قرعه کشی pictorially در: فقط به عنوان فلش مانند آن. در حال حاضر در خط بعدی * X می شود 42. چه * x در شرایط خارج از حرفه یا فن خاصی است چیست؟ فقط وجود دارد. برو به این آدرس. یا به عبارت دیگر، به دنبال فلش و قرار دادن 42 وجود دارد. اما پس از آن چیزی بد اتفاق افتاد به Binky، درست است؟ به یاد بیاورید که خط پنج در اینجا، * Y می شود 13، در واقع تعداد بخت برگشته، آنچه را که برای ما؟ خوب، * Y به معنای رفتن وجود دارد. خوب، این داده نشده است یک مقدار در عین حال، درست است؟ کد Y نداشته مقداردهی اولیه به هر چیزی. ما تا به حال ایکس در حال مقداردهی شده به آدرس. اما Y بالا اعلام شد. اما پس از آن یک نقطه و ویرگول، هیچ ارزش در واقع در آن قرار داده شد. بنابراین آن را عادلانه به این یک مقدار زباله. چه کسی می داند چه چیزی وجود دارد؟ بقایای بیت است که مورد استفاده قرار گرفت برخی از خط قبلی کد در برنامه های من. بنابراین اگر من می گویم رفتن وجود دارد، این مانند آن است که، من هیچ نظری ندارم که این فلش رفتن برای پایان دادن به. و این زمانی بود که شما به طور معمول گسل تقسیم بندی. اگر شما به طور تصادفی dereference، تا به صحبت می کنند، و یا رفتن به یک آدرس که نیست در واقع یک آدرس مشروع، چیزهای بد اتفاق می افتد. و این دقیقا همان چیزی است که اتفاق افتاده است فکر می کنم Binky. بنابراین به یاد بیاورید که داستان نیک بود گفتن در اینجا همان ایده بود به عنوان آنچه من با توهم کشیده شده ام گچ در هیئت مدیره وجود دارد. X و y را اعلام کرد. سپس ما اختصاص داده شده به اندازه int و آن را در x ذخیره می شود. سپس در خط بعدی ما بود *. این عصای جادویی نیک بود بصورت غیر مرجع. که 42 در حافظه قرار داده است توسط x اشاره کرد. اما این است که در آن همه چیز به طرز وحشیانه ای اشتباه رفت. درست است؟ ما به Y dereference محاکمه شد. اما Y تا به حال برخی از ارزش های ساختگی، درست است؟ که فلش در پایین سمت چپ این گوشه میمیره، نیست در واقع اشاره به هر چیزی. این نوع از انجام آنچه که من اینجا در هیئت مدیره. بنابراین چیزهای بد اتفاق می افتد، قطعه قطعه گسل، گسل، یا Binky در این مورد. اما اگر ما پس از آن تعمیر که با انجام X می شود Y تغییر داستان چگونه است؟ خوب، اگر من X Y می شود، که به طور موثر عنوان کرد و گفت آن چه که هست، ورزا چیزی رفتن به همان، OX-چیزی. یا pictorially خواهیم یک پیکان قرعه کشی. بنابراین در اینجا در هیئت مدیره با Binky، با خط بعدی کد، * Y به معنای رفتن وجود دارد. است که در آن وجود دارد؟ این بدان معنی است در اینجا. و زمانی که ما به روز رسانی که به 13 آن را فقط شامل رفتن و نوشتن 13 در حال حاضر اینجا. بنابراین شاید نه به طور کامل ساده در نگاه اول. اما برای روکش کردن و استفاده از همان اصطلاحات مخصوص یک صنف که Binky اینجا استفاده شده است، بنابراین دو مورد اول، اختصاص اشاره گر، x و y، اما نه pointees. ها و pointees است به طور کلی مدت استفاده می شود. اما اشاره گر کاملا است. اما آن چیزی است که در حال اشاره در نامگذاری Binky. این خط بعدی، البته، یک pointee نوع int اختصاص می دهد. بنابراین یک تکه از حافظه - که من بر روی به خود جلب کرد سمت راست وجود دارد - و مجموعه X برابر است با اشاره به آن است. این ایکس ارجاع میدهد به ذخیره 42 حافظه است که آن را در اشاره. و پس از این، البته، یک چیز بد بود. از آنجا که سال بود اشاره نمی کند در هر چیز هنوز. این از آن رفع. پس این است که هنوز برنامه حشره دار. فقط به این خاطر که ما از طریق دمیدن خط کد شده توسط خط و گفت، آه، خب، اجازه سقوط آن وجود دارد. این یک چیز بد است. شانس هستند که این برنامه فقط رفتن به سقط جنین در مجموع در آن خط. اما اگر شما به حذف سقوط کرد خط و جایگزین کردن آن با دو خط وجود دارد به شما اختصاص - با استفاده از انتساب اشاره گر - Y به نقطه X به عنوان نقطه تی. و سپس شما dereference y در یک راه بسیار امن. تا جایی که این ما را ترک؟ خب، معلوم است که در زیر هود در کتابخانه CS50، اشاره گر ها در طول استفاده می شود. و ما در واقع می خواهید شروع به پوست به عقب که لایه قبل از طولانی. اما معلوم بیش از حد، بیان می کنم که برخی از شما ممکن است با آن آشنا، به ویژه کسانی که راحت تر، است که در واقع که بسیار محبوب وب سایت، و یا سرریز پشته، این روزها. اما این در واقع بسیار معنای فنی. ما در حال حاضر می دانیم که پشته چیست. آن را مانند یک پشته از سینی داخل یک سالن ناهار خوری. و یا در داخل کامپیوتر شما حافظه خود را این فریم که توسط توابع استفاده می شود. خب، معلوم است که به خاطر آن اجرای بسیار ساده حافظه و فریم به اصطلاح پشته، شما در واقع می توانید کنترل را از یک سیستم کامپیوتری نسبتا ساده است. شما می توانید به یک سیستم هک اگر مردم مثل ما کد ما نوشته نشده است به خصوص به خوبی. اگر افرادی مانند ما با استفاده از تکه های و یا استفاده کنید از آرایه های حافظه - حتی بیشتر به طور معمول - اما گاهی اوقات این نکته را فراموش می کنیم برای بررسی مرزهای آرایه ما همانطور که شما ممکن خودتان گاهی اوقات، و تکرار راه بیش از حد گذشته پایان آرایه. در بهترین حالت، برنامه های خود را فقط ممکن است سقوط. تقسیم بندی گسل، نوع شرم آور است. بزرگ نیست، اما آن لزوما یک چیز بسیار بد است. اما اگر برنامه شما در واقع واقعی کاربران کامپیوتر، اگر آن را در حال اجرا در یک وب سایت است که مردم واقعی تصادفی بر روی اینترنت هستند هدف قرار دادن، اجازه دادن به مردم را وادار به کارهای بد را در کد خود است به طور کلی چیز خوبی است زیرا به این معنی فرصت را به کنترل از کامپیوتر است. و این است که رفتن به نگاه کمی مرموز. اما من فکر کردم من می خواهم شما را با ترساندن این مثال آخر در اینجا. در اینجا یک مثال از کد است. و ویکیپدیا خوب وجود دارد مقاله ای که از طریق پیاده روی این در جزئیات بیشتر است. من اصلی در مکالمه پایین تولی، عبور در argv از 1. و این فقط به طوری که شما می توانید اجرای برنامه و با تصویب ورودی دلخواه. و سپس تولی اعلام بالا به عنوان پذیرش یک رشته، یا بیشتر دقیقا، کاراکتر *. سپس آن را اعلام آرایه ای از کاراکتر. تماس با آن بافر، به طور کلی تر، اندازه 12 است. بنابراین 12 کاراکتر می تواند داخل جا که آرایه به نام ج. و سپس آن را با استفاده از این تابع جدید، است که جدید اما سخت نیست درک، حافظه کپی کنید. این حافظه از نوار کپی، بود که گذشته N متغیر، به هر این کاربر به و argv 1 به C تایپ شده است. چگونه بسیاری از بایت؟ طول رشته از نوار است. بنابراین به عبارت دیگر، در صورتی که کاربر در انواع در H-L-L-O را وارد کنید، طول رشته در سلام و پنج است. بنابراین پنج نفر از این بایت است که برای به دست آوردن کپی شده را آرایه به نام C، که اندازه 12 است. اما آنچه که کاربر در انواع در بسیار طولانی کلمه ای که 13 کاراکتر یا 14 کاراکتر یا 100 کاراکتر یا بیشتر؟ کجا هستند آنها برای رفتن؟ خب، این قاب، که سینی در پشته سالن ناهار خوری، آنها در حال رفتن برای رفتن وجود دارد. و آن را فقط برای شروع به جای نوشتن چیزهای دیگر که در حال حاضر در آن پشته، سرشار پشته، پس به صحبت می کنند. تا pictorially، از این راه فکر می کنم. این فقط یک نسخه رنگارنگ تصویر طراحی شده اند. در پایین، اجازه دهید بگویم، اصلی است. و در بالای صفحه، شما در حال دیدن در حال حاضر قاب، رنگ کدگذاری در حال حاضر، برای تابع بنام foo. اما آنچه جالب است در اینجا در مورد تولی است که در اینجا قاب آن است. پس از آن درست مثل من کشیده اما در نور آبی انجام داد. و در حال حاضر این است که در آن ج 0 براکت می رود. و این جایی است ج براکت 11 است که برای پایان دادن به. به عبارت دیگر، آن را به اتفاق می افتد به عنوان یک مربع نشان داده شده است. اما اگر شما فقط plopping بایت پایین - یا کاراکتر - آنها در حال رفتن به انتها در محل 0 تمام راه را تا تا 11 به دلیل آن را به 0 نمایه میشود. اما در جایی که شخصیت 13TH است رفتن برای پایان دادن به؟ از کجا 14؟ شخصیت 50 رفتن برای پایان دادن به؟ رفتن به نگه داشتن رفتن به پایین. چرا که حتی اگر ما کشیده ام تصویر با پشته در حال رشد، آدرس، که معلوم است، از آدرس های کوچک، کوچک اشاره گر به آدرس بزرگ. پس از آن فقط نگه می دارد رفتن و. بنابراین اگر نوع کاربر در سلام، فوق العاده است. بدون اشکال، بدون مشکل، هر کس امن است. اما در صورتی که کاربر در انواع در آنچه ما می خواهیم کد خصمانه تماس، نشان داده شده است عموما به عنوان یک، حمله، حمله، حمله، حمله، چه اتفاقی می افتد؟ خوب، اگر تمام ورودی که کاربر تایپ شده در فقط برخی از دوستانه نیست توهین آمیز و یا رشته ای از کاراکتر ها است. این در واقع دنباله ای از کاراکتر ها که اگر شما به آن وارد شده، آن را در واقع فعال است. شاید آن کد است که حذف همه فایل ها بر روی دیسک سخت خود و یا هرزنامه می فرستد یا چیزی شبیه به آن. توجه داشته باشید که چه کلیدی در اینجا این است که اگر پسر بد به اندازه کافی خوش شانس بازنویسی تکه قرمز از حافظه - که من در عکس من را به خود جلب نمی کند، اما این تصویر ویکیپدیا در اینجا - آدرس برگشت به اصطلاح آن. هنگامی که بازده غذایی، هنگام بازگشت مبادله، چگونه کامپیوتر می دانم از تا اینجا به اینجا؟ و یا در بخش فن آوری در بالا، چگونه آیا آن را می دانم از مبادله کد - 0 و 1 که تشکیل مبادله - برگشت به بخش اصلی؟ آدرس برگشت به اصطلاح وجود دارد ذخیره شده در همان پشته قاب، در همان سینی کافه تریا. بنابراین اگر پسر بد به اندازه کافی باهوش است قرار دادن کد حمله، کد حمله، حمله کد، و به اندازه کافی خوش شانس - اغلب از طریق آزمایش و خطا - بازنویسی که آدرس برگشت قرمز، با آدرس و اطلاع بسیار بالا است. توجه کنید 0835C080. این نوشته به عقب تا بالا دلایلی که ما شاید می خواهید دوباره. این است که عدد است. بنابراین اگر مرد به اندازه کافی خوش شانس یا بد می شود به اندازه کافی هوشمند به بازنویسی قرمز است نوار حافظه با آدرس کدی که او به نحوی تزریق را به کامپیوتر خود، حدس می زنم که کد رفتن به بازگشت و به زودی به عنوان تولی انجام شده است اجرا؟ کد پسر بد. بنابراین این کد حمله، AAA، دوباره، ممکن است ارسال هرزنامه، ممکن است همه فایل ها را حذف کنید در هارد دیسک شما. اما این چیزی است که واقعا یک سرریز پشته است، و یا یک تاخت و تاز کردن بافر، و یا یک حمله سرریز بافر. و آن را فوق العاده، فوق العاده مشترک در این روز با برنامه های نوشته شده در C، C + +، و حتی برخی زبان های دیگر. در آن توجه داشته باشید ترسناک، خواهیم با یک شوخی به پایان برسد. [خنده حضار] ببینید شما در روز چهارشنبه. در CS50 بعدی - بنابراین من امروز همه از لامپ دیسک هستم، اما صبر کنید، شیر بدون چربی، نیمی تلفن کتاب، آب پرتقال که من امروز نوشید. کابل USB، یک آچار. [پخش موسیقی]