1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [MUSIC پخش] 3 00:00:11,261 --> 00:00:12,640 >> DAVID J. مالان: خوب. 4 00:00:12,640 --> 00:00:14,525 این CS50 است. 5 00:00:14,525 --> 00:00:16,009 و این آغاز هفته 5 است. 6 00:00:16,009 --> 00:00:18,050 و به عنوان شما ممکن است متوجه شده، برخی از مواد 7 00:00:18,050 --> 00:00:21,050 گرفتن کمی بیشتر پیچیده، متراکم تر کم است. 8 00:00:21,050 --> 00:00:24,560 >> و این بسیار آسان است، به خصوص اگر شما در این عادت برای برخی از زمان بوده است، 9 00:00:24,560 --> 00:00:28,600 به تلاش به خط ناخوانا پایین ترین هر چیزی که ما انجام می دهیم، می گویید در کلاس. 10 00:00:28,600 --> 00:00:31,626 اما متوجه، که شاید رویکرد آموزشی ایده آل 11 00:00:31,626 --> 00:00:34,250 به یادگیری این نوع از مواد، و مطالب دیگر. 12 00:00:34,250 --> 00:00:37,250 بنابراین، ما به خوشحال اعلام خود Gheng که CS50 است 13 00:00:37,250 --> 00:00:39,780 گونگ را آغاز کرده است برای آماده سازی مجموعه ای استاندارد از یادداشت ها 14 00:00:39,780 --> 00:00:42,100 برای این دوره، به امید این است که، یک، این 15 00:00:42,100 --> 00:00:44,030 نه تنها به عنوان یک خدمت مرجع و منبع 16 00:00:44,030 --> 00:00:47,410 برای بررسی مواد و رفتن از طریق ماده ای که ممکن است 17 00:00:47,410 --> 00:00:51,230 شما فرار اولین بار در اطراف، اما همچنین به طوری که سر خود را می تواند بیشتر 18 00:00:51,230 --> 00:00:53,740 تا از پایین، زمانی که آن را می آید زمان به سخنرانی، 19 00:00:53,740 --> 00:00:56,960 به طوری که شما ممکن است درگیر تر ملاحظه، به عنوان 20 00:00:56,960 --> 00:00:59,170 مخالف برهم است. 21 00:00:59,170 --> 00:01:02,510 >> با که گفت، چیزی است که شما را پیدا در وب سایت مدارک مانند این است. 22 00:01:02,510 --> 00:01:04,660 و توجه کنید، در سمت چپ بالا، وجود دارد نه تنها یک جدول از محتویات، 23 00:01:04,660 --> 00:01:06,920 بلکه کد هم که بلافاصله شما پرش 24 00:01:06,920 --> 00:01:09,077 به بخش مناسب در این ویدئو آنلاین. 25 00:01:09,077 --> 00:01:11,410 و چه چانگ اینجا انجام داده است است، در اصل، مستند 26 00:01:11,410 --> 00:01:13,340 آنچه در این اتفاق افتاده است سخنرانی خاص است. 27 00:01:13,340 --> 00:01:16,370 و بسیاری از سخنرانی ها می باشد در حال حاضر آنلاین در حال حاضر با این URL. 28 00:01:16,370 --> 00:01:20,110 و ما را به باقی مانده ادامه از کسانی که تا پایان این هفته، 29 00:01:20,110 --> 00:01:22,380 بنابراین کار را به استفاده از منابع که. 30 00:01:22,380 --> 00:01:25,740 >> پس بدون ado بیشتر، ما شروع به پوست کندن پشت 31 00:01:25,740 --> 00:01:28,180 لایه شده است که رشته برای برخی از زمان. 32 00:01:28,180 --> 00:01:30,670 و آنچه را که به ما می گویند یک رشته در واقع در هفته گذشته است؟ 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 ستاره بنابراین کاراکتر. 35 00:01:32,900 --> 00:01:34,900 و ستاره کاراکتر، به خوبی، چه بود که واقعا چیست؟ 36 00:01:34,900 --> 00:01:37,150 خب، تمام این زمان، اگر ما ام شده است فراخوانی یک تابع، 37 00:01:37,150 --> 00:01:40,450 مانند getString، و نگهداری بازگشت به اصطلاح 38 00:01:40,450 --> 00:01:42,910 ارزش getString در variable-- آن را به نام 39 00:01:42,910 --> 00:01:47,721 نوع بازدید کنندگان string-- ما نوشتن شده است خط از کد وجود دارد که در بالا. 40 00:01:47,721 --> 00:01:49,970 و این تنها زمانی که من می بینم من دست خط اینجا بزرگ 41 00:01:49,970 --> 00:01:51,930 من متوجه چقدر بی رحم این است. 42 00:01:51,930 --> 00:01:54,180 >> با این حال، اجازه دهید فرض کنیم که، در سمت راست 43 00:01:54,180 --> 00:01:57,070 است، با این وجود، معقول تصویر چه 44 00:01:57,070 --> 00:01:58,880 شده است در جریان تمام این زمان با getString. 45 00:01:58,880 --> 00:02:00,380 getString، البته، می شود یک رشته است. 46 00:02:00,380 --> 00:02:01,691 اما آنچه که واقعا چیست؟ 47 00:02:01,691 --> 00:02:04,190 این بدان معنی است می شود یک تکه از حافظه از سیستم عامل 48 00:02:04,190 --> 00:02:06,040 با تماس با یک تابع، malloc به نام. 49 00:02:06,040 --> 00:02:07,390 اما بیشتر در مورد که بعدا. 50 00:02:07,390 --> 00:02:09,139 و سپس آن را پر که تکه از حافظه 51 00:02:09,139 --> 00:02:11,764 با حروف به کاربر تایپ در، به دنبال، البته، 52 00:02:11,764 --> 00:02:14,800 یک شخصیت تهی، یا بک اسلش صفر در پایان. 53 00:02:14,800 --> 00:02:18,280 >> در همین حال، در سمت چپ این داستان، در تمام این زمان، 54 00:02:18,280 --> 00:02:20,850 ما شده است اعلام یک متغیر، مانند است. 55 00:02:20,850 --> 00:02:24,770 و این متغیر آنچه در حال حاضر است شروع خواهد شد خواستار یک اشاره گر. 56 00:02:24,770 --> 00:02:29,190 این یک جعبه که در داخل آن نمی ما را از رشته، Daven، فی نفسه، 57 00:02:29,190 --> 00:02:32,550 بلکه ما در این میدان قرار داده جعبه در سمت چپ که دقیقا چه چیزی؟ 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 آره؟ 60 00:02:35,390 --> 00:02:37,118 >> رسید آدرس جایی که در حافظه قرار دارد. 61 00:02:37,118 --> 00:02:38,118 >> DAVID J. مالان: دقیقا. 62 00:02:38,118 --> 00:02:40,690 آدرس که در آن Daven در حافظه قرار دارد. 63 00:02:40,690 --> 00:02:44,650 و نه که در آن همه از Daven واقع شده است، در هر سه، اما به طور خاص آدرس 64 00:02:44,650 --> 00:02:45,150 از چه؟ 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 آره؟ 67 00:02:46,810 --> 00:02:47,460 >> رسید حرف اول. 68 00:02:47,460 --> 00:02:50,209 >> DAVID J. مالان: اولین شخصیت در Daven، که، در این مورد، 69 00:02:50,209 --> 00:02:53,820 من پیشنهاد خودسرانه بود و غیر واقع بینانه 1، OX1، 70 00:02:53,820 --> 00:02:55,910 که فقط بدان معناست که تعداد هگزادسیمال، از مجموع 1 71 00:02:55,910 --> 00:02:57,993 اما این احتمالا به تعداد بسیار بزرگتر 72 00:02:57,993 --> 00:03:01,260 که ما ممکن است در قرعه کشی با 0x نمایش به عنوان پیشوند، 73 00:03:01,260 --> 00:03:02,806 به نمایندگی از یک شخصیت هگزادسیمال. 74 00:03:02,806 --> 00:03:05,930 و از آنجایی که ما لازم نیست بدانید که بقیه شخصیت های Daven 75 00:03:05,930 --> 00:03:09,860 هستند، به دلیل آنچه طراحی ساده تصمیم گیری است که سال ها پیش ساخته شده بود؟ 76 00:03:09,860 --> 00:03:10,548 آره؟ 77 00:03:10,548 --> 00:03:11,651 >> رسید ممیز معکوس 0. 78 00:03:11,651 --> 00:03:12,900 DAVID J. مالان: بله، دقیقا. 79 00:03:12,900 --> 00:03:18,100 بک اسلش 0 شما اجازه می دهد تا، البته در زمان خطی، به گذشتن از رشته، 80 00:03:18,100 --> 00:03:20,400 راه رفتن از چپ به راست، با حلقه for، یا در حالی که 81 00:03:20,400 --> 00:03:22,608 حلقه، یا چیزی شبیه به آن، و تعیین، آه، اینجا 82 00:03:22,608 --> 00:03:24,751 در پایان این رشته خاص است. 83 00:03:24,751 --> 00:03:27,000 پس فقط با آدرس در آغاز یک رشته، 84 00:03:27,000 --> 00:03:30,290 ما می توانیم تمامیت دسترسی این، به خاطر این همه در حالی که، 85 00:03:30,290 --> 00:03:32,030 یک رشته است فقط یک ستاره کاراکتر. 86 00:03:32,030 --> 00:03:36,370 >> پس از آن قطعا خوب به ادامه با استفاده از کتابخانه CS50 و این انتزاع، 87 00:03:36,370 --> 00:03:38,440 پس به صحبت می کنند، اما ما شروع به دیدن دقیقا 88 00:03:38,440 --> 00:03:41,230 آنچه در جریان بوده است در زیر این زمان تمام. 89 00:03:41,230 --> 00:03:45,260 بنابراین شما ممکن است این مثال یاد می آورند، بیش از حد، از زمان گذشته، مقایسه 0، 90 00:03:45,260 --> 00:03:47,300 که در واقع مقایسه نیست. 91 00:03:47,300 --> 00:03:49,070 اما ما شروع به حل این. 92 00:03:49,070 --> 00:03:52,020 >> اما شاید به عنوان یادآوری، ممکن است کسی علاقه من 93 00:03:52,020 --> 00:03:54,261 در یک فیل صورتی امروز، همچنین توسط چانگ ساخته شده؟ 94 00:03:54,261 --> 00:03:55,760 چگونه در مورد شما در مقابل؟ [نامفهوم]. 95 00:03:55,760 --> 00:03:56,660 بیا تا. 96 00:03:56,660 --> 00:03:58,740 >> و در عین حال، عنوان شما می آیند تا، اجازه دهید 97 00:03:58,740 --> 00:04:01,670 در نظر برای فقط یک لحظه چه این کد در واقع انجام شد. 98 00:04:01,670 --> 00:04:04,917 این اعلام دو متغیر تا بالا، و تی، و خواستار getString. 99 00:04:04,917 --> 00:04:08,250 این یک برنامه بسیار کاربر پسند نیست، به دلیل آن را به شما نمیگوید که چه کاری انجام دهید. 100 00:04:08,250 --> 00:04:10,541 اما اجازه دهید فقط فرض کنیم ما تمرکز بر بخش آبدار. 101 00:04:10,541 --> 00:04:14,470 و پس از آن کار می کنیم، اگر بازدید کنندگان برابر برابر تی، باید تابع () printf می گویند، 102 00:04:14,470 --> 00:04:16,170 شما هم همین را تایپ. 103 00:04:16,170 --> 00:04:16,670 سلام. 104 00:04:16,670 --> 00:04:17,050 نام شما چیست؟ 105 00:04:17,050 --> 00:04:17,779 >> JANELLE: Janelle. 106 00:04:17,779 --> 00:04:19,529 DAVID J. مالان: Janelle، ملاقات با شما خوشبختم. 107 00:04:19,529 --> 00:04:21,800 بنابراین چالش خود را در دست این فیل 108 00:04:21,800 --> 00:04:25,230 است به اولین ما رسم تصویری از آنچه است در این دو برای اولین بار نشان داده 109 00:04:25,230 --> 00:04:25,970 خطوط. 110 00:04:25,970 --> 00:04:28,139 بنابراین s و t ممکن است چگونه بر روی صفحه نمایش نشان داده شده؟ 111 00:04:28,139 --> 00:04:30,680 و شما فقط می توانید آن را در قرعه کشی با انگشت خود را بر روی این صفحه نمایش بزرگ. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> پس دو نیمه به وجود از هر طرف که معادله است. 114 00:04:34,510 --> 00:04:37,760 پس در سمت چپ وجود دارد، و پس از آن getString در سمت راست. 115 00:04:37,760 --> 00:04:40,540 و پس از آن تی وجود دارد در سمت چپ، و پس از آن getString در سمت راست. 116 00:04:40,540 --> 00:04:42,630 پس چگونه ممکن است که ما شروع رسم یک تصویر است که 117 00:04:42,630 --> 00:04:46,340 نشان دهنده چه خبر است در اینجا در حافظه، به شما می گویند؟ 118 00:04:46,340 --> 00:04:49,150 و اجازه دهید به شما اجازه توضیح آنچه شما انجام که شما بروید. 119 00:04:49,150 --> 00:04:49,820 >> JANELLE: OK. 120 00:04:49,820 --> 00:04:58,890 خب، اول، این امر می تواند درخواست شما برای دریافت رشته ورودی. 121 00:04:58,890 --> 00:05:00,439 و این امر می store-- آه، ببخشید. 122 00:05:00,439 --> 00:05:01,230 DAVID J. مالان: OK. 123 00:05:01,230 --> 00:05:01,730 خوب. 124 00:05:01,730 --> 00:05:03,330 و این است که به نام چه؟ 125 00:05:03,330 --> 00:05:03,950 اوه، OK. 126 00:05:03,950 --> 00:05:04,450 رفتن نگه دارید. 127 00:05:04,450 --> 00:05:05,575 من نمی خواستم وقفه. 128 00:05:05,575 --> 00:05:07,060 JANELLE: متاسفم. 129 00:05:07,060 --> 00:05:14,237 بنابراین آن را ورودی آن را به آدرس of-- مطمئن نیست. 130 00:05:14,237 --> 00:05:17,320 من دقیقا نمی تواند به یاد داشته باشید تعداد، اما من اعتقاد دارم که آن را با 0 شروع شد. 131 00:05:17,320 --> 00:05:18,420 >> DAVID J. مالان: این همه حق است، چون من به شماره ساخته شده، 132 00:05:18,420 --> 00:05:19,650 بنابراین هیچ جواب درست وجود دارد. 133 00:05:19,650 --> 00:05:22,105 >> JANELLE: شروع با 0 کمان. 134 00:05:22,105 --> 00:05:24,000 >> DAVID J. مالان: OK، بنابراین عنصر 0. 135 00:05:24,000 --> 00:05:24,765 مطمئنا. 136 00:05:24,765 --> 00:05:28,295 >> JANELLE: و پس از آن اگر بود مانند فقط یک دو letter-- 137 00:05:28,295 --> 00:05:30,496 >> DAVID J. مالان: OK، به شما. 138 00:05:30,496 --> 00:05:33,629 >> JANELLE: بنابراین عنصر 0، و پس از آن عنصر 1 یا 2 عنصر. 139 00:05:33,629 --> 00:05:36,670 DAVID J. مالان: و که بخشی از تصویر شما در حال حاضر رسم؟ 140 00:05:36,670 --> 00:05:37,690 دعوت به getString؟ 141 00:05:37,690 --> 00:05:38,830 یا اعلام آخرین ارسال ها 142 00:05:38,830 --> 00:05:42,890 >> JANELLE: در این بیانیه به از بازدید کنندگان، به اعتقاد من. 143 00:05:42,890 --> 00:05:45,980 آه، getString، به دلیل آن را به هر [وارد کردهاید؟ منطقه است. ؟] 144 00:05:45,980 --> 00:05:46,510 >> DAVID J. مالان: خوب. 145 00:05:46,510 --> 00:05:47,051 دقیقا. 146 00:05:47,051 --> 00:05:49,300 حتی اگر این به طور موثر یک آرایه، فراخوان می گرداند، 147 00:05:49,300 --> 00:05:53,300 هنگامی که ما به عقب بر گردیم یک رشته، ما می توانیم صفحه اول به آن رشته با استفاده از 01 و 2. 148 00:05:53,300 --> 00:05:56,180 مشخصات فنی، این احتمالا ارائه شده توسط آدرس های فردی، 149 00:05:56,180 --> 00:05:57,100 اما این خوب است. 150 00:05:57,100 --> 00:06:00,170 >> بنابراین فرض، اگر من فقط می تواند سریع به جلو به جایی که ما به سمت چپ خاموش 151 00:06:00,170 --> 00:06:04,320 زمان گذشته، اگر یکی از رشته گرم ب ه بود، 152 00:06:04,320 --> 00:06:10,337 بک اسلش 0، در نتیجه به نمایندگی گیب است ورودی، چگونه ممکن است ما را نمایندگی ها در حال حاضر؟ 153 00:06:10,337 --> 00:06:12,670 اگر این حافظه که است توسط getString بازگشت؟ 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> JANELLE: آیا آن را ارائه شده توسط یک قوس؟ 156 00:06:17,610 --> 00:06:18,750 >> DAVID J. مالان: توسط یک قوس؟ 157 00:06:18,750 --> 00:06:19,130 خب، نه. 158 00:06:19,130 --> 00:06:21,171 اجازه دهید فقط می گویند، pictorially، اجازه دهید من فقط به جلو 159 00:06:21,171 --> 00:06:25,710 و پیشنهاد می کنند که، اگر این است، این مقدار بازگشتی getString است. 160 00:06:25,710 --> 00:06:29,482 و شما این را به عنوان 0، 1، 2، رسم کرده ایم که کاملا معقول است، زیرا ما 161 00:06:29,482 --> 00:06:30,940 می توانید صفحه را به رشته، به عنوان مثل. 162 00:06:30,940 --> 00:06:33,340 اما فقط باید سازگار با زمان آخرین، اجازه دهید من به جلو 163 00:06:33,340 --> 00:06:37,310 و خودسرانه پیشنهاد می کنند که این آدرس 1 است، این آدرس 2 است، 164 00:06:37,310 --> 00:06:39,597 این آدرس 3، و غیره است. 165 00:06:39,597 --> 00:06:41,430 و به این ترتیب، فقط به فوق العاده روشن، چه خبر است 166 00:06:41,430 --> 00:06:44,580 به در به عنوان یک نتیجه از که اولین خط از کد، به شما می گویند؟ 167 00:06:44,580 --> 00:06:45,420 >> JANELLE: آدرس 1؟ 168 00:06:45,420 --> 00:06:46,420 >> DAVID J. مالان: دقیقا. 169 00:06:46,420 --> 00:06:47,190 بنابراین 0x1 آدرس. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 و در عین حال، اجازه دهید من به جلو و تکراری بسیاری از آنچه شما انجام داده ام 172 00:06:51,230 --> 00:06:52,740 و اضافه کردن تن خود من در اینجا. 173 00:06:52,740 --> 00:06:56,340 اگر من به نوع در گیب دوباره، بار دوم، 174 00:06:56,340 --> 00:07:01,530 زمانی که با getString درخواست، که در آن، البته، گیب برای رفتن؟ 175 00:07:01,530 --> 00:07:02,280 خوب، presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> JANELLE: مانند در اینجا؟ 178 00:07:05,975 --> 00:07:06,850 DAVID J. مالان: آره. 179 00:07:06,850 --> 00:07:08,516 JANELLE: یا آن را نیز در جعبه های مشابه؟ 180 00:07:08,516 --> 00:07:11,940 DAVID J. مالان: اجازه بدهید من پیشنهاد، آره، دقیقا، بنابراین در این جعبه های اضافی. 181 00:07:11,940 --> 00:07:15,230 اما چه چیزی اصلی است که، حتی هر چند که من کشیده ام این بسیار نزدیک 182 00:07:15,230 --> 00:07:18,650 together-- 0x1، این است 0x2-- در واقع، 183 00:07:18,650 --> 00:07:25,750 این در حال حاضر ممکن است آدرس 0x10، به عنوان مثال، و 0x11، 0x12 و، 184 00:07:25,750 --> 00:07:26,870 و غیره. 185 00:07:26,870 --> 00:07:29,955 و به این ترتیب، اگر علت این باشد، چه خبر است برای پایان دادن به در اینجا در تی؟ 186 00:07:29,955 --> 00:07:30,830 >> JANELLE: 0x10؟ 187 00:07:30,830 --> 00:07:31,830 DAVID J. مالان: دقیقا. 188 00:07:31,830 --> 00:07:33,180 بنابراین 0x10. 189 00:07:33,180 --> 00:07:34,570 و به این ترتیب در حال حاضر، سوال نهایی است. 190 00:07:34,570 --> 00:07:37,510 شما، تا حد زیادی، به حال به کار سخت ترین برای یک فیل تا کنون. 191 00:07:37,510 --> 00:07:42,650 در حال حاضر، اگر من را بالا بکشد کد دوباره، زمانی که من، در خط سه، 192 00:07:42,650 --> 00:07:47,630 اگر بازدید کنندگان برابر برابر تی، چیزی که من در واقع هستم مقایسه که ما در اینجا کشیده ام؟ 193 00:07:47,630 --> 00:07:49,271 >> JANELLE: دو آدرس؟ 194 00:07:49,271 --> 00:07:50,270 DAVID J. مالان: دقیقا. 195 00:07:50,270 --> 00:07:53,350 پس من ادعا است ها برابر به T؟ 196 00:07:53,350 --> 00:07:56,210 به عبارت دیگر، برابر با 1 به 10 برابر است؟ 197 00:07:56,210 --> 00:07:59,710 و البته، پاسخ واضح در حال حاضر، هیچ. 198 00:07:59,710 --> 00:08:02,920 و به این ترتیب این برنامه در نهایت رفتن به چاپ چه چیزی، چه می گفتی؟ 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> JANELLE: آیا آن را، شما هم همین را تایپ؟ 201 00:08:08,405 --> 00:08:11,446 >> DAVID J. مالان: بنابراین اگر بازدید کنندگان 1 است و t 10 است؟ 202 00:08:11,446 --> 00:08:13,320 >> JANELLE: شما چیزهای مختلف تایپ. 203 00:08:13,320 --> 00:08:13,570 >> DAVID J. مالان: دقیقا. 204 00:08:13,570 --> 00:08:14,480 شما چیزهای مختلف تایپ. 205 00:08:14,480 --> 00:08:14,850 خوب. 206 00:08:14,850 --> 00:08:16,714 بنابراین دور از تشویق، اگر ما می تواند، در اینجا. 207 00:08:16,714 --> 00:08:17,214 [تشویق حضار] 208 00:08:17,214 --> 00:08:17,708 این دردناک بود. 209 00:08:17,708 --> 00:08:18,208 من می دانم. 210 00:08:18,208 --> 00:08:19,684 سادگی انجام می شود. 211 00:08:19,684 --> 00:08:24,690 بنابراین در حال حاضر بیایید ببینید که اگر ما می توانیم کسی را دست انداختن از هم جدا چه ثابت بود. 212 00:08:24,690 --> 00:08:28,040 و البته، هنگامی که ما ثابت this-- که من در حال حاضر شما در green-- نشان 213 00:08:28,040 --> 00:08:29,690 ما یک زن و شوهر از پیشرفت در اینجا. 214 00:08:29,690 --> 00:08:32,409 اول، فقط به عنوان یک سلامت عقل بررسی کنید، من برای اولین بار چک 215 00:08:32,409 --> 00:08:35,110 اگر بازدید کنندگان برابر با صفر و t برابر است با صفر. 216 00:08:35,110 --> 00:08:39,440 و فقط روشن، زمانی که ممکن است و یا تی تهی در کد مثل این؟ 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 هنگامی که ممکن است و یا تی تهی باشد. 219 00:08:44,490 --> 00:08:44,990 آره؟ 220 00:08:44,990 --> 00:08:45,990 >> رسید [نامفهوم]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> DAVID J. مالان: دقیقا. 223 00:08:50,510 --> 00:08:52,840 اگر رشته است که کاربر تایپ در راه است بیش از حد طولانی 224 00:08:52,840 --> 00:08:56,140 به جا در حافظه، و یا برخی از مورد گوشه های عجیب و غریب مانند آن، 225 00:08:56,140 --> 00:08:59,010 getString، به عنوان خواهیم دید، به معنای واقعی کلمه امروز، در اسناد و مدارک آن، 226 00:08:59,010 --> 00:09:02,330 می گوید null به عنوان باز خواهد گشت ارزش نگهبان ویژه، 227 00:09:02,330 --> 00:09:05,417 یا فقط نوعی از نماد های خاص این بدان معناست که چیزی را اشتباه رفت. 228 00:09:05,417 --> 00:09:07,500 بنابراین ما می خواهیم برای بررسی که، به دلیل آن معلوم است 229 00:09:07,500 --> 00:09:09,720 که تهی ارزش بسیار خطرناک است. 230 00:09:09,720 --> 00:09:14,250 >> اغلب، اگر شما سعی می کنید برای انجام کاری با تهی که شامل function-- انتقال آن 231 00:09:14,250 --> 00:09:17,470 به عنوان ورودی، برای instance-- که تابع ممکن است بسیار سقوط خواهد کرد و همراه با آن، 232 00:09:17,470 --> 00:09:19,090 خراب کردن تمام برنامه های خود را. 233 00:09:19,090 --> 00:09:22,570 بنابراین این خط سوم در حال حاضر فقط عقل است چک، چک کردن خطا، اگر شما خواهد شد. 234 00:09:22,570 --> 00:09:25,450 این عادت خوب در حال حاضر برای ما به هر زمان ما 235 00:09:25,450 --> 00:09:28,050 سعی کنید به استفاده از ارزش که می تواند به طور بالقوه، تهی باشد. 236 00:09:28,050 --> 00:09:32,000 >> در حال حاضر، در خط چهارم در اینجا، "اگر strcmp (S، T)،" خوب، 237 00:09:32,000 --> 00:09:33,180 چه چیزی است که با اشاره به؟ 238 00:09:33,180 --> 00:09:36,750 خب، ما گفت: این بسیار موجز بود نام تابع برای مقایسه رشته است. 239 00:09:36,750 --> 00:09:40,370 و هدف خود را در زندگی است که به مقایسه اولین بحث خود را در برابر آن دوم، 240 00:09:40,370 --> 00:09:44,640 اما از نظر آدرس خود را، که ما ناخواسته بود لحظه ای 241 00:09:44,640 --> 00:09:48,270 پیش با کد قرمز، اما نه به مقایسه این دو 242 00:09:48,270 --> 00:09:53,210 رشته ها در مثل انسان بصری راه با مقایسه این، در برابر این، 243 00:09:53,210 --> 00:09:56,690 در برابر این، در برابر این، و پس از آن متوقف کردن اگر و وقتی که یکی از 244 00:09:56,690 --> 00:09:59,590 و یا هر دو از انگشتان من بازدید یک بک اسلش 0. 245 00:09:59,590 --> 00:10:04,530 strcmp سال پیش کسی اجرا برای پیاده سازی برای ما عملکرد 246 00:10:04,530 --> 00:10:08,890 که ما امیدوار بودیم که ما را بدست تنها با مقایسه دو مقدار ساده است. 247 00:10:08,890 --> 00:10:14,929 >> حالا رک و پوست کنده، من نگه نقاشی تمام این شماره های مختلف. 248 00:10:14,929 --> 00:10:17,470 اما واقعیت این است، من بوده ام ساخت این تا کل زمان. 249 00:10:17,470 --> 00:10:19,580 بگذارید من فقط به جلو و با شتاب نوشتن این از 250 00:10:19,580 --> 00:10:23,100 به یک نقطه که در پایان از روز و حرکت رو به جلو، 251 00:10:23,100 --> 00:10:30,160 ما واقعا نمی خواهیم درباره مراقبت چه چیزهایی در واقع آدرس 252 00:10:30,160 --> 00:10:30,790 در حافظه است. 253 00:10:30,790 --> 00:10:34,320 من می خواهم به رسم این انواع اعداد بسیار دیگر، 254 00:10:34,320 --> 00:10:38,970 من دور فقط یک چکیده این هستم کمی دوستانه تر فقط با فلش. 255 00:10:38,970 --> 00:10:42,060 >> به عبارت دیگر، اگر یک اشاره گر است، خوب، اجازه دهید فقط آن قرعه کشی، به معنای واقعی کلمه، 256 00:10:42,060 --> 00:10:45,430 به عنوان یک اشاره گر، فلش اشاره از خود به چیز دیگری، 257 00:10:45,430 --> 00:10:48,280 و نگران نباشید خیلی خیلی بیشتر در مورد minutia از این آدرس 258 00:10:48,280 --> 00:10:49,910 که، دوباره، من ساخته شده تا به هر حال. 259 00:10:49,910 --> 00:10:52,680 اما ما به این آدرس مراجعه کنید، گاهی اوقات، هنگامی که اشکال زدایی کد. 260 00:10:52,680 --> 00:10:56,450 >> در حال حاضر در عین حال، این برنامه در اینجا رفع، البته، 261 00:10:56,450 --> 00:10:58,720 این مشکل با مقایسه این دو رشته. 262 00:10:58,720 --> 00:11:00,260 اما ما به مشکل دیگری زد. 263 00:11:00,260 --> 00:11:03,180 این بود از کپی برنامه زمان آخرین، 264 00:11:03,180 --> 00:11:06,880 به موجب آن، من در تلاش بود تا سرمایه گذاری فقط اولین کاراکتر در یک رشته است. 265 00:11:06,880 --> 00:11:09,620 اما آنچه علامت بود ما آخرین زمانی که دیدم 266 00:11:09,620 --> 00:11:14,150 یک کاربر تایپ در یک ارزش، مانند گیب در کوچک، برای بازدید کنندگان، 267 00:11:14,150 --> 00:11:19,310 پس از آن ما را به بازدید کنندگان تی اختصاص داده، همانطور که در خط سوم وجود دارد، 268 00:11:19,310 --> 00:11:22,900 و پس از آن من به سعی سرمایه گذاری تی براکت 0؟ 269 00:11:22,900 --> 00:11:25,950 اثر چه بود تغییر تی براکت 0 که اینجا هستید؟ 270 00:11:25,950 --> 00:11:27,150 >> رسید این تغییر است. 271 00:11:27,150 --> 00:11:29,360 >> DAVID J. مالان: آره، من تغییر، و همچنین. 272 00:11:29,360 --> 00:11:31,050 از آنجا که واقعا چه خبر است؟ 273 00:11:31,050 --> 00:11:34,130 خوب، اجازه دهید را ببینید اگر من می توانم پاک تا این تصویر، به شرح زیر است. 274 00:11:34,130 --> 00:11:41,390 >> اگر باشد، دوباره، کلمه گرم، الف، ب، ه، بک اسلش، 0 و بازدید کنندگان 275 00:11:41,390 --> 00:11:44,084 ما طراحی به عنوان یک جعبه ادامه در اینجا، اما آدرس نه بیشتر. 276 00:11:44,084 --> 00:11:45,250 بیایید متوقف ساخت تا چیز. 277 00:11:45,250 --> 00:11:47,510 اجازه دهید فقط در قرعه کشی یک عکس برای ساده سازی جهان است. 278 00:11:47,510 --> 00:11:52,640 >> وقتی که من تی تی با رشته اعلام، که تکه از حافظه ایجاد می کند. 279 00:11:52,640 --> 00:11:55,850 میدان اتفاق می افتد به 32 بیت در بسیاری از رایانه است. 280 00:11:55,850 --> 00:11:59,530 در واقع، اگر شما تا کنون از شنیده کامپیوتر داشتن یک معماری 32 بیتی، 281 00:11:59,530 --> 00:12:03,000 واقعا علاقه داشتن به صحبت می کنند، که فقط به معنی استفاده از آدرس های 32 بیتی. 282 00:12:03,000 --> 00:12:05,370 و به عنوان یک فنی به کنار، اگر شما تا کنون فکر کرده اید 283 00:12:05,370 --> 00:12:09,630 چرا کامپیوتر های قدیمی تر، اگر شما در واقع سعی کردم به سوپ آنها را با مقدار زیادی از RAM، 284 00:12:09,630 --> 00:12:12,360 تنها می تواند حداکثر دارای از چهار گیگابایت RAM، 285 00:12:12,360 --> 00:12:14,860 خوب است که به این دلیل، به معنای واقعی کلمه، کامپیوتر قدیمی خود می تواند تنها 286 00:12:14,860 --> 00:12:17,250 تعداد عنوان بالا به عنوان 4 میلیارد، 4 میلیارد بایت، 287 00:12:17,250 --> 00:12:20,590 چرا که آن را با استفاده از 32 بیتی تعداد آدرس. 288 00:12:20,590 --> 00:12:23,260 >> اما در هر صورت، در این به عنوان مثال، داستان بسیار ساده تر. 289 00:12:23,260 --> 00:12:27,250 T فقط اشاره گر دیگری است، یا واقعا یک ستاره کاراکتر، نام رشته. 290 00:12:27,250 --> 00:12:30,860 و چگونه می توانم من می خواهم برای به روز رسانی این تصویر در حال حاضر با آن خط دوم کد، 291 00:12:30,860 --> 00:12:31,950 پس از نقطه، نقطه، نقطه؟ 292 00:12:31,950 --> 00:12:35,845 وقتی که من انجام رشته تی برابر با نقطه و ویرگول ها، چگونه این تصویر را تغییر دهید؟ 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 آره؟ 295 00:12:38,000 --> 00:12:38,916 >> رسید [نامفهوم]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> DAVID J. مالان: آره. 298 00:12:42,020 --> 00:12:42,600 دقیقا. 299 00:12:42,600 --> 00:12:45,620 من فقط از قرار دادن فلش جعبه: t به همان آدرس، 300 00:12:45,620 --> 00:12:47,570 حرف اول همان در به. 301 00:12:47,570 --> 00:12:50,850 یا از لحاظ فنی، در صورتی که این پسر هنوز در 0x1 بود، 302 00:12:50,850 --> 00:12:53,052 آن را به عنوان هر چند من تا به حال 0x1 0x1 در اینجا و اینجا. 303 00:12:53,052 --> 00:12:54,760 اما باز هم، که مراقبت در مورد آدرس؟ 304 00:12:54,760 --> 00:12:56,345 این فقط ایده که در حال حاضر مهم است. 305 00:12:56,345 --> 00:12:57,720 بنابراین این چیزی است که در اینجا اتفاق می افتد. 306 00:12:57,720 --> 00:13:02,690 پس البته، اگر شما تی براکت 0 است که نماد آرایه، 307 00:13:02,690 --> 00:13:05,650 از course-- و رک و پوست کنده، آن را به نظر می رسد مثل یک آرایه وجود دارد در اینجا، 308 00:13:05,650 --> 00:13:07,340 اما در حال حاضر این چیزی که عجیب و غریب وجود دارد. 309 00:13:07,340 --> 00:13:11,160 می دانیم که زبان برنامه نویسی، C، شما ارائه می دهد این ویژگی، 310 00:13:11,160 --> 00:13:14,650 به موجب آن، حتی اگر t است اشاره گر، یا یک اشاره گر است، 311 00:13:14,650 --> 00:13:18,050 شما هنوز هم می تواند که آشنا استفاده کنید، براکت راحت 312 00:13:18,050 --> 00:13:22,520 نماد برای رفتن به عنصر اول، یا عنصر دوم، و یا هر عنصر 313 00:13:22,520 --> 00:13:26,130 که اشاره گر اشاره به دلیل، احتمالا، آن 314 00:13:26,130 --> 00:13:29,410 است، که در این مورد، اشاره در برخی از آرایه. 315 00:13:29,410 --> 00:13:30,340 >> پس چگونه ما این مسئله را حل؟ 316 00:13:30,340 --> 00:13:33,660 صادقانه بگویم، این است که در آن آن را کردم کمی در نگاه اول خسته کننده باشد. 317 00:13:33,660 --> 00:13:35,340 اما در اینجا یک نسخه جدید و بهبود یافته است. 318 00:13:35,340 --> 00:13:37,460 >> بنابراین برای اولین بار، من گرفتن خلاص شدن از شر از کتابخانه CS50، 319 00:13:37,460 --> 00:13:41,170 فقط به افشای که این در واقع یک ستاره کاراکتر، فقط مترادف. 320 00:13:41,170 --> 00:13:43,540 و t نیز یک ستاره کاراکتر. 321 00:13:43,540 --> 00:13:48,290 اما آنچه در جریان است در سمت راست آن خط 322 00:13:48,290 --> 00:13:49,970 که در آن t تخصیص داده شده است ارزش؟ 323 00:13:49,970 --> 00:13:50,790 >> malloc چیست؟ 324 00:13:50,790 --> 00:13:51,630 چه آن را strlen؟ 325 00:13:51,630 --> 00:13:52,547 sizeof (کاراکتر) چیست؟ 326 00:13:52,547 --> 00:13:54,380 چرا هک می کند این خط نگاه خیلی پیچیده است؟ 327 00:13:54,380 --> 00:13:55,713 آن چه در سطح بالا انجام می دهند؟ 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 آن چه در تی ذخیره؟ 330 00:13:57,440 --> 00:13:58,646 آره؟ 331 00:13:58,646 --> 00:14:01,104 رسید آن اختصاص مقدار مشخصی از فضای حافظه است. 332 00:14:01,104 --> 00:14:03,032 این برای ذخیره، من حدس می زنم، نامه [نامفهوم]. 333 00:14:03,032 --> 00:14:04,032 >> DAVID J. مالان: کامل. 334 00:14:04,032 --> 00:14:04,540 کامل. 335 00:14:04,540 --> 00:14:06,650 این تخصیص خاص مقدار از فضای حافظه 336 00:14:06,650 --> 00:14:08,940 برای ذخیره، احتمالا، نامه های آینده است. 337 00:14:08,940 --> 00:14:11,310 و به طور خاص، malloc بنابراین بازگشت چه؟ 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> رسید برگشت [نامفهوم]؟ 340 00:14:14,851 --> 00:14:15,850 DAVID J. مالان: دقیقا. 341 00:14:15,850 --> 00:14:18,850 برگشت آدرس آن حافظه، که راه فانتزی گفتن است، 342 00:14:18,850 --> 00:14:21,640 آدرس گرداند اولین بایت از حافظه که. 343 00:14:21,640 --> 00:14:25,460 این مسئولیت بر دوش من به یاد داشته باشید چه مقدار حافظه من در واقع 344 00:14:25,460 --> 00:14:27,140 اختصاص داده و یا malloc خواست برای. 345 00:14:27,140 --> 00:14:28,384 >> در حال حاضر چه مقدار است؟ 346 00:14:28,384 --> 00:14:30,550 خب، حتی اگر وجود دارد بسیاری از پرانتز در اینجا، 347 00:14:30,550 --> 00:14:32,970 malloc فقط یک آرگومان می گیرد. 348 00:14:32,970 --> 00:14:37,250 و من مشخص strlen از بازدید کنندگان، به من بدهید من به عنوان بسیاری از بایت به عنوان در ها وجود دارد، 349 00:14:37,250 --> 00:14:37,800 اما یکی اضافه کنید. 350 00:14:37,800 --> 00:14:38,300 چرا؟ 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 آره؟ 353 00:14:39,530 --> 00:14:40,840 >> رسید بک اسلش 0. 354 00:14:40,840 --> 00:14:41,840 DAVID J. مالان: دقیقا. 355 00:14:41,840 --> 00:14:43,423 ما باید به انجام خانه داری کم است. 356 00:14:43,423 --> 00:14:45,970 بنابراین چون یک بک اسلش وجود دارد 0، ما بهتر است به یاد داشته باشید که. 357 00:14:45,970 --> 00:14:47,310 در غیر این صورت، ما در حال رفتن برای ایجاد یک رشته است که 358 00:14:47,310 --> 00:14:49,170 کند که نابودگر خاص ندارد. 359 00:14:49,170 --> 00:14:52,640 >> در همین حال، فقط به فوق العاده مقعد، I sizeof (کاراکتر) داشته باشد، 360 00:14:52,640 --> 00:14:55,730 فقط در مورد کسی که اجرا می شود من کد نه در دستگاه CS50، 361 00:14:55,730 --> 00:14:58,220 اما شاید یک کامپیوتر مختلف روی هم رفته که در آن کاراکتر 362 00:14:58,220 --> 00:15:01,470 یکی بایت، قرارداد، اما دو بایت، و یا چیزی بزرگتر از آن است. 363 00:15:01,470 --> 00:15:04,490 این فقط به فوق العاده، فوق العاده مخالف به خطا. 364 00:15:04,490 --> 00:15:06,940 اگر چه، در واقع، آن را به احتمال زیاد برای رفتن به یک 1. 365 00:15:06,940 --> 00:15:11,490 >> در حال حاضر، در عین حال، من پیش بروید و کپی رشته، تی براکت من برابر با تی براکت است. 366 00:15:11,490 --> 00:15:14,962 و من به آخرین هفته تسلیم خواهد کد منبع برای دیدن آنچه که اتفاق افتاده است. 367 00:15:14,962 --> 00:15:17,670 اما غذای آماده کلیدی، و دلیل من در حال حاضر در سبز قرار دادن کد، 368 00:15:17,670 --> 00:15:22,520 است چرا که خط آخر، تی براکت 0 برابر toupper، 369 00:15:22,520 --> 00:15:25,230 اثر از سرمایه گذاری که رشته؟ 370 00:15:25,230 --> 00:15:26,960 تی و / یا جدید؟ 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 این خط آخر کد. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> فقط تی، به دلیل آنچه که اتفاق افتاد این بار، 375 00:15:35,560 --> 00:15:41,500 اگر من کمی که آخرین مرحله خنثیسازی، آنچه که اتفاق افتاده است، زمانی که من malloc تماس بگیرید، 376 00:15:41,500 --> 00:15:45,380 من در اصل یک تکه از حافظه که به همان اندازه به عنوان اصلی است، 377 00:15:45,380 --> 00:15:47,020 چرا که این حساب را من انجام داد. 378 00:15:47,020 --> 00:15:50,920 من ذخیره سازی در تی آدرس آن تکه از حافظه است. 379 00:15:50,920 --> 00:15:53,370 حتی اگر این به نظر می رسد خوب است و زیبا، خوب و خالی، 380 00:15:53,370 --> 00:15:56,882 واقعیت این است که وجود دارد، آنچه که ما از شما نگه داشتن تماس، ارزش زباله در اینجا. 381 00:15:56,882 --> 00:15:59,340 این تکه از حافظه ممکن است بسیار همچنین قبل از استفاده شده است، 382 00:15:59,340 --> 00:16:00,940 چند ثانیه، چند دقیقه پیش. 383 00:16:00,940 --> 00:16:04,410 پس کاملا می تواند اعداد است یا نامه وجود دارد، فقط به طور تصادفی. 384 00:16:04,410 --> 00:16:08,580 اما آنها معتبر نیست، تا زمانی که من خودم جمعیت این تکه از حافظه 385 00:16:08,580 --> 00:16:12,510 با کاراکتر واقعی، به عنوان I در آن کار را برای حلقه وجود دارد. 386 00:16:12,510 --> 00:16:13,180 اکنون درست است؟ 387 00:16:13,180 --> 00:16:16,180 >> بنابراین در حال حاضر، نقطه اوج این سه مثال 388 00:16:16,180 --> 00:16:20,730 که به ظاهر شکسته شد زمان گذشته، این مبادله به عنوان مثال، این تابع 389 00:16:20,730 --> 00:16:23,670 به این معنا کار کرده است که آن را تعویض a و b. 390 00:16:23,670 --> 00:16:25,620 اما این کار را به چه معنا دیگر کار نمی کند؟ 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 آره؟ 393 00:16:28,614 --> 00:16:29,612 >> رسید [نامفهوم]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> DAVID J. مالان: دقیقا. 396 00:16:36,700 --> 00:16:39,530 اگر من به تماس این تابع از another-- به عنوان مثال، 397 00:16:39,530 --> 00:16:42,870 از یک تابع مانند اصلی، که در آن من یک متغیر، x و y، به عنوان I 398 00:16:42,870 --> 00:16:46,160 در هفته گذشته انجام داد، همان کد، و من در x و y عبور 399 00:16:46,160 --> 00:16:49,860 به تعویض، و پس از آن Swap-- این تماس، البته، نسخه صحیح است 400 00:16:49,860 --> 00:16:52,220 چیزی است که ما در مورد به هستی see-- آن کار نمی کند. 401 00:16:52,220 --> 00:16:53,770 پس چه ثابت است؟ 402 00:16:53,770 --> 00:16:56,850 >> خوب، بنابراین فقط به روشن، اجازه دهید من به جلو 403 00:16:56,850 --> 00:17:05,450 and-- من یکی را دوم در اینجا، و ببینید اگر من می تواند به شما یکی از آخرین، نشان می دهد که 404 00:17:05,450 --> 00:17:12,464 خواهد بود in-- بیایید ببینید اگر من می توانم پیدا کردن این OK fast-- واقعی، [نامفهوم]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK، وجود دارد آن است. 407 00:17:19,240 --> 00:17:21,000 بنابراین دستورات من فقط تایپ را نادیده گرفت. 408 00:17:21,000 --> 00:17:23,780 من می خواهم آن را به بازیابی در آخرین لحظه یک مثال 409 00:17:23,780 --> 00:17:27,960 از زمان گذشته، که در حال حاضر هیچ بهره شبانه گفته می شود. 410 00:17:27,960 --> 00:17:30,200 >> بنابراین هیچ مبادله است که در آن ما را ترک کردن زمان گذشته، 411 00:17:30,200 --> 00:17:32,930 به موجب آن، من مقدار دهی اولیه x به 1 و y به 2. 412 00:17:32,930 --> 00:17:35,840 من پس از آن تعویض تماس بگیرید، عبور در 1 و 2. 413 00:17:35,840 --> 00:17:37,930 و سپس این تابع از آن کار می کرد، 414 00:17:37,930 --> 00:17:40,750 اما تا به حال هیچ دائمی اثر بر x و y. 415 00:17:40,750 --> 00:17:45,430 بنابراین سوال در دست است، چه در حال حاضر ما در واقع این مشکل را حل کنم؟ 416 00:17:45,430 --> 00:17:47,820 راه حل چیست که در دست؟ 417 00:17:47,820 --> 00:17:53,150 >> خوب، در swap.c، جدید است که امروز، متوجه زن و شوهر از تفاوت. 418 00:17:53,150 --> 00:17:54,700 x و y با هم برابر است. 419 00:17:54,700 --> 00:17:57,250 اما آنچه به وضوح در مورد خط 25 متفاوت است؟ 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 چه جدید وجود دارد، اگر شما به یاد داشته باشید آنچه در آن مانند یک ثانیه پیش نگاه کرد؟ 422 00:18:01,715 --> 00:18:02,565 >> رسید [نامفهوم]. 423 00:18:02,565 --> 00:18:03,440 >> DAVID J. مالان: آره. 424 00:18:03,440 --> 00:18:06,680 بنابراین آمپرسندهای کاربردی یک قطعه جدید نحو نه تنها در این برنامه، 425 00:18:06,680 --> 00:18:08,560 بلکه به طور کلی در CS50. 426 00:18:08,560 --> 00:18:10,680 تا به امروز، من فکر نمی کنم ما هر نمونه دیده ام 427 00:18:10,680 --> 00:18:14,070 و یا واقعا در مورد آنها را در هر صحبت جزئیات، به غیر از، شاید، پیشگیرانه 428 00:18:14,070 --> 00:18:16,467 در بخش، یک علامت شبیه به این. 429 00:18:16,467 --> 00:18:19,300 خوب، آن را تبدیل به یک علامت است از آخرین قطعه از نحو جدید 430 00:18:19,300 --> 00:18:20,174 ما قصد داریم به یاد بگیرند. 431 00:18:20,174 --> 00:18:23,500 بلکه به معنای آن است که آدرس برخی از متغیر. 432 00:18:23,500 --> 00:18:25,070 در چه آدرس x را زندگی می کنند؟ 433 00:18:25,070 --> 00:18:26,510 اما چه آدرس سالانه زندگی می کنند؟ 434 00:18:26,510 --> 00:18:28,700 از آنجا که اگر مشکل اساسی قبل از 435 00:18:28,700 --> 00:18:32,970 شد که x و y در حال تصویب شد به عنوان نسخه، چیزی است که ما واقعا می خواهید به انجام 436 00:18:32,970 --> 00:18:38,780 است ارائه مبادله مانند یک گنج نقشه که منجر به که در آن x و y در واقع 437 00:18:38,780 --> 00:18:41,910 در RAM می باشد، به طوری که مبادله می تواند که نقشه را دنبال 438 00:18:41,910 --> 00:18:47,760 و به هر کجا که x یا y را نشانه نقطه و تغییر مقادیر واقعی 1 و 2 439 00:18:47,760 --> 00:18:48,270 وجود دارد. 440 00:18:48,270 --> 00:18:50,710 >> بنابراین تعویض نیاز به تغییر کمی بیش از حد. 441 00:18:50,710 --> 00:18:53,760 و در نگاه اول، این ممکن است به نظر می رسد کمی شبیه به ستاره کاراکتر. 442 00:18:53,760 --> 00:18:54,850 و در واقع آن است. 443 00:18:54,850 --> 00:18:59,635 بنابراین یک اشاره گر به نوع داده ای است، بر اساس این بخش را برجسته؟ 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 پس از آن اعضای هیات است. 446 00:19:01,620 --> 00:19:04,880 >> بنابراین دیگر اعضای هیات، آن آدرس یک int است. 447 00:19:04,880 --> 00:19:07,910 و به طور مشابه، ب در حال حاضر رفتن به آدرس یک int. 448 00:19:07,910 --> 00:19:12,470 بنابراین، هنگامی که من در حال حاضر تماس مبادله از بخش اصلی، من قصد ندارم که به مبادله 1 و 2. 449 00:19:12,470 --> 00:19:15,540 من قصد دارم به آن را مانند را گاو نر، گاو نر و چیزی چیزی، 450 00:19:15,540 --> 00:19:19,820 دو آدرس که منجر خواهد شد تعویض به مکان واقعی خود را 451 00:19:19,820 --> 00:19:21,310 در حافظه کامپیوتر من است. 452 00:19:21,310 --> 00:19:25,580 >> بنابراین در حال حاضر، اجرای باقی مانده من نیاز به تغییر یک بچه کوچک. 453 00:19:25,580 --> 00:19:28,650 چه به وضوح های مختلف در حال حاضر در این سه خط کد؟ 454 00:19:28,650 --> 00:19:31,350 است این ستاره لعنتی همه وجود دارد جا، همه حق است؟ 455 00:19:31,350 --> 00:19:33,014 پس چه خبر است اینجا؟ 456 00:19:33,014 --> 00:19:33,514 آره؟ 457 00:19:33,514 --> 00:19:35,055 >> رسید آن است بدیهی است [نامفهوم]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> DAVID J. مالان: دقیقا. 460 00:19:37,990 --> 00:19:41,560 بنابراین در این context-- و این بود بهترین تصمیم، طراحی، مسلما، 461 00:19:41,560 --> 00:19:42,530 سال پیش. 462 00:19:42,530 --> 00:19:45,110 در این زمینه، که در آن شما فقط باید یک ستاره، 463 00:19:45,110 --> 00:19:48,240 و شما یک نوع داده را نداشته باشند، برای مثال، int، بلافاصله به سمت چپ، 464 00:19:48,240 --> 00:19:53,146 به جای شما یک علامت مساوی، به وضوح، در این زمینه، زمانی که به شما می گویند ستاره، 465 00:19:53,146 --> 00:19:56,980 این بدان معناست که به آدرس که در یک. 466 00:19:56,980 --> 00:19:58,870 دنبال نقشه گنج، پس به صحبت می کنند. 467 00:19:58,870 --> 00:20:01,720 >> و در عین حال، در خط 37، به این معنی همان چیزی که. 468 00:20:01,720 --> 00:20:05,460 برو به آدرس، و آنچه وجود دارد؟ 469 00:20:05,460 --> 00:20:09,520 هر چه باشد در مکانی که ب مشخص می کند. 470 00:20:09,520 --> 00:20:10,980 به عبارت دیگر، به ب. 471 00:20:10,980 --> 00:20:12,130 دریافت که ارزش. 472 00:20:12,130 --> 00:20:15,620 برو به و، در برابر ثبت نام، عملگر انتساب، 473 00:20:15,620 --> 00:20:17,010 قرار داده است که ارزش وجود دارد. 474 00:20:17,010 --> 00:20:19,272 >> به طور مشابه، دمای هوشمند فقط برای اعضای هیات است. 475 00:20:19,272 --> 00:20:20,730 هیچ چیز در مورد نیاز به درجه حرارت تغییر می کند. 476 00:20:20,730 --> 00:20:24,810 این فقط یک شیشه یدکی از آننبرگ است برای برخی از شیر یا آب پرتقال. 477 00:20:24,810 --> 00:20:27,630 اما من نیازی به گفتن نیست، به ب. 478 00:20:27,630 --> 00:20:31,449 برو به مقصد و قرار دادن مقدار در دمای وجود دارد. 479 00:20:31,449 --> 00:20:32,490 پس چه اتفاقی می افتد و سپس؟ 480 00:20:32,490 --> 00:20:36,540 هنگامی که من در واقع تماس بگیرید تعویض این زمان، اگر این سینی اولین بار در اینجا نشان دهنده اصلی، 481 00:20:36,540 --> 00:20:42,270 این سینی دوم نشان دهنده مبادله، هنگامی که I عبور علامت x و y را علامت 482 00:20:42,270 --> 00:20:47,150 از بخش اصلی به تعویض، فقط به روشن، چه این پشته قاب دریافت است؟ 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 آره؟ 485 00:20:49,200 --> 00:20:50,180 >> رسید [نامفهوم]. 486 00:20:50,180 --> 00:20:51,180 DAVID J. مالان: دقیقا. 487 00:20:51,180 --> 00:20:53,129 آدرس x و آدرس y است. 488 00:20:53,129 --> 00:20:55,170 و شما می توانید از این فکر می کنم مانند آدرس پستی. 489 00:20:55,170 --> 00:20:58,772 33 خیابان آکسفورد و 35 خیابان آکسفورد، و شما 490 00:20:58,772 --> 00:21:01,230 می خواهم به حرکت دو ساختمان که در آن محل می باشد. 491 00:21:01,230 --> 00:21:04,680 >> این نوع از ایده مضحک است. اما همه ما با آدرس معنا است. 492 00:21:04,680 --> 00:21:07,000 از کجا در جهان می تواند شما این دو نوع داده int پیدا کردن؟ 493 00:21:07,000 --> 00:21:09,470 از کجا در جهان می تواند به شما پیدا کردن این دو ساختمان؟ 494 00:21:09,470 --> 00:21:15,170 بنابراین اگر در نهایت، بعد از همه ی این مدت من رفتن به کد منبع و کامپایل امروز 495 00:21:15,170 --> 00:21:22,110 تعویض و اجرا ./swap، در نهایت، برای اولین بار ما در واقع می بینیم که 496 00:21:22,110 --> 00:21:25,330 ارزش من در واقع با موفقیت جابجا شده است. 497 00:21:25,330 --> 00:21:30,860 و در حال حاضر، ما حتی می تواند توجه داشته باشید از این در، می گویند، از gdb. 498 00:21:30,860 --> 00:21:32,740 >> بنابراین، اجازه دهید به همان فایل را به. 499 00:21:32,740 --> 00:21:35,010 اجازه بدهید من به جلو و اجرا از gdb از ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 و در حال حاضر، در مبادله، من قصد دارم به جلو و نقطه شکست در بخش اصلی تنظیم شده است. 502 00:21:40,547 --> 00:21:42,630 و در حال حاضر من قصد دارم به پیش رو و برنامه را اجرا کنید. 503 00:21:42,630 --> 00:21:45,810 و در حال حاضر ما کد من را ببینید که در آن خط متوقف شد. 504 00:21:45,810 --> 00:21:48,330 >> اگر من به جلو و چاپ x و آنچه که باید در اینجا ببینید I؟ 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 این یک سوال است. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 بگو دوباره؟ 509 00:21:51,530 --> 00:21:52,295 >> رسید [نامفهوم]. 510 00:21:52,295 --> 00:21:53,910 >> DAVID J. مالان: پس اعداد تصادفی، شاید. 511 00:21:53,910 --> 00:21:56,010 شاید من خوش شانس، و آن را زیبا و ساده، مثل 0. 512 00:21:56,010 --> 00:21:57,230 اما شاید برخی از آن عدد تصادفی است. 513 00:21:57,230 --> 00:21:58,090 در این مورد، من خوش شانس. 514 00:21:58,090 --> 00:21:59,030 این فقط اتفاق می افتد به 0. 515 00:21:59,030 --> 00:22:00,780 اما در واقع شانس، چون تا زمانی که من 516 00:22:00,780 --> 00:22:06,280 نوع بعدی و سپس چاپ ایکس است که خط از کد، خط 19، اعدام شده اند. 517 00:22:06,280 --> 00:22:10,942 >> در همین حال، اگر نوع I بعد دوباره، و در حال حاضر چاپ از سال، من قصد دارم برای دیدن 2. 518 00:22:10,942 --> 00:22:13,900 حال اگر نوع I بعد، آن را به یک کمی گیج کننده است، چرا که در حال حاضر، 519 00:22:13,900 --> 00:22:17,250 تابع () printf است که به نظر می رسد در صفحه نمایش، به عنوان آن را انجام داد. * 1 است. 520 00:22:17,250 --> 00:22:18,606 >> اجازه دهید این را دوباره انجام دهید. 521 00:22:18,606 --> 00:22:20,480 و در حال حاضر، در اینجا است که همه چیز جالب است. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 قبل از اینکه من تعویض و یا حتی مرحله تماس بگیرید به آن، اجازه دهید زیرچشمی نگاه کردن کم است. 524 00:22:26,580 --> 00:22:28,980 x باشد، دوباره، 1. 525 00:22:28,980 --> 00:22:33,240 Y است، البته، سلامت عقل سریع چک، 2، خیلی سخت نیست. 526 00:22:33,240 --> 00:22:35,740 اما آنچه علامت x است؟ 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 جواب، آن را به نوع بد بو به دنبال. 529 00:22:39,350 --> 00:22:43,500 اما ستاره int در پرانتز فقط راه تولید ناخالص داخلی از گفتن این آدرس است. 530 00:22:43,500 --> 00:22:48,290 این نه یک int، آن را به یک اشاره گر به یک است اعضای هیات، و یا در غیر این صورت به عنوان یک آدرس شناخته شده است. 531 00:22:48,290 --> 00:22:49,742 >> این چیزی که دیوانه چیست؟ 532 00:22:49,742 --> 00:22:51,825 ما چیزی ندیده ام کاملا مانند که قبل از. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 پس این آدرس را در کامپیوتر من است حافظه که x اتفاق می افتد به زندگی می کنند. 535 00:22:58,120 --> 00:22:59,040 این گاو نر چیزی است. 536 00:22:59,040 --> 00:23:01,290 و این است، رک و پوست کنده، چرا من آغاز شده ام طراحی فلش، 537 00:23:01,290 --> 00:23:03,340 به جای اعداد، چون که واقعا اهمیت بده 538 00:23:03,340 --> 00:23:06,890 که اعضای هیات خود را در یک خاص آدرس این است که بزرگ است. 539 00:23:06,890 --> 00:23:12,160 اما bffff0c4، این ها همه در واقع اعداد هگزادسیمال، 540 00:23:12,160 --> 00:23:13,720 که از طریق اف می باشد 0. 541 00:23:13,720 --> 00:23:16,590 >> بنابراین ما نمی پردازد بیش از حد طولانی درباره این چیزها می شود. 542 00:23:16,590 --> 00:23:19,400 اما اگر من نسخه قابل چاپ کردن سال، البته، من 2. 543 00:23:19,400 --> 00:23:22,440 اما بصورت سالانه، من این آدرس مراجعه کنید. 544 00:23:22,440 --> 00:23:26,527 و توجه کنید، برای کنجکاو، چگونه دور از هم x و y هستند؟ 545 00:23:26,527 --> 00:23:27,985 شما می توانید از آدرس را نادیده گرفت. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 چهار بایت. 548 00:23:29,920 --> 00:23:33,510 و این سازگار با ما پیش از آن ادعا می کنند که یک int چقدر بزرگ است؟ 549 00:23:33,510 --> 00:23:34,130 چهار بایت. 550 00:23:34,130 --> 00:23:37,420 پس آن را مانند پوشش همه چیز را تا به نظر می رسد سادگی، به عنوان شما ممکن است امیدوارم، در حافظه است. 551 00:23:37,420 --> 00:23:40,010 >> بنابراین در حال حاضر، اجازه دهید فقط سریع به جلو به پایان این داستان. 552 00:23:40,010 --> 00:23:43,290 اجازه دهید به پیش بروید و تایپ مرحله، به شیرجه رفتن به تابع تعویض. 553 00:23:43,290 --> 00:23:46,880 حالا متوجه، اگر من تایپ، آن را یکسان به آدرس x را. 554 00:23:46,880 --> 00:23:52,130 اگر من نوع ب، آن را یکسان به آدرس y است. 555 00:23:52,130 --> 00:23:57,020 پس چه باید اگر من I می گویند، به آدرس بروید؟ 556 00:23:57,020 --> 00:23:58,120 بنابراین چاپ ستاره. 557 00:23:58,120 --> 00:24:00,130 بنابراین ستاره به معنی رفتن وجود دارد، در این زمینه. 558 00:24:00,130 --> 00:24:02,730 علامت به معنی چیزی است که آدرس است. 559 00:24:02,730 --> 00:24:05,000 بنابراین ستاره به معنی 1. 560 00:24:05,000 --> 00:24:09,590 و ستاره چاپ ب من می دهد 2. 561 00:24:09,590 --> 00:24:15,750 >> و اجازه دهید فرض کنیم، برای لحظه ای، که حداقل کد که 562 00:24:15,750 --> 00:24:18,950 درآمد حاصل از اجرای هم اکنون می توانید از طریق در راه است که استدلال. 563 00:24:18,950 --> 00:24:21,150 اما ما این ایده را قبل از اینکه طولانی دوباره. 564 00:24:21,150 --> 00:24:23,850 بنابراین این نسخه از تعویض در حال حاضر صحیح و اجازه می دهد تا 565 00:24:23,850 --> 00:24:26,650 ما به مبادله این نوع داده خاص است. 566 00:24:26,650 --> 00:24:29,120 >> بنابراین هر گونه سوال پس از آن در تعویض؟ 567 00:24:29,120 --> 00:24:29,890 در ستاره؟ 568 00:24:29,890 --> 00:24:30,690 در آدرس؟ 569 00:24:30,690 --> 00:24:33,270 و شما می بینید، با مشکل تنظیم 4، نوع، 570 00:24:33,270 --> 00:24:37,310 اما مشکل مجموعه 5، قطعا، این که چگونه این چیزهای مفید می باشد و خیلی بیشتر 571 00:24:37,310 --> 00:24:39,584 راحت با آنها، به عنوان یک نتیجه. 572 00:24:39,584 --> 00:24:40,430 در همه هر چیزی؟ 573 00:24:40,430 --> 00:24:40,930 خوب. 574 00:24:40,930 --> 00:24:44,350 بنابراین malloc است، باز هم، این تابع که فقط اختصاص حافظه، حافظه 575 00:24:44,350 --> 00:24:45,330 تخصیص. 576 00:24:45,330 --> 00:24:47,024 و چرا این مفید است؟ 577 00:24:47,024 --> 00:24:48,940 خب، تمام این مدت، شما شده است با استفاده از malloc. 578 00:24:48,940 --> 00:24:52,230 اگر شما در نظر در حال حاضر چگونه getString آثار، احتمالا، آن را 579 00:24:52,230 --> 00:24:56,140 درخواست شده کسی که برای یک تکه از حافظه، در هر زمان که کاربر در انواع رشته 580 00:24:56,140 --> 00:24:59,040 در، چرا که ما قطعا نمی دانم، به عنوان کارکنان CS50، 581 00:24:59,040 --> 00:25:02,710 چگونه این رشته بزرگ است که انسان در حال رفتن به تایپ ممکن است. 582 00:25:02,710 --> 00:25:07,910 >> بنابراین اجازه دهید، برای اولین بار، شروع به پوست پشت چگونه کار کتابخانه CS50، 583 00:25:07,910 --> 00:25:10,990 از طریق چند مثال که به ما وجود دارد منجر شود. 584 00:25:10,990 --> 00:25:15,300 بنابراین اگر باز کنم تا gedit و باز کردن scanf 0، 585 00:25:15,300 --> 00:25:17,055 ما در حال رفتن برای دیدن کد زیر. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0، در دسترس در وب سایت برای امروز، است نسبتا چند خط کد 588 00:25:23,530 --> 00:25:25,351 در اینجا، 14 تا 20. 589 00:25:25,351 --> 00:25:26,600 و اجازه دهید ببینیم که چه چیزی آن را انجام می دهند. 590 00:25:26,600 --> 00:25:28,920 اعلام اعضای هیات، به نام ایکس. 591 00:25:28,920 --> 00:25:30,850 این گزارش می گوید چیزی شبیه به، تعداد، لطفا. 592 00:25:30,850 --> 00:25:33,940 و در حال حاضر آن را می گوید، scanf٪ من، و ایکس. 593 00:25:33,940 --> 00:25:35,620 پس یک دسته از مسائل جدید وجود دارد وجود دارد. 594 00:25:35,620 --> 00:25:38,420 >> اما scanf، شما نوع می تواند فکر می کنم به عنوان مخالف از تابع () printf. 595 00:25:38,420 --> 00:25:40,090 تابع () printf، البته، چاپ به روی صفحه نمایش. 596 00:25:40,090 --> 00:25:44,410 مرتب کردن بر اساس scanf اسکن از کاربر صفحه کلید چیزی که او تایپ کرده است. 597 00:25:44,410 --> 00:25:46,550 >> ٪ من درست مثل تابع () printf است. 598 00:25:46,550 --> 00:25:49,410 این به این معنی انتظار کاربر برای تایپ هوشمند. 599 00:25:49,410 --> 00:25:52,820 و در حال حاضر، چرا شما فکر می کنم من ممکن است عبور از scanf و ایکس؟ 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 اگر هدف در زندگی از scanf است به چیزی از کاربر، 602 00:25:57,770 --> 00:26:02,480 چه معنی است انتقال آن، و x و در حال حاضر؟ 603 00:26:02,480 --> 00:26:02,980 آره؟ 604 00:26:02,980 --> 00:26:03,896 >> رسید [نامفهوم]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 DAVID J. مالان: دقیقا. 607 00:26:06,540 --> 00:26:12,900 هر چه من، انسان، تایپ، ورودی من قرار است در آن مکان ذخیره شود. 608 00:26:12,900 --> 00:26:17,660 این کافی نیست، به یاد می آورند، به تنها عبور در x، چرا که ما قبلا دیده ام، 609 00:26:17,660 --> 00:26:21,630 هر زمان که شما فقط یک متغیر اولیه عبور می کند، مانند یک int، به برخی از عملکرد های دیگر، 610 00:26:21,630 --> 00:26:25,640 مطمئن شوید، آن را می توانید تغییر دهید که متغیر، اما نه به طور دائم. 611 00:26:25,640 --> 00:26:27,360 این می تواند یک اثر در بخش اصلی ندارد. 612 00:26:27,360 --> 00:26:29,420 این فقط می تواند کپی های محلی خود را تغییر دهید. 613 00:26:29,420 --> 00:26:32,560 اما اگر به جای آن شما باید انجام دهید من اعضای هیات واقعی را، 614 00:26:32,560 --> 00:26:36,640 اما شما به من جهت دادن به که اعضای هیات، من در حال حاضر، در حال scanf، 615 00:26:36,640 --> 00:26:41,050 مطمئنا، من به دنبال که آدرس قرار داده و تعداد وجود دارد 616 00:26:41,050 --> 00:26:43,280 بنابراین شما به آن دسترسی دارند. 617 00:26:43,280 --> 00:26:45,120 >> بنابراین، هنگامی که من این برنامه را اجرا کنید، اجازه دهید را ببینید. 618 00:26:45,120 --> 00:26:49,660 را scanf 0 نقطه اسلش، scanf 0. 619 00:26:49,660 --> 00:26:54,030 و اگر من در حال حاضر تعداد نوع مانند 50، با تشکر برای 50. 620 00:26:54,030 --> 00:26:58,150 اگر من در حال حاضر یک عدد مانند نوع منفی 1، برای منفی 1. 621 00:26:58,150 --> 00:27:04,200 من در حال حاضر تعداد نوع مانند 1.5، HM. 622 00:27:04,200 --> 00:27:06,030 چرا برنامه من به من چشم پوشی است؟ 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 خوب، به دلیل سادگی، به من گفته آن را به انتظار یک int تنها. 625 00:27:09,880 --> 00:27:10,380 خوب. 626 00:27:10,380 --> 00:27:11,630 به طوری که یک نسخه از این است. 627 00:27:11,630 --> 00:27:16,600 اجازه دهید همه چیز را تا درجه یک و پیشنهاد می کنند که این خوب نیست. 628 00:27:16,600 --> 00:27:20,530 و در اینجا نهفته است یک مثال بسیار ساده چگونه ما می توانیم نوشتن کد شروع 629 00:27:20,530 --> 00:27:24,450 که افراد دیگر می توانند بهره برداری و یا سازش با انجام کارهای بد. 630 00:27:24,450 --> 00:27:28,336 بنابراین خط 16، به طوری مشابه در روح به قبل، 631 00:27:28,336 --> 00:27:29,960 اما من اعلام آن اعضای هیات این زمان. 632 00:27:29,960 --> 00:27:32,970 من اعلام آن ستاره کاراکتر، نام رشته. 633 00:27:32,970 --> 00:27:35,190 >> اما آنچه که واقعا چیست؟ 634 00:27:35,190 --> 00:27:38,790 بنابراین اگر من address-- مشخص نیست و من خواستار آن خودسرانه، بافر، 635 00:27:38,790 --> 00:27:43,370 اما من می توانم به آن ها، به simple-- و پس از آن من این کار را، به من توضیح دهد، 636 00:27:43,370 --> 00:27:48,630 اگر شما می توانید، بر اساس قبلی منطق، آنچه که scanf در خط 18 انجام می دهند، 637 00:27:48,630 --> 00:27:55,000 اگر پاس٪ و بافر، یک آدرس است که؟ 638 00:27:55,000 --> 00:27:58,210 scanf چیست، اگر شما درخواست همین منطق دقیق آن به عنوان نسخه 0، 639 00:27:58,210 --> 00:28:00,640 سعی به انجام این کار در اینجا، هنگامی که چیزی انواع کاربر در؟ 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 آره؟ 642 00:28:03,409 --> 00:28:04,407 >> رسید [نامفهوم]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> DAVID J. مالان: دقیقا. 645 00:28:08,890 --> 00:28:11,577 Scanf، با منطق پیش از آن، می گذرد را به رشته 646 00:28:11,577 --> 00:28:13,410 که تایپ انسان in-- آن در حال حاضر یک رشته، 647 00:28:13,410 --> 00:28:15,790 این تعداد نیست، احتمالا، اگر او cooperates-- 648 00:28:15,790 --> 00:28:19,310 و آن را به تلاش برای قرار دادن که رشته در حافظه در هر آدرس 649 00:28:19,310 --> 00:28:20,340 بافر مشخص می کند. 650 00:28:20,340 --> 00:28:23,870 و این فوق العاده است، چرا که بافر در واقع به معنای به یک آدرس. 651 00:28:23,870 --> 00:28:30,470 >> اما من ادعا می کنند این برنامه حشره دار در است راه بسیار جدی است، زیرا آنچه ارزش است 652 00:28:30,470 --> 00:28:31,330 بافر به طور پیش فرض؟ 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 چه من را به مقداردهی اولیه؟ 655 00:28:34,790 --> 00:28:35,770 چه تکه از حافظه؟ 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 من، درست است؟ 658 00:28:38,620 --> 00:28:42,265 >> بنابراین حتی اگر من اختصاص داده ام ستاره کاراکتر است که به نام دیگر است، 659 00:28:42,265 --> 00:28:48,030 آن را به جای نام، buffer-- تا اجازه دهید نام آن در آرگومان رسم 660 00:28:48,030 --> 00:28:53,380 در حال حاضر به عنوان buffer-- اگر من ندارد نام getString یا malloc در اینجا، 661 00:28:53,380 --> 00:28:56,030 که بدان معنی است که بافر فقط برخی از ارزش زباله است. 662 00:28:56,030 --> 00:28:57,030 >> در حال حاضر به چه معنا است؟ 663 00:28:57,030 --> 00:29:00,220 این بدان معنی است که من scanf گفته اند به انتظار یک رشته از کاربر. 664 00:29:00,220 --> 00:29:01,300 و شما می دانید چه؟ 665 00:29:01,300 --> 00:29:03,883 هر چه این چیز اشاره شده است to-- و من علامت سوال قرعه کشی، 666 00:29:03,883 --> 00:29:07,060 اما در واقعیت، آن را به چیزی شبیه به OX1، 2، 3، درست است؟ 667 00:29:07,060 --> 00:29:10,730 این برخی از ارزش های ساختگی است که فقط اتفاق می افتد وجود داشته باشد از قبل. 668 00:29:10,730 --> 00:29:13,440 پس راه دیگری قرار داده، آن را هر چند به عنوان بافر است فقط 669 00:29:13,440 --> 00:29:16,180 اشاره به چیزی در حافظه است. 670 00:29:16,180 --> 00:29:17,610 من هیچ ایده چه چیزی. 671 00:29:17,610 --> 00:29:24,130 >> بنابراین اگر در گیب نوع I در حال حاضر، آن را به منظور تلاش برای قرار دادن گرم ب ه / 0 وجود دارد. 672 00:29:24,130 --> 00:29:25,530 اما چه کسی می داند چه چیزی است؟ 673 00:29:25,530 --> 00:29:27,480 و در گذشته، هر زمان ما سعی در لمس 674 00:29:27,480 --> 00:29:29,770 حافظه که بدان تعلق ندارند به ما، چه اتفاقی افتاده است؟ 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 یا تقریبا در هر زمان. 677 00:29:32,870 --> 00:29:34,310 گسل تقسیم بندی، درست است؟ 678 00:29:34,310 --> 00:29:37,829 >> این فلش، من هیچ نظری ندارم که در آن آن را اشاره. آن را فقط به برخی از ارزش های تصادفی. 679 00:29:37,829 --> 00:29:40,370 و البته، اگر شما تفسیر یک مقدار تصادفی به عنوان آدرس، 680 00:29:40,370 --> 00:29:42,610 شما در حال رفتن به رفتن به برخی از قسمت های تصادفی. 681 00:29:42,610 --> 00:29:46,810 بنابراین گیب ممکن است در واقع سقوط برنامه های من در این مورد اینجا. 682 00:29:46,810 --> 00:29:50,600 >> پس چه می توانیم بکنیم که تقریبا به عنوان بد؟ 683 00:29:50,600 --> 00:29:52,660 در نظر بگیرید این سوم و به عنوان مثال نهایی از scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 این نسخه به چه معنا بهتر است؟ 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 اگر شما احساس راحتی با می مشکل قبلی، این بهتر است. 688 00:30:01,400 --> 00:30:02,250 چرا؟ 689 00:30:02,250 --> 00:30:03,250 >> رسید [نامفهوم]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 DAVID J. مالان: خوب. 692 00:30:07,110 --> 00:30:09,970 بنابراین این مورد از خط 16 بهتر است، به این معنا 693 00:30:09,970 --> 00:30:12,030 که ما به صراحت می تخصیص حافظه. 694 00:30:12,030 --> 00:30:14,190 ما با استفاده از نه malloc، ما با استفاده از هفته 2 695 00:30:14,190 --> 00:30:16,060 رویکرد فقط اعلام یک آرایه. 696 00:30:16,060 --> 00:30:18,130 و ما قبل از آن یک رشته گفته ام فقط یک آرایه از کاراکتر ها است، 697 00:30:18,130 --> 00:30:19,690 پس این کاملا مشروع است. 698 00:30:19,690 --> 00:30:22,910 اما، البته، به عنوان شما توجه داشته باشید، اندازه ثابت، 16. 699 00:30:22,910 --> 00:30:25,440 >> پس این برنامه است کاملا بی خطر، اگر نوع I 700 00:30:25,440 --> 00:30:29,760 در رشته های یکی از شخصیت ها، دو شخصیت رشته ها، 15 رشته کاراکتر. 701 00:30:29,760 --> 00:30:34,970 اما به محض این که من شروع به تایپ 16، 17، 18، 1000 رشته کاراکتر، 702 00:30:34,970 --> 00:30:37,390 که در آن است که رشته رفتن برای پایان دادن به؟ 703 00:30:37,390 --> 00:30:39,570 آن را برای پایان دادن به تا حدی به اینجا. 704 00:30:39,570 --> 00:30:42,820 اما پس از آن که چه چیز دیگری می داند است فراتر از مرزهای 705 00:30:42,820 --> 00:30:44,270 از این آرایه خاصی را دارد؟ 706 00:30:44,270 --> 00:30:48,015 >> این را به عنوان اینکه من اعلام 16 جعبه اینجا. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 بنابراین به جای بیرون کشیدن از تمام 16، ما فقط وانمود که من کشیده ام 16. 709 00:30:52,690 --> 00:30:56,540 اما اگر من سپس سعی کنید به خواندن یک رشته که بسیار طولانی، مانند 50 حرف، 710 00:30:56,540 --> 00:31:01,270 من قصد دارم برای شروع قرار دادن الف، ب، ج، د، x و y و z. 711 00:31:01,270 --> 00:31:04,916 و این است که احتمالا برخی از بخش دیگری از حافظه 712 00:31:04,916 --> 00:31:06,790 که، دوباره، ممکن است باعث شود برنامه من به سقوط، 713 00:31:06,790 --> 00:31:10,600 چون من خواسته ام هر چیزی بیشتر از 16 بایت. 714 00:31:10,600 --> 00:31:12,260 >> پس چه کسی اهمیت میدهد؟ 715 00:31:12,260 --> 00:31:13,880 خوب، در اینجا کتابخانه CS50 است. 716 00:31:13,880 --> 00:31:17,220 و بیشتر از این است که فقط مانند دستورالعمل تا بالا. 717 00:31:17,220 --> 00:31:21,670 کتابخانه CS50، تمام این مدت، تا به این خط در خط 52 بود. 718 00:31:21,670 --> 00:31:23,680 ما typedef دیده می شود، و یا شما typedef را ببینید 719 00:31:23,680 --> 00:31:27,930 در pset 4، که فقط ایجاد یک مترادف به موجب آن ستاره کاراکتر می تواند بیشتر 720 00:31:27,930 --> 00:31:29,290 به سادگی به عنوان رشته شناخته می شود. 721 00:31:29,290 --> 00:31:31,540 پس این یکی از است چند چرخ آموزش 722 00:31:31,540 --> 00:31:34,120 ما مخفیانه در زیر هود استفاده می شود. 723 00:31:34,120 --> 00:31:36,490 >> در همین حال، در اینجا تابع است، getchar. 724 00:31:36,490 --> 00:31:38,190 در حال حاضر ظاهرا، به آن هیچ بدن وجود دارد. 725 00:31:38,190 --> 00:31:40,273 و در واقع، اگر من نگه دارید پیمایش، من در واقع نه 726 00:31:40,273 --> 00:31:42,080 هر گونه پیاده سازی را مشاهده کنید از این توابع. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 در بررسی سلامت عقل، به همین دلیل است که؟ 729 00:31:45,516 --> 00:31:46,795 >> رسید [نامفهوم]. 730 00:31:46,795 --> 00:31:47,670 DAVID J. مالان: آره. 731 00:31:47,670 --> 00:31:48,950 پس این فایل هدر است. 732 00:31:48,950 --> 00:31:52,520 و فایل های هدر شامل نمونه های اولیه، به علاوه برخی از چیزهای دیگر، به نظر می رسد، 733 00:31:52,520 --> 00:31:53,780 مانند typedefs. 734 00:31:53,780 --> 00:31:56,910 اما در CS50.c، که ما کرده ایم هرگز به شما داده آشکار، 735 00:31:56,910 --> 00:32:02,100 اما در دستگاه CS50 تمام شده است این زمان، درون پوشه آن، 736 00:32:02,100 --> 00:32:04,990 توجه کنید که یک کل وجود دارد دسته از توابع در اینجا. 737 00:32:04,990 --> 00:32:06,720 >> در واقع، اجازه دهید در پایین حرکت. 738 00:32:06,720 --> 00:32:08,810 اجازه دهید بسیاری از آنها را نادیده بگیرد، در حال حاضر. 739 00:32:08,810 --> 00:32:12,670 اما جواب را در getInt و ببینید که چگونه کار می کند getInt. 740 00:32:12,670 --> 00:32:13,890 بنابراین در اینجا getInt است. 741 00:32:13,890 --> 00:32:17,727 و اگر شما واقعا هرگز به مراقبت چگونه دریافت اعضای هیات کار می کند، در اینجا مستندات خود را است. 742 00:32:17,727 --> 00:32:19,560 و در میان همه چیز آن را می گوید آن را به شما می گوید 743 00:32:19,560 --> 00:32:21,340 چه محدوده از ارزش های آن را می توانید بازگشت. 744 00:32:21,340 --> 00:32:24,400 این اساسا منفی 2 میلیارد به مثبت 2 میلیارد، دادن یا گرفتن. 745 00:32:24,400 --> 00:32:26,420 >> و معلوم، این همه زمان، حتی اگر ما هیچ وقت 746 00:32:26,420 --> 00:32:28,570 بود که شما برای آن را بررسی کنید، اگر چیزی را اشتباه می رود، 747 00:32:28,570 --> 00:32:30,680 معلوم است که همه این زمان، getInt است 748 00:32:30,680 --> 00:32:33,600 شده است از بازگشت ویژه ثابت، نه تهی، 749 00:32:33,600 --> 00:32:36,760 بلکه int_max، که کنوانسیون فقط یک برنامه نویس است. 750 00:32:36,760 --> 00:32:38,846 این بدان معنی است اینجا یک مقدار خاص است. 751 00:32:38,846 --> 00:32:41,470 اطمینان حاصل کنید که برای این بررسی، فقط در مورد چیزی را اشتباه می رود. 752 00:32:41,470 --> 00:32:43,261 اما ما هرگز ناراحت کرده ام با که تا به امروز، 753 00:32:43,261 --> 00:32:45,200 دلیل دیگر، این به معنای ساده. 754 00:32:45,200 --> 00:32:46,950 >> اما چگونه getInt دریافت اجرا؟ 755 00:32:46,950 --> 00:32:48,450 خب، یک، آن را بدون آرگومان می گیرد. 756 00:32:48,450 --> 00:32:49,390 ما می دانیم که. 757 00:32:49,390 --> 00:32:50,820 این یک int برمی گرداند. 758 00:32:50,820 --> 00:32:51,950 ما می دانیم که. 759 00:32:51,950 --> 00:32:54,460 پس چگونه آن را در زیر هود کار می کند؟ 760 00:32:54,460 --> 00:32:58,290 >> پس ظاهرا بی نهایت وجود دارد حلقه، لااقل در ظاهر از یک. 761 00:32:58,290 --> 00:33:00,290 توجه کنید که ما با استفاده از getString. 762 00:33:00,290 --> 00:33:04,000 به طوری که جالب است. getInt فراخوانی تابع خود ما، getString. 763 00:33:04,000 --> 00:33:05,645 و در حال حاضر به همین دلیل ممکن است که این مورد باشد؟ 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 چرا من دفاعی بودن در اینجا در خط 165؟ 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 چه چیزی می تواند در خط اتفاق می افتد 164، فقط به روشن باشد؟ 768 00:33:15,639 --> 00:33:16,930 این پاسخ مانند قبل است. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 ممکن است فقط از حافظه باشد. 771 00:33:20,089 --> 00:33:23,130 چیزی را اشتباه می رود با getString، ما باید قادر به آن است. 772 00:33:23,130 --> 00:33:27,070 و دلیل من بر نمی گرداند تهی است که، از نظر فنی، پوچ یک اشاره گر است. 773 00:33:27,070 --> 00:33:29,120 getInt را به بازگشت یک int. 774 00:33:29,120 --> 00:33:31,060 بنابراین من خودسرانه تصمیم گرفت، در اصل، 775 00:33:31,060 --> 00:33:34,600 که 2 میلیارد، دادن یا گرفتن، در جریان است به یک ارزش ویژه ای است که من هرگز می تواند 776 00:33:34,600 --> 00:33:35,970 در واقع از کاربر دریافت کنید. 777 00:33:35,970 --> 00:33:39,930 این فقط یک مقدار من قصد دارم در به هدر برای نشان دادن یک کد خطا. 778 00:33:39,930 --> 00:33:41,540 >> بنابراین در حال حاضر، همه چیز یک فانتزی کم است. 779 00:33:41,540 --> 00:33:44,670 و آن را کاملا تابع یکسان نیست به عنوان قبل از، اما آن را بسیار مشابه است. 780 00:33:44,670 --> 00:33:50,120 بنابراین متوجه، من در اینجا اعلام، در خط 172، هر دو نفر اعضای هیات و کاراکتر ج. 781 00:33:50,120 --> 00:33:53,600 و پس از آن من استفاده از این خط بد بو، sscanf، که آن را تبدیل 782 00:33:53,600 --> 00:33:55,990 یک رشته از صفحه کلید اسکن نیست. 783 00:33:55,990 --> 00:33:59,226 این غرفه یک رشته موجود است که کاربر در حال حاضر در تایپ. 784 00:33:59,226 --> 00:34:02,100 بنابراین من در حال حاضر به نام getString، که یعنی من یک رشته در حافظه است. 785 00:34:02,100 --> 00:34:05,020 sscanf چیزی است که شما می خواهم یک تابع تجزیه تماس بگیرید. 786 00:34:05,020 --> 00:34:07,760 این در رشته من به نظر می رسد تایپ در، شخصیت های شخصیت، 787 00:34:07,760 --> 00:34:09,250 و چیزی مفید است. 788 00:34:09,250 --> 00:34:10,969 این رشته در خط ذخیره می شود. 789 00:34:10,969 --> 00:34:13,560 و من می دانم که تنها با رفتن تا از اینجا و گفت، آه، OK، 790 00:34:13,560 --> 00:34:15,143 من آن را نمی امتیازات این زمان، اما خط نامیده می شود. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> و در حال حاضر این است که کمی متفاوت است. 793 00:34:18,080 --> 00:34:22,480 اما این به معنای، به دلایل ما تا حدودی دست ما را موج در امروز، 794 00:34:22,480 --> 00:34:26,070 که ما در حال بررسی به ببینید در صورتی که کاربر تایپ در 795 00:34:26,070 --> 00:34:29,909 و اعضای هیات و شاید یکی دیگر از شخصیت. 796 00:34:29,909 --> 00:34:33,610 اگر کاربر تایپ در یک int، آن را رفتن به در n ذخیره می شود، چون من 797 00:34:33,610 --> 00:34:36,739 عبور از این توسط آدرس، ترفند جدید ما امروز دیده ام. 798 00:34:36,739 --> 00:34:41,570 اگر کاربر همچنین تایپ در مثل 123x، که x 799 00:34:41,570 --> 00:34:45,060 است که برای پایان دادن به نامه ای در شخصیت ج. 800 00:34:45,060 --> 00:34:48,739 >> حالا معلوم است که sscanf به من بگو، هوشمندانه، 801 00:34:48,739 --> 00:34:54,750 چگونه بسیاری از متغیرهای sscanf شد با موفقیت قادر به پر کردن. 802 00:34:54,750 --> 00:34:58,770 بنابراین با این منطق، اگر تابع من پیاده سازی شده است getInt، 803 00:34:58,770 --> 00:35:00,900 اما من دارم، به طور بالقوه، برای کاربر 804 00:35:00,900 --> 00:35:04,190 که در یک int تایپ به دنبال چیز دیگری، 805 00:35:04,190 --> 00:35:08,580 چه چیزی می خواهید sscanf من مقدار بازگشتی واقعا می شود؟ 806 00:35:08,580 --> 00:35:10,950 اگر هدف این است که برای به دست آوردن فقط یک int از کاربر؟ 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> بنابراین اگر sscanf بازده 2، به چه معنا است؟ 809 00:35:19,300 --> 00:35:21,660 کاربر تایپ در چیزی شبیه به، به معنای واقعی کلمه، 810 00:35:21,660 --> 00:35:24,770 123x، که این بی معنی است. 811 00:35:24,770 --> 00:35:27,490 این خطا است، و من می خواهم برای آن تیک بزنید. 812 00:35:27,490 --> 00:35:32,960 >> بنابراین اگر کاربر در انواع این در، های این منطق، چه sscanf بازگشت، 813 00:35:32,960 --> 00:35:33,740 به نظر شما؟ 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 بنابراین آن را به بازگشت 2، به دلیل 123 در حال رفتن به رفتن در اینجا، 816 00:35:39,130 --> 00:35:41,580 و ایکس است که برای پایان دادن به در اینجا. 817 00:35:41,580 --> 00:35:43,970 اما من نمی خواهم ایکس به پر شده است. 818 00:35:43,970 --> 00:35:48,580 من می خواهم به sscanf به تنها موفق در پر کردن اولین متغیر است. 819 00:35:48,580 --> 00:35:52,490 و به طوری که به همین دلیل من می خواهید sscanf به بازگشت 1. 820 00:35:52,490 --> 00:35:55,750 >> و اگر این بیت بر سر است برای لحظه ای، که کاملا خوب است. 821 00:35:55,750 --> 00:36:00,030 تحقق بخشیدن به هر چند، که یکی از ارزش getInt و getString 822 00:36:00,030 --> 00:36:03,630 این است که ما در حال انجام یک معامله از بسیاری از چک کردن خطا مثل این تا 823 00:36:03,630 --> 00:36:07,130 که، تا به امروز، شما می توانید تقریبا نوع هر چیزی در صفحه کلید خود را، 824 00:36:07,130 --> 00:36:08,490 و ما آن را گرفتن. 825 00:36:08,490 --> 00:36:10,592 و ما قطعا، کارکنان، قطعا نمی 826 00:36:10,592 --> 00:36:13,300 منبع از مشکلات را در خود برنامه، چرا که ما دفاعی هستیم 827 00:36:13,300 --> 00:36:16,270 چک کردن برای همه از احمق چیزهایی که یک کاربر ممکن است، 828 00:36:16,270 --> 00:36:18,900 مانند تایپ کردن یک رشته، زمانی که شما واقعا می خواستم هوشمند. 829 00:36:18,900 --> 00:36:21,350 بنابراین برای now-- ما آمده به این قبل از long-- 830 00:36:21,350 --> 00:36:23,710 اما همه این زمان، getString و getInt دارند 831 00:36:23,710 --> 00:36:29,950 در زیر هود با استفاده از این بوده است ایده اولیه از آدرس حافظه است. 832 00:36:29,950 --> 00:36:32,580 >> بنابراین در حال حاضر، اجازه دهید همه چیز کاربر پسند کمی بیشتر است. 833 00:36:32,580 --> 00:36:38,740 همانطور که شما ممکن است به یاد، از Binky آخرین time-- اگر موس من تا cooperate-- خواهد 834 00:36:38,740 --> 00:36:42,560 ما این کد، به حال که رک و پوست کنده، نسبتا مزخرف. 835 00:36:42,560 --> 00:36:45,330 این کد رسیدن به هیچ چیز مفید است، اما آن را به عنوان مثال بود 836 00:36:45,330 --> 00:36:48,330 که استاد Parlante استفاده به منظور نشان دادن 837 00:36:48,330 --> 00:36:51,840 آنچه که قرار بود در یک برنامه های مربوط به حافظه است. 838 00:36:51,840 --> 00:36:54,850 >> بنابراین اجازه دهید این بازگو داستان به طور خلاصه فوق العاده. 839 00:36:54,850 --> 00:36:58,720 این دو خط اول، در انگلیسی، آنچه، به شما می گویند؟ 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 فقط در منطقی بشر، اما کمی از لحاظ فنی، یک چاقو. 842 00:37:05,430 --> 00:37:06,346 رسید [نامفهوم]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> DAVID J. مالان: OK، شما در حال ایجاد آدرس برای x و متغیر y است. 845 00:37:11,080 --> 00:37:15,520 نه کاملا، چون x و y هستند متغیر در معنای سنتی. 846 00:37:15,520 --> 00:37:18,054 x و y آدرس می و یا آدرس را ذخیره کنید. 847 00:37:18,054 --> 00:37:19,220 بنابراین اجازه دهید سعی کنید این بار دیگر. 848 00:37:19,220 --> 00:37:21,010 نه یک شروع بد، هر چند. 849 00:37:21,010 --> 00:37:21,510 آره؟ 850 00:37:21,510 --> 00:37:22,426 >> رسید [نامفهوم]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 DAVID J. مالان: خوب. 853 00:37:24,840 --> 00:37:26,173 من فکر می کنم که یک پاک کن کوچک است. 854 00:37:26,173 --> 00:37:28,630 اعلام دو اشاره گر، دو عدد صحیح. 855 00:37:28,630 --> 00:37:30,150 و ما آنها را x و y تماس. 856 00:37:30,150 --> 00:37:32,790 و یا اگر ما به منظور جلب این به عنوان یک عکس، دوباره، 857 00:37:32,790 --> 00:37:36,410 به خاطر سادگی تمام ما در حال انجام با آن خط اول 858 00:37:36,410 --> 00:37:39,690 رسم یک جعبه مانند این، با برخی از ارزش زباله در آن، 859 00:37:39,690 --> 00:37:41,920 و خواستار آن X، و پس از آن جعبه دیگری شبیه به این، 860 00:37:41,920 --> 00:37:43,880 با برخی از ارزش زباله در آن، آن را y است. 861 00:37:43,880 --> 00:37:45,810 ما اعلام کرده ایم دو اشاره گر است که در نهایت 862 00:37:45,810 --> 00:37:47,860 آدرس از یک int را ذخیره کنید. 863 00:37:47,860 --> 00:37:49,170 به طوری که همه وجود دارد. 864 00:37:49,170 --> 00:37:53,290 >> بنابراین، هنگامی که Binky این کار را کرد، خاک رس درست مثل این نگاه کرد. 865 00:37:53,290 --> 00:37:55,350 و نیک فقط نوع پیچیده کردن فلش، 866 00:37:55,350 --> 00:37:57,590 به عنوان اینکه آنها اشاره جایی نمی به طور خاص، زیرا آنها فقط می 867 00:37:57,590 --> 00:37:58,250 ارزش زباله. 868 00:37:58,250 --> 00:38:01,670 آنها به صراحت راه اندازی نشده است در هر نقطه خاص است. 869 00:38:01,670 --> 00:38:03,980 >> در حال حاضر در خط بعدی از کد، فراخوان، این بود. 870 00:38:03,980 --> 00:38:07,510 بنابراین در معقول کاربر پسند، اما تا حدودی فنی انگلیسی، 871 00:38:07,510 --> 00:38:09,790 آنچه در این خط از کد انجام است؟ 872 00:38:09,790 --> 00:38:10,391 آره؟ 873 00:38:10,391 --> 00:38:11,333 >> رسید [نامفهوم]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> DAVID J. مالان: کامل. 876 00:38:13,950 --> 00:38:17,016 این اختصاص تکه از حافظه که به اندازه یک int است. 877 00:38:17,016 --> 00:38:18,140 و این نیمی از پاسخ. 878 00:38:18,140 --> 00:38:20,056 شما حق پاسخ نیمی از بیان است. 879 00:38:20,056 --> 00:38:22,473 چه اتفاق می افتد در سمت چپ از علامت مساوی؟ 880 00:38:22,473 --> 00:38:22,972 آره؟ 881 00:38:22,972 --> 00:38:24,814 رسید و اختصاص آن را به متغیر x؟ 882 00:38:24,814 --> 00:38:27,690 >> DAVID J. مالان: و اختصاص آن را به متغیر x. 883 00:38:27,690 --> 00:38:31,650 بنابراین برای روکش، راست سمت اختصاص حافظه کافی برای ذخیره یک int. 884 00:38:31,650 --> 00:38:34,150 اما به طور خاص malloc آدرس گرداند 885 00:38:34,150 --> 00:38:37,270 آن تکه از حافظه، که شما در فقط پیشنهاد می شود ذخیره می شود در x. 886 00:38:37,270 --> 00:38:42,560 >> پس چه نیک زمان آخرین با Binky انجام است او کشیده میشوند که اشاره گر از، خاک رس، 887 00:38:42,560 --> 00:38:46,820 به نقطه در حال حاضر در یک تکه سفید حافظه که به اندازه یک int برابر است. 888 00:38:46,820 --> 00:38:49,360 و در واقع، که به معنای برای نشان دادن چهار بایت. 889 00:38:49,360 --> 00:38:55,310 >> در حال حاضر، خط کد بعدی این را، ستاره ایکس می شود 42. 890 00:38:55,310 --> 00:38:58,530 بنابراین 42 سر راست در است سمت راست، معنای زندگی است. 891 00:38:58,530 --> 00:39:00,500 سمت چپ، ستاره ایکس یعنی چه؟ 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 که بیش از حد ممکن است gone-- که OK. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> رسید در واقع، رفتن به [نامفهوم] 896 00:39:06,875 --> 00:39:07,750 DAVID J. مالان: خوب. 897 00:39:07,750 --> 00:39:08,760 رسید [نامفهوم]. 898 00:39:08,760 --> 00:39:09,760 DAVID J. مالان: دقیقا. 899 00:39:09,760 --> 00:39:11,979 سمت چپ به معنای رفتن به x. 900 00:39:11,979 --> 00:39:12,520 ایکس آدرس است. 901 00:39:12,520 --> 00:39:15,520 آن را مانند 33 خیابان آکسفورد، و یا OX1 است. 902 00:39:15,520 --> 00:39:18,690 و ستاره ایکس به معنی رفتن به آن آدرس و آنچه وجود دارد؟ 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> پس در واقع، این دقیقا همان چیزی نیک را انجام داد. 905 00:39:21,290 --> 00:39:23,740 او با با آغاز شده، اساسا، ذهنی 906 00:39:23,740 --> 00:39:26,270 با اشاره انگشت در x و بعد از فلش 907 00:39:26,270 --> 00:39:30,670 به جعبه سفید در دست راست طرف، و قرار دادن شماره 42 وجود دارد. 908 00:39:30,670 --> 00:39:34,120 اما پس از آن همه چیز کمی خطرناک است، درست است؟ 909 00:39:34,120 --> 00:39:35,860 Binky در مورد از دست دادن سر خود را. 910 00:39:35,860 --> 00:39:39,465 >> ستاره سالانه برابر 13، شانس بد، یعنی چه؟ 911 00:39:39,465 --> 00:39:43,620 بنابراین معنی ستاره سالانه به آدرس در y است. 912 00:39:43,620 --> 00:39:45,630 اما آدرس در سال است؟ 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 همه حق است، آن را به ارزش زباله، درست است؟ 915 00:39:49,440 --> 00:39:50,800 من آن را به عنوان یک علامت سوال به خود جلب کرد. 916 00:39:50,800 --> 00:39:54,850 نیک آن را به عنوان یک پیکان فر به خود جلب کرد. 917 00:39:54,850 --> 00:39:59,600 و به محض اینکه شما را امتحان کنید انجام ستاره سال، گفت: رفتن وجود دارد، 918 00:39:59,600 --> 00:40:03,872 اما مشروع وجود ندارد آدرس، آن را در برخی از مکان جعلی است، 919 00:40:03,872 --> 00:40:05,080 برنامه رفتن را به سقوط. 920 00:40:05,080 --> 00:40:08,580 و سر Binky در جریان است به پرواز کردن در اینجا، به عنوان آن را انجام داد. 921 00:40:08,580 --> 00:40:12,130 >> بنابراین در پایان، این برنامه فقط عیب از صاف بود. 922 00:40:12,130 --> 00:40:13,540 این یک برنامه حشره دار بود. 923 00:40:13,540 --> 00:40:14,760 و این نیاز به ثابت. 924 00:40:14,760 --> 00:40:18,260 و تنها راه، واقعا، آن را برطرف خواهد بود، به عنوان مثال، این خط، 925 00:40:18,260 --> 00:40:21,010 که ما حتی برای به دست آوردن نیست، چرا که برنامه خیلی زود سقوط کرد. 926 00:40:21,010 --> 00:40:26,170 اما اگر ما به حل این مشکل چه اثر می کند انجام سالانه برابر x را داشته باشد؟ 927 00:40:26,170 --> 00:40:30,010 خوب، آن را اساسا اشاره y در هر مقدار x است اشاره در. 928 00:40:30,010 --> 00:40:32,430 >> بنابراین در داستان نیک، و یا داستان Binky، هر دو 929 00:40:32,430 --> 00:40:34,640 x و y در اشاره شد تکه های سفید حافظه، 930 00:40:34,640 --> 00:40:38,300 به طوری که، در نهایت، هنگامی که شما آیا ستاره سالانه معادل 13 دوباره، 931 00:40:38,300 --> 00:40:43,080 شما را تا پایان با قرار دادن 13 در محل مناسب. 932 00:40:43,080 --> 00:40:47,640 پس همه این خطوط کاملا مشروع، به جز این یکی، 933 00:40:47,640 --> 00:40:51,730 هنگامی که آن را قبل از اینکه شما اتفاق افتاده است در واقع سالانه اختصاص داده ارزش باشد. 934 00:40:51,730 --> 00:40:54,290 >> در حال حاضر خوشبختانه، شما نمی باید از طریق تمام استدلال 935 00:40:54,290 --> 00:40:56,560 از این نوع از مسائل در خود تغییر دهید. 936 00:40:56,560 --> 00:40:59,310 اجازه بدهید من به جلو و باز کردن یک پنجره ترمینال در اینجا 937 00:40:59,310 --> 00:41:03,050 و باز کردن، برای فقط یک لحظه، یک برنامه فوق العاده کوتاه است که 938 00:41:03,050 --> 00:41:04,360 همچنین نوع بی معنی است. 939 00:41:04,360 --> 00:41:05,152 این زشت است. 940 00:41:05,152 --> 00:41:06,610 این هیچ چیزی مفید دست یابد. 941 00:41:06,610 --> 00:41:10,180 اما آن را نشانی از نشان دادن مسائل حافظه، پس بیایید نگاهی به. 942 00:41:10,180 --> 00:41:11,830 >> بخش اصلی، فوق العاده ساده است. 943 00:41:11,830 --> 00:41:14,830 ظاهرا خواستار یک تابع، ج، و سپس 0 را برمی گرداند. 944 00:41:14,830 --> 00:41:16,310 این نوع از سخت به یک ظرف غذا این است. 945 00:41:16,310 --> 00:41:18,540 بنابراین بخش اصلی خیلی خوب است، تا کنون. 946 00:41:18,540 --> 00:41:20,100 >> بنابراین ج مشکل ساز است. 947 00:41:20,100 --> 00:41:22,120 و فقط خیلی قرار داده نشده است تلاش به نامگذاری آن 948 00:41:22,120 --> 00:41:23,990 در اینجا، برای حفظ تمرکز بر کد. 949 00:41:23,990 --> 00:41:25,740 ج دارای دو خط. 950 00:41:25,740 --> 00:41:27,610 و اجازه دهید ببینیم که چه چیزی در حال حاضر در جریان است. 951 00:41:27,610 --> 00:41:29,840 بنابراین از یک طرف here-- و اجازه دهید 952 00:41:29,840 --> 00:41:32,680 این سازگار با قبلی example-- از یک سو، 953 00:41:32,680 --> 00:41:35,830 در سمت چپ است انجام آنچه، به زبان انگلیسی؟ 954 00:41:35,830 --> 00:41:36,493 این is-- 955 00:41:36,493 --> 00:41:37,701 رسید ساخت یک اشاره گر. 956 00:41:37,701 --> 00:41:40,830 DAVID J. مالان: ایجاد یک اشاره گر به یک int و آن را ایکس. 957 00:41:40,830 --> 00:41:43,789 پس از آن به ایجاد یکی از آن جعبه من در حفظ و رسم بر روی صفحه لمسی. 958 00:41:43,789 --> 00:41:45,913 و در حال حاضر، در دست راست سمت، malloc، البته، 959 00:41:45,913 --> 00:41:47,420 است اختصاص یک تکه از حافظه است. 960 00:41:47,420 --> 00:41:49,989 و فقط به روشن باشد، چگونه حافظه آن است که ظاهرا 961 00:41:49,989 --> 00:41:52,030 تخصیص، اگر شما فقط نوع انجام محاسبات ریاضی که اینجا هستید؟ 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> پس از آن 40 بایت. 964 00:41:54,040 --> 00:41:57,400 و من می دانم که تنها به خاطر من می دانم اعضای هیات، در دستگاه CS50، حداقل، 965 00:41:57,400 --> 00:41:58,060 چهار بایت است. 966 00:41:58,060 --> 00:41:59,610 بنابراین 10 برابر 4 40 است. 967 00:41:59,610 --> 00:42:04,924 بنابراین این ذخیره سازی x و آدرس از از اول 40 نوع داده int است که 968 00:42:04,924 --> 00:42:07,340 اند فضای اختصاص داده شده است به عقب، به عقب، به عقب، به پشت. 969 00:42:07,340 --> 00:42:08,470 >> و این چیزی است که این مهم در مورد malloc. 970 00:42:08,470 --> 00:42:11,261 این حافظه کمی را ندارد در اینجا، کمی در اینجا، کمی اینجا. 971 00:42:11,261 --> 00:42:14,220 این به شما می دهد یک تکه از حافظه، contiguously، از عامل 972 00:42:14,220 --> 00:42:15,240 سیستم. 973 00:42:15,240 --> 00:42:18,500 >> در حال حاضر آنچه در مورد این، ایکس براکت 10 برابر 0؟ 974 00:42:18,500 --> 00:42:19,470 خط خودسرانه از کد. 975 00:42:19,470 --> 00:42:21,100 این هیچ چیزی مفید دست یابد. 976 00:42:21,100 --> 00:42:26,128 اما جالب است، چون ایکس براکت 10--؟ 977 00:42:26,128 --> 00:42:26,628 آره؟ 978 00:42:26,628 --> 00:42:27,912 >> رسید [نامفهوم]؟ 979 00:42:27,912 --> 00:42:30,500 >> DAVID J. مالان: ایکس براکت 10 اختصاص ندارد به تهی باشد. 980 00:42:30,500 --> 00:42:35,070 جزئیات null تنها به بازی می آید با رشته ها، در پایان یک رشته است. 981 00:42:35,070 --> 00:42:36,700 اما فکر خوب است. 982 00:42:36,700 --> 00:42:39,615 >> این آرایه چقدر بزرگ است، حتی هر چند که من 40 بایت اختصاص داده ام؟ 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 این 0 الی نه، درست است؟ 985 00:42:43,690 --> 00:42:45,120 این 10 نوع داده int است، در کل. 986 00:42:45,120 --> 00:42:48,790 40 بایت، اما 10 نوع داده int، از 0 نمایه شده 0. 987 00:42:48,790 --> 00:42:50,930 >> پس چه که x براکت 10 است؟ 988 00:42:50,930 --> 00:42:53,090 این در واقع برخی از ارزش زباله در دست نیست. 989 00:42:53,090 --> 00:42:54,780 این حافظه که به من تعلق ندارد. 990 00:42:54,780 --> 00:42:59,650 من نمی باید لمس شود که بایت تعداد 41، 42، 43، 44. 991 00:42:59,650 --> 00:43:01,420 من قصد دارم کمی بیش از حد. 992 00:43:01,420 --> 00:43:04,490 >> و در واقع، اگر من اجرای این برنامه، آن را به خوبی ممکن است سقوط. 993 00:43:04,490 --> 00:43:05,790 اما گاهی اوقات، ما خوش شانس دریافت کنید. 994 00:43:05,790 --> 00:43:07,706 و بنابراین فقط برای نشان دادن this-- و رک و پوست کنده، 995 00:43:07,706 --> 00:43:11,000 شما هرگز قبل از اینکه شما می دانید انجام it-- اجازه دهید این را اجرا کنید. 996 00:43:11,000 --> 00:43:12,480 این در واقع سقوط نیست. 997 00:43:12,480 --> 00:43:15,032 >> اما اگر این تغییر من به عنوان مثال، به مانند 1000 باشد، 998 00:43:15,032 --> 00:43:16,740 به این واقعا عمدی، بیایید ببینید 999 00:43:16,740 --> 00:43:18,710 اگر ما می توانیم آن را به سقوط این زمان. 1000 00:43:18,710 --> 00:43:20,070 OK، اما این سقوط نیست. 1001 00:43:20,070 --> 00:43:22,600 چگونه در مورد 100000؟ 1002 00:43:22,600 --> 00:43:25,000 اجازه دهید آن را بازسازی، و در حال حاضر آن را دوباره. 1003 00:43:25,000 --> 00:43:25,500 OK. 1004 00:43:25,500 --> 00:43:25,960 دارید.حالا. 1005 00:43:25,960 --> 00:43:26,460 خوب. 1006 00:43:26,460 --> 00:43:29,090 بنابراین ظاهرا، دوباره، این بخش های حافظه، پس به صحبت می کنند، 1007 00:43:29,090 --> 00:43:32,660 منطقی بزرگ، بنابراین ما می توانیم خوش شانس دوباره و دوباره. 1008 00:43:32,660 --> 00:43:36,510 اما در نهایت، هنگامی که شما مسخره و واقعا به دور از بر روی صفحه نمایش، 1009 00:43:36,510 --> 00:43:39,120 شما حافظه لمس است که واقعا، واقعا متعلق به شما نیست. 1010 00:43:39,120 --> 00:43:40,870 >> اما رک و پوست کنده، این انواع اشکالات در حال رفتن 1011 00:43:40,870 --> 00:43:43,020 به سخت تر و سخت تر به شکل در خود تغییر دهید. 1012 00:43:43,020 --> 00:43:47,880 اما خوشبختانه، به عنوان برنامه نویسان، ما ابزار است که به ما اجازه این کار را برای ما. 1013 00:43:47,880 --> 00:43:50,140 پس این است که، شاید، یک از زشت ترین برنامه ها، 1014 00:43:50,140 --> 00:43:52,060 حتی زشت تر خروجی از gdb است. 1015 00:43:52,060 --> 00:43:55,670 اما همیشه یک خط و یا دو که فوق العاده مفید است. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind برنامه ای است که کمک می کند است شما اشکال زدایی برنامه نیست، در هر سه، 1017 00:44:00,310 --> 00:44:03,500 اما مربوط به حافظه مشکلات، به طور خاص. 1018 00:44:03,500 --> 00:44:07,590 این به طور خودکار کد شما اجرا خواهد شد برای شما و برای حداقل دو چیز است. 1019 00:44:07,590 --> 00:44:10,680 یکی، آیا شما چیزی را اتفاقی مانند حافظه تماس 1020 00:44:10,680 --> 00:44:11,980 که به شما تعلق ندارد؟ 1021 00:44:11,980 --> 00:44:13,590 این کمک خواهد کرد که آن موارد را پیدا کنید. 1022 00:44:13,590 --> 00:44:15,710 >> و دو، آن کمک خواهد کرد شما در پیدا کردن چیزی به نام 1023 00:44:15,710 --> 00:44:19,270 نشت حافظه، که ما به طور کامل نادیده گرفته میشوند، ساده لوحانه، 1024 00:44:19,270 --> 00:44:21,380 برای برخی از زمان و خوش. 1025 00:44:21,380 --> 00:44:23,140 اما معلوم است، همه این زمان، هر زمان که 1026 00:44:23,140 --> 00:44:26,620 شما getString در نام کرده ام بسیاری از برنامه های ما، 1027 00:44:26,620 --> 00:44:28,930 شما در حال درخواست از عامل سیستم حافظه، 1028 00:44:28,930 --> 00:44:32,070 اما شما هر گونه خاطره از هر زمان دیگری به آن 1029 00:44:32,070 --> 00:44:36,169 پشت، انجام unalloc، و یا آزاد، به عنوان آن را به نام. 1030 00:44:36,169 --> 00:44:37,960 نه، چون ما هیچ وقت از شما خواسته به انجام این کار. 1031 00:44:37,960 --> 00:44:41,250 >> اما همه این زمان، برنامه شما در C نوشتن 1032 00:44:41,250 --> 00:44:43,800 اند نشت شده حافظه، درخواست از عامل 1033 00:44:43,800 --> 00:44:46,190 سیستم برای بیشتر و بیشتر حافظه برای رشته و فلان چیز، 1034 00:44:46,190 --> 00:44:47,870 اما هرگز آن را توزیع دوباره. 1035 00:44:47,870 --> 00:44:50,080 و در حال حاضر این کمی است از ساده، 1036 00:44:50,080 --> 00:44:53,550 اما اگر شما همیشه اجرا مک خود و یا PC خود را برای مدتی، باز 1037 00:44:53,550 --> 00:44:55,790 تعداد زیادی از برنامه ها، شاید بسته شدن برنامه ها، 1038 00:44:55,790 --> 00:44:57,795 و حتی اگر شما کامپیوتر تا به سقوط نیست، 1039 00:44:57,795 --> 00:45:01,690 آن را گرفتن بسیار آهسته تر، به عنوان اینکه واقعا 1040 00:45:01,690 --> 00:45:04,290 با استفاده از مقدار زیادی از حافظه یا منابع، حتی اگر، 1041 00:45:04,290 --> 00:45:06,070 اگر شما حتی دست زدن به صفحه کلید، 1042 00:45:06,070 --> 00:45:10,430 است که می تواند be-- اما always-- نمی توانست باشد که برنامه شما در حال اجرا 1043 00:45:10,430 --> 00:45:11,920 خود دارای حافظه. 1044 00:45:11,920 --> 00:45:15,645 و آنها را نگه دارید درخواست OS برای بیش و حافظه بیشتر، از آن فراموش کردن در مورد آن، 1045 00:45:15,645 --> 00:45:18,470 در واقع با استفاده از آن نیست، اما بنابراین در نظر گرفتن حافظه دور 1046 00:45:18,470 --> 00:45:20,500 از برنامه های دیگر که ممکن است آن را می خواهم. 1047 00:45:20,500 --> 00:45:23,940 به طوری که توضیح معمول است. 1048 00:45:23,940 --> 00:45:25,940 در حال حاضر در اینجا است که در Valgrind خروجی به طور کامل 1049 00:45:25,940 --> 00:45:29,290 بی رحم به کسانی که کمتر و راحت تر به طور یکسان. 1050 00:45:29,290 --> 00:45:32,690 اما جالب مسائل مناسب است در اینجا. 1051 00:45:32,690 --> 00:45:37,060 این است که من نوشتن نامعتبر است از گفتن اندازه چهار اتفاق می افتد در این برنامه، 1052 00:45:37,060 --> 00:45:40,640 به طور خاص، در خط 21 از یاد. 1053 00:45:40,640 --> 00:45:45,450 >> اگر من به خط 21، HM وجود دارد در واقع، نوشتن نامعتبر اندازه چهار است. 1054 00:45:45,450 --> 00:45:46,250 چرا اندازه چهار؟ 1055 00:45:46,250 --> 00:45:49,500 خوب، این number-- و آن را می تواند anything-- یک int است. 1056 00:45:49,500 --> 00:45:50,450 پس از آن چهار کلمه در ادامه متن. 1057 00:45:50,450 --> 00:45:52,550 بنابراین من قرار دادن چهار بایت چرا که آنان تعلق ندارد. 1058 00:45:52,550 --> 00:45:55,080 این چیزی است که Valgrind است که در واقع به من گفتن. 1059 00:45:55,080 --> 00:45:57,600 علاوه بر این، آن را نیز خواهد شد به من بگویید، به عنوان خواهیم دید، 1060 00:45:57,600 --> 00:46:01,490 به شما به عنوان این اجرا در یک pset آینده، اگر و هنگامی که حافظه، که در واقع شما به بیرون درز کرده ام 1061 00:46:01,490 --> 00:46:05,300 من، چون من به نام ام malloc، اما من در واقع ندارد 1062 00:46:05,300 --> 00:46:08,010 نامیده می شود، در این مورد، رایگان، که ما آن را در نهایت خواهید دید 1063 00:46:08,010 --> 00:46:09,830 در مقابل از malloc است. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> بنابراین در حال حاضر، من فکر می کنم، به عنوان مثال نهایی است. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 پس این یکی یک کمی بیشتر محرمانه است، اما شاید 1068 00:46:16,690 --> 00:46:19,180 بزرگترین دلیلی برای مراقب باشید با حافظه، 1069 00:46:19,180 --> 00:46:24,490 و به این دلیل است که بسیاری از برنامه های و / یا سرور وب، حتی تا به امروز، 1070 00:46:24,490 --> 00:46:28,200 ها توسط بچه ها بد جایی گرفته در اینترنت که به نحوی می باشد 1071 00:46:28,200 --> 00:46:33,390 ارسال بسته های جعلی به سرور شما تلاش برای مصالحه حساب خود را، 1072 00:46:33,390 --> 00:46:36,420 و یا اطلاعات خود را، و یا فقط به طور کلی بیش از یک ماشین است. 1073 00:46:36,420 --> 00:46:38,910 سرریز بافر، به عنوان نام آن پیداست، به معنی 1074 00:46:38,910 --> 00:46:40,740 جاری نمی هوشمند، اما یک بافر. 1075 00:46:40,740 --> 00:46:43,490 و یک بافر فقط یک راه فانتزی گفت: آن را به یک دسته از حافظه است. 1076 00:46:43,490 --> 00:46:46,710 >> و در واقع، من یک رشته به نام قبل از بافر، به جای است. 1077 00:46:46,710 --> 00:46:49,234 از آنجا که اگر آن را به یک بافر است، مثل به این معنا یوتیوب، 1078 00:46:49,234 --> 00:46:52,400 و یا هر زمان که شما در حال تماشای یک ویدیو، شما ممکن است را دیده اند، بافر کلمه، 1079 00:46:52,400 --> 00:46:53,040 نقطه، نقطه، نقطه. 1080 00:46:53,040 --> 00:46:54,240 این فوق العاده آزار دهنده است. 1081 00:46:54,240 --> 00:46:55,990 و این فقط به این معنی است که دستگاه پخش ویدئو خود را 1082 00:46:55,990 --> 00:46:58,710 در تلاش است تا دانلود کنید مقدار زیادی از بایت، تعداد زیادی از بایت 1083 00:46:58,710 --> 00:47:00,170 از یک ویدیو از اینترنت. 1084 00:47:00,170 --> 00:47:02,920 اما آهسته، پس از آن تلاش دانلود یک دسته از آنها 1085 00:47:02,920 --> 00:47:06,430 برای پر کردن یک بافر، یک ظرف، به طوری که شما باید بایت به اندازه کافی است که پس از آن می توانید 1086 00:47:06,430 --> 00:47:09,174 شما این ویدیو نشان می دهد، بدون توقف به طور مداوم. 1087 00:47:09,174 --> 00:47:11,340 اما معلوم است، شما می توانید یک بافر در این بزرگ است. 1088 00:47:11,340 --> 00:47:15,710 اما سعی کنید برای قرار دادن این داده های زیادی را در آن، و بسیار چیزهای بد اتفاق می افتد. 1089 00:47:15,710 --> 00:47:22,780 بنابراین به عنوان مثال، اجازه دهید نگاه این تیزر نهایی به عنوان مثال. 1090 00:47:22,780 --> 00:47:24,720 این یکی دیگر از برنامه است که، در نگاه اول، 1091 00:47:24,720 --> 00:47:26,540 هیچ چیزی فوق العاده مفید نمی کنند. 1092 00:47:26,540 --> 00:47:29,590 آن را به یک تابع اصلی که خواستار آن تابع، ج. 1093 00:47:29,590 --> 00:47:36,640 و این تابع، ج، اینجا، است یک آرایه کاراکتر، به نام ج، اندازه 12. 1094 00:47:36,640 --> 00:47:39,340 و سپس آن را با استفاده از این عملکرد جدید به نام strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> به نظر می رسد که، با این ساده، خط ساده از کد، فقط دو خط، 1097 00:47:45,190 --> 00:47:49,130 ما تمام برنامه های من ساخته شده، و در نتیجه، کل کامپیوتر من، 1098 00:47:49,130 --> 00:47:54,000 و حساب کاربری من، و سخت من رانندگی به طور بالقوه به هر کسی آسیب پذیر 1099 00:47:54,000 --> 00:47:58,170 که می داند و به اندازه کافی خوب است برای اجرا این برنامه را با یک خط دستور خاص 1100 00:47:58,170 --> 00:47:58,900 بحث. 1101 00:47:58,900 --> 00:48:03,400 به عبارت دیگر، اگر این پسر بد قرار می دهد در داخل argvargv [1] با تایپ 1102 00:48:03,400 --> 00:48:08,750 در صفحه کلید به خصوص بسیار گردد رشته، نه بی سی، 123، اما در اصل، 1103 00:48:08,750 --> 00:48:15,180 علائم دودویی است که نشان دهنده اجرایی کد، برنامه ای است که او نوشت، 1104 00:48:15,180 --> 00:48:19,190 با این برنامه ساده است که نماینده هزاران نفر از برنامه 1105 00:48:19,190 --> 00:48:23,610 که به طور مشابه آسیب پذیر، جرات گفتن، او در نهایت می تواند همه را حذف کنید 1106 00:48:23,610 --> 00:48:26,680 فایل ها بر روی دیسک سخت من، یک چشمک زدن سریع به طوری که او می تواند 1107 00:48:26,680 --> 00:48:30,170 نوع دستورات خود به خود، ایمیل همه فایل ها را به خودم. 1108 00:48:30,170 --> 00:48:34,660 هر چیزی که می توانم انجام دهم، او یا او می تواند با این کد انجام دهد. 1109 00:48:34,660 --> 00:48:36,575 >> ما نمی خواهد کاملا حل این است. 1110 00:48:36,575 --> 00:48:38,700 و در واقع، آن را به شامل یک عکس کوچک 1111 00:48:38,700 --> 00:48:41,470 مثل این است که ما به زودی می آیند برای درک همه بهتر است. 1112 00:48:41,470 --> 00:48:44,480 اما امروز، اجازه دهید در پایان چه چیزی، امیدوارم، کمی بیشتر 1113 00:48:44,480 --> 00:48:48,360 قابل درک شوخی XKCD، تا زمانی که ما هم بعد از سر گرفت. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 خوب. 1116 00:48:51,600 --> 00:48:53,446 شما در چهارشنبه کنید. 1117 00:48:53,446 --> 00:48:54,754 >> [MUSIC پخش] 1118 00:48:54,754 --> 00:48:57,790 >> SPEAKER: و اکنون، عمیق افکار، توسط Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 حافظه مانند پریدن به شمع از برگ طلایی در یک بعد از ظهر یکشنبه. 1121 00:49:04,770 --> 00:49:09,000 وزش باد، حول خود hair-- آه، من روز when-- دست 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [خنده] 1124 00:49:12,650 --> 00:49:13,750