1 00:00:00,000 --> 00:00:11,242 >> [เล่นเพลง] 2 00:00:11,242 --> 00:00:16,630 >> เดวิดเจลัน: ทั้งหมดสิทธินี้คือ CS50 และนี่คือจุดเริ่มต้นของสัปดาห์ที่ห้า 3 00:00:16,630 --> 00:00:21,480 ดังนั้นวันนี้ภายใต้เบาะที่นั่งของคุณ, คุณจะไม่พบอะไร 4 00:00:21,480 --> 00:00:24,790 แต่ข้างต้นคุณควรหาเหล​​่านี้ token เล็ก ๆ น้อย ๆ จากการแข็งค่าของเรา 5 00:00:24,790 --> 00:00:26,970 ทั้งหมดของการทำงานที่คุณใส่ เป็นเกมจากสิบห้า 6 00:00:26,970 --> 00:00:30,290 เพียงลบวงกลมเล็ก ๆ น้อย ๆ ด้านล่างเพื่อเริ่มต้นการเล่นให้กับ 7 00:00:30,290 --> 00:00:31,680 ส่วนที่เหลือของชั้นเรียน 8 00:00:31,680 --> 00:00:38,930 >> ดังนั้นจำได้ว่าหรือรู้ว่าปัญหาการตั้งค่าที่ สี่ซึ่งออกไปวันหยุดสุดสัปดาห์นี้ 9 00:00:38,930 --> 00:00:40,340 เกี่ยวกับการเขียนเกมอื่น 10 00:00:40,340 --> 00:00:43,740 แต่เวลานี้มันเกี่ยวข้องกับการใช้ ส่วนติดต่อผู้ใช้แบบกราฟิกที่เกิดขึ้นจริงไม่ได้ 11 00:00:43,740 --> 00:00:46,310 อินเตอร์เฟซเหมือนต้นฉบับ เกมจากสิบห้าคือ 12 00:00:46,310 --> 00:00:50,210 และเกมที่อยู่ข้างหน้าของคุณ, ถ้าคุณยังไม่เห็นต่อไปนี้ 13 00:00:50,210 --> 00:00:52,310 มีลักษณะบางสิ่งบางอย่างเล็ก ๆ น้อย ๆ เช่นนี้ 14 00:00:52,310 --> 00:00:55,170 ฉันจะไปลงสถานีของฉัน หน้าต่างที่นี่ใน GDB 15 00:00:55,170 --> 00:00:58,600 และฉันจะไปข้างหน้าและเรียกใช้ การแก้ปัญหาพนักงานซึ่งคุณสามารถเข้าถึง 16 00:00:58,600 --> 00:01:01,010 หลังจากใช้การปรับปรุง 50 ตามปกติ 17 00:01:01,010 --> 00:01:04,090 >> แต่ฉันจะใส่มันลงไปเล็ก ๆ น้อย ๆ โหมดความลับเล็ก ๆ น้อย ๆ ไข่อีสเตอร์, 18 00:01:04,090 --> 00:01:08,480 ที่เรียกว่าโหมดพระเจ้าโดย วางพระเจ้าใน argv1 19 00:01:08,480 --> 00:01:12,920 และฉันต้องปฏิบัติตามคำสั่งของตัวเอง ใช้มันในตัวเอง 20 00:01:12,920 --> 00:01:14,220 ไดเรกทอรีชุดปัญหา 21 00:01:14,220 --> 00:01:19,190 ดังนั้นตอนนี้คุณเห็นรุ่นที่สมบูรณ์ ของเกมจากการฝ่าวงล้อม 22 00:01:19,190 --> 00:01:21,090 ในความเป็นจริงนี้เป็นโหมดที่ไม่มีมือ 23 00:01:21,090 --> 00:01:24,850 ดังนั้นจึงเป็นจริง - 24 00:01:24,850 --> 00:01:26,470 wowed แม้ว่าคุณอาจจะมี - 25 00:01:26,470 --> 00:01:30,850 สวยน่ารำคาญที่จะใช้โหมดพระเจ้า แหกคุกเหมือนเกมจากสิบห้า, 26 00:01:30,850 --> 00:01:33,590 ซึ่งบางท่านอาจจะมีความท้าทาย ฉบับที่แฮ็กเกอร์ 27 00:01:33,590 --> 00:01:37,890 >> ในการฝ่าวงล้อมมันพอเพียงในพระเจ้า โหมดที่จะเพียงแค่ทำในสิ่งที่, 28 00:01:37,890 --> 00:01:41,220 สังหรณ์ใจกับพาย? 29 00:01:41,220 --> 00:01:45,630 เพียงแค่ทำให้มันเท่ากันกับสิ่งที่ ตำแหน่งในแนวนอนเป็นของลูก 30 00:01:45,630 --> 00:01:49,220 และตราบเท่าที่คุณทำเช่นนี้ใน lockstep กับลูกบอลย้ายเกมนี้จะ 31 00:01:49,220 --> 00:01:53,100 ไม่เคยเคยเคยคิดถึงลูก และคุณจะชนะทุกครั้ง 32 00:01:53,100 --> 00:01:55,430 >> แต่ในฉบับที่แฮ็กเกอร์ในสัปดาห์นี้ มีมากกว่าเพียงแค่โหมดของพระเจ้า 33 00:01:55,430 --> 00:01:56,720 มีจำนวนของคุณสมบัติอื่น ๆ ของ 34 00:01:56,720 --> 00:01:58,140 ในหมู่พวกเขาเลเซอร์ 35 00:01:58,140 --> 00:02:01,070 ดังนั้นถ้าหากคุณจริงๆได้รับใจร้อนคุณ สามารถเริ่มต้นการยิงอิฐ 36 00:02:01,070 --> 00:02:02,120 และบางคนอื่น ๆ 37 00:02:02,120 --> 00:02:04,560 และสำหรับบรรดาของคุณที่ต้องการ สอบเทียบมาตรฐานกับแฮกเกอร์ 38 00:02:04,560 --> 00:02:08,750 รุ่นที่ผมจะเห็นว่าในสัปดาห์นี้ ฉบับที่แฮกเกอร์จงใจคือ 39 00:02:08,750 --> 00:02:12,830 เล็ก ๆ น้อย ๆ doable พูดกว่าพระเจ้า โหมดอยู่กับเกมของสิบห้า 40 00:02:12,830 --> 00:02:15,300 >> ดังนั้นหากคุณกำลังมองหาการยืดและ คุณกำลังมองหาเพื่อความสนุกสนานเพิ่มเติมบางอย่าง 41 00:02:15,300 --> 00:02:18,400 ที่ทำคุณสมบัติในการดำน้ำถ้าสนใจ 42 00:02:18,400 --> 00:02:21,280 ตอนนี้มากขึ้นในทางปฏิบัติให้ฉันชี้ ออกสิ่งหนึ่งเช่นกัน 43 00:02:21,280 --> 00:02:24,780 GDB ซึ่งบางส่วนของคุณอาจไม่ได้ยัง สัมผัสเองซึ่งเป็นเรื่องปกติ 44 00:02:24,780 --> 00:02:28,530 แต่ตอนนี้เป็นจริงเวลาที่จะได้รับใช้ นี้และความสะดวกสบายด้วยเครื่องมือนี้ 45 00:02:28,530 --> 00:02:31,510 เพราะมันจะทำให้ชีวิตของคุณ มากขึ้นอย่างแท้จริง 46 00:02:31,510 --> 00:02:34,900 >> ต่อการบรรยายของ Rob เมื่อ GDB คู่ ของสัปดาห์ที่ผ่านมาจำ 47 00:02:34,900 --> 00:02:36,810 ที่ GDB เป็นดีบัก 48 00:02:36,810 --> 00:02:41,230 มันเป็นเครื่องมือที่ช่วยให้คุณทำงานของคุณ โปรแกรม แต่ทำงานได้ทีละขั้นตอนสาย 49 00:02:41,230 --> 00:02:45,680 โดยสายเพื่อให้คุณสามารถกระตุ้นรอบ, เพื่อที่คุณจะเห็นสิ่งที่เกิดขึ้นดังนั้น 50 00:02:45,680 --> 00:02:47,310 ที่คุณสามารถพิมพ์ออกมา ค่าของตัวแปร 51 00:02:47,310 --> 00:02:50,580 ในระยะสั้นจะช่วยให้คุณมากขึ้น พลังงานกว่า printDef ไม่ 52 00:02:50,580 --> 00:02:52,900 >> ตอนนี้เป็นที่ยอมรับของอินเตอร์เฟซ เป็นความลับสวย 53 00:02:52,900 --> 00:02:55,180 อินเตอร์เฟซเป็นข้อความสีดำและสีขาว สำหรับส่วนใหญ่ 54 00:02:55,180 --> 00:02:57,400 คำสั่งที่ค่อนข้างจะยาก ที่ต้องจำไว้ในตอนแรก 55 00:02:57,400 --> 00:03:01,230 แต่ถึงแม้ว่ามันอาจนำคุณไปครึ่งหนึ่ง ชั่วโมงชั่วโมงที่จะนำล่วงหน้าว่า 56 00:03:01,230 --> 00:03:02,940 การลงทุนของเวลาเป็นมันไว้วางใจผม 57 00:03:02,940 --> 00:03:06,440 แน่นอนว่าภายในสิ้นภาคการศึกษาที่จะบันทึก คุณลำดับความสำคัญมากขึ้น 58 00:03:06,440 --> 00:03:07,600 เวลาไปกว่านั้น 59 00:03:07,600 --> 00:03:09,200 >> ดังนั้นในช่วงต้นสัปดาห์ดำน้ำค่ะ 60 00:03:09,200 --> 00:03:13,200 และในแง่ของการฝ่าวงล้อมรู้ว่าคุณ สามารถทำเช่นนี้ตราบใดที่คุณมี 61 00:03:13,200 --> 00:03:18,230 รหัสการกระจายหรือรหัสของคุณเอง ในความคืบหน้าในไดเรกทอรี Pst4 ของคุณ 62 00:03:18,230 --> 00:03:21,680 รู้ว่าคุณสามารถเรียกใช้ gdb. / แหกคุก 63 00:03:21,680 --> 00:03:23,490 >> นี้จะเปิดขึ้น หน้าต่างเช่นนี้ 64 00:03:23,490 --> 00:03:25,530 ผมขอให้ตัวเองมากขึ้น จากหน้าต่าง terminal 65 00:03:25,530 --> 00:03:27,770 และแล้วสิ่งที่ฉันจะไปข้างหน้า และก็ไม่ได้เป็นเพียงเรียกใช้มัน 66 00:03:27,770 --> 00:03:30,690 ฉันจะเป็นครั้งแรกตั้งจุดพัก การเรียกคืนซึ่งช่วยให้คุณสามารถหยุดการทำงานชั่วคราว 67 00:03:30,690 --> 00:03:32,500 ดำเนินการในสถานที่หนึ่ง 68 00:03:32,500 --> 00:03:35,750 >> เพียงเพื่อให้สิ่งที่ง่ายฉันจะ ที่จะทำลายที่หนึ่งบรรทัดเพียงแค่พิมพ์ 69 00:03:35,750 --> 00:03:37,000 หมายเลขหนึ่ง 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 ให้ฉันจริงเปิดหน้าต่างนี้ เพราะได้รับการ 72 00:03:43,250 --> 00:03:45,700 เล็ก ๆ น้อย ๆ 73 00:03:45,700 --> 00:03:53,270 ดังนั้นสิ่งที่ฉันตอนนี้จะทำนี่คือ ถ้าผมเปิดหน้าต่าง terminal ของฉัน 74 00:03:53,270 --> 00:03:53,910 มาที่มีเราไป 75 00:03:53,910 --> 00:03:59,850 >> ดังนั้นตอนนี้ถ้าผมกลับไปที่ dropbox, Pst4 และเรียกใช้ gdb. / ฝ่าวงล้อมเข้าไปแจ้งให้ทราบล่วงหน้า 76 00:03:59,850 --> 00:04:02,600 ฉันจะทำลายหนึ่งในการตั้งค่า จุดพักที่หนึ่งบรรทัด 77 00:04:02,600 --> 00:04:04,840 และตอนนี้ฉันจะไป ข้างหน้าและการทำงานประเภท 78 00:04:04,840 --> 00:04:07,370 และเมื่อฉันทำอะไรแจ้งให้ทราบล่วงหน้า ดูเหมือนว่าจะเกิดขึ้น 79 00:04:07,370 --> 00:04:08,120 >> มีป๊อปอัพไม่ได้ 80 00:04:08,120 --> 00:04:09,790 มีกราฟิกไม่ได้ ส่วนติดต่อผู้ใช้ยัง 81 00:04:09,790 --> 00:04:13,340 แต่ที่เข้าใจได้เพราะฉัน อย่างแท้จริงที่หนึ่งบรรทัดในโปรแกรมของฉัน 82 00:04:13,340 --> 00:04:17,110 และสังเกตเห็นว่าผมเคยส่งต่ออย่างรวดเร็ว โดยเฉพาะในขณะนี้ถึง 62 เพราะ 83 00:04:17,110 --> 00:04:20,600 สิ่งที่ด้านบนของไฟล์นี้คือ สิ่งที่ต้องการความเห็นและค่าคงที่และ 84 00:04:20,600 --> 00:04:22,460 สิ่งที่น่าทึ่งสำหรับตอนนี้ 85 00:04:22,460 --> 00:04:25,840 >> ดังนั้นตอนนี้ฉันภายในของหลัก ดูเหมือนว่าที่ 62 เส้น 86 00:04:25,840 --> 00:04:27,960 และนี้เป็นเพียงการกระจาย รหัสการเรียกคืน 87 00:04:27,960 --> 00:04:33,810 ถ้าผมเปิดขึ้นโดยไปในทำนองเดียวกัน ลงในไดเรกทอรีกล่องของฉันแวะไปที่ Pst4, 88 00:04:33,810 --> 00:04:35,450 เป็น breakout.c 89 00:04:35,450 --> 00:04:40,670 และถ้าฉันเลื่อนลงมาและลงและลง และแจ้งให้เราไปข้างหน้าและเปิด 90 00:04:40,670 --> 00:04:44,990 หมายเลขบรรทัดของฉัน 91 00:04:44,990 --> 00:04:50,300 >> สิ่งที่ฉันจะเห็นถ้าผมเลื่อนลงไป 62 เส้นตรงเส้นที่ 92 00:04:50,300 --> 00:04:50,910 เราได้หยุดชั่วคราวเมื่อ 93 00:04:50,910 --> 00:04:53,720 ดังนั้นสายนี้ที่นี่, 62, คือ ที่เรากำลังจะ 94 00:04:53,720 --> 00:04:57,470 ดังนั้นตอนนี้ใน GDB ถ้าฉันไปข้างหน้าและพิมพ์ ตอนนี้ต่อไปให้ใส่มันจะ 95 00:04:57,470 --> 00:04:58,450 ดำเนินการบรรทัดที่ 96 00:04:58,450 --> 00:05:00,610 และ voila เรามี ที่เรียกว่าหน้าต่างกรัม 97 00:05:00,610 --> 00:05:02,800 ถ้าไม่คุ้นเคยกับสิ่งที่ GWindow คือว่าไม่ต้องกังวล 98 00:05:02,800 --> 00:05:05,740 สเป็คจะแนะนำคุณให้มันเป็น รวมทั้งจำนวนของวิดีโอเกมส์ 99 00:05:05,740 --> 00:05:06,830 ที่ฝังอยู่ในสเป็ค 100 00:05:06,830 --> 00:05:08,610 >> แต่ตอนนี้ขอให้นี้ เล็ก ๆ น้อย ๆ ที่น่าสนใจมาก 101 00:05:08,610 --> 00:05:10,960 ผมขอย้ายหน้าต่างมากกว่านี้ ไปด้านข้างเล็กน้อย 102 00:05:10,960 --> 00:05:13,480 ผมขอให้หน้าต่างเล็ก ๆ น้อย ๆ ที่ใหญ่กว่าดังนั้นฉันสามารถดูรายละเอียดเพิ่มเติม 103 00:05:13,480 --> 00:05:16,140 >> และตอนนี้ให้ฉันไปข้างหน้า และทำต่อไปอีกครั้ง 104 00:05:16,140 --> 00:05:17,550 และมีอิฐของฉัน 105 00:05:17,550 --> 00:05:20,490 ถ้าผมพิมพ์ต่อไปอีกครั้ง ตอนนี้ฉันดูลูก 106 00:05:20,490 --> 00:05:23,520 และถ้าฉันพิมพ์ต่อไปอีกครั้ง ตอนนี้ผมเห็นพาย 107 00:05:23,520 --> 00:05:26,690 >> และโชคดีที่ Gedit นี้ไม่ได้ จริงๆความร่วมมือโดยแสดงให้ฉัน 108 00:05:26,690 --> 00:05:27,660 ทุกอย่างที่ฉันต้องการ 109 00:05:27,660 --> 00:05:30,820 แต่ตอนนี้ถ้าผมทำอะไรต่อไปอีกครั้ง ต่อไปอีกครั้งฉันก็เป็นเพียง 110 00:05:30,820 --> 00:05:32,260 ประกาศตัวแปรบางอย่าง 111 00:05:32,260 --> 00:05:34,750 และฉันสามารถพิมพ์ใดคนหนึ่ง ของคนเหล่านี้ออก 112 00:05:34,750 --> 00:05:37,170 อิฐพิมพ์ลายนิ้วมือชีวิต 113 00:05:37,170 --> 00:05:39,910 >> และตอนนี้ถ้าฉันยังคงทำ ต่อมาสังเกตเห็นว่าฉันจะ 114 00:05:39,910 --> 00:05:40,870 ด้านในของห่วงว่า 115 00:05:40,870 --> 00:05:43,380 แต่รหัสที่เป็นไปที่จะดำเนินการ ตรงตามที่ผมคาดว่า 116 00:05:43,380 --> 00:05:45,810 ดังนั้นเมื่อผมกดปุ่มฟังก์ชั่นนี้รอ สำหรับการคลิกที่มันจะทำ 117 00:05:45,810 --> 00:05:46,830 มันอย่างแท้จริงว่า 118 00:05:46,830 --> 00:05:48,870 ดังนั้นผมจึงดูเหมือนจะสูญเสียการควบคุม ผ่านโปรแกรม 119 00:05:48,870 --> 00:05:50,480 >> GDB จะไม่ให้ฉันแจ้งให้อีก 120 00:05:50,480 --> 00:05:51,500 แต่ไม่ต้องกังวล 121 00:05:51,500 --> 00:05:53,720 ไปที่เกมของฉันให้คลิกที่ใดที่หนึ่ง 122 00:05:53,720 --> 00:05:56,270 >> และ voila ตอนนี้ก็ดำเนินการกับสาย 86 123 00:05:56,270 --> 00:05:59,460 ดังนั้นอีกครั้งมันล้ำค่าในที่สุด สำหรับปัญหาการแก้จุดบกพร่อง 124 00:05:59,460 --> 00:06:03,050 เพราะคุณอักษรสามารถก้าวผ่าน รหัสของคุณสิ่งที่พิมพ์ออกมาและมาก, 125 00:06:03,050 --> 00:06:03,640 มากขึ้น 126 00:06:03,640 --> 00:06:07,210 แต่ตอนนี้เครื่องมือเหล่านั้นเพียงอย่างเดียว ควรจะได้รับคุณสวยไกล 127 00:06:07,210 --> 00:06:10,050 >> ดังนั้นเราจึงไม่แน่นอนการดู กราฟิกที่ตอนนี้ทั้งหมดในทันที 128 00:06:10,050 --> 00:06:12,350 และตอนนี้โลกของเราได้รับน้อย น่าสนใจมากขึ้น 129 00:06:12,350 --> 00:06:15,680 และคุณรู้ว่าบางทีจากบางส่วนของ วิดีโอออนไลน์ที่เรามีเหล่านี้ 130 00:06:15,680 --> 00:06:18,280 กางเกงขาสั้นที่คุณได้รับชม เป็นส่วนหนึ่งของชุดปัญหา 131 00:06:18,280 --> 00:06:20,460 >> และพวกเขาได้ถูกยิงจงใจ กับฉากหลังสีขาว 132 00:06:20,460 --> 00:06:23,380 และบางส่วนของพวกเขามีการเรียนการสอน Fellows วาดข้อความบางอย่างเกี่ยวกับ 133 00:06:23,380 --> 00:06:25,490 หน้าจอที่หนักหน่วง ที่ด้านข้างของพวกเขา 134 00:06:25,490 --> 00:06:27,760 แต่หลักสูตรนี้ไม่ได้ทั้งหมดว่า ที่น่าสนใจในโลกแห่งความจริง 135 00:06:27,760 --> 00:06:30,520 นี่เป็นเพียงหอประชุมด้วย หน้าจอสีขาวขนาดใหญ่และฉากหลัง 136 00:06:30,520 --> 00:06:33,330 และการผลิตเรียงลำดับทีมที่น่าตื่นตาตื่นใจของเรา ของทำให้ทุกอย่างดูสวยงาม 137 00:06:33,330 --> 00:06:36,620 หลังจากที่ความเป็นจริงโดยการปลูกพืชออก หรือซ้อนทับสิ่งใด 138 00:06:36,620 --> 00:06:37,840 ที่เราทำหรือไม่ต้องการ 139 00:06:37,840 --> 00:06:41,560 >> ตอนนี้เพียงแค่การกระตุ้นสัปดาห์นี้และ จริงๆที่คุณสามารถไปในที่สุด 140 00:06:41,560 --> 00:06:42,560 กับวิทยาศาสตร์คอมพิวเตอร์ 141 00:06:42,560 --> 00:06:44,260 ไม่ได้เป็นเพียงปัญหาหลังจากตั้งสี่ 142 00:06:44,260 --> 00:06:48,240 แต่หลังจากจบหลักสูตรอื่นหรือทั้งหมด หลักสูตรมันน่าพิศวงสิ่งที่คุณสามารถ 143 00:06:48,240 --> 00:06:51,090 ทำวันนี้ในแง่ของการ กราฟิกโดยเฉพาะอย่างยิ่ง 144 00:06:51,090 --> 00:06:53,440 >> บางส่วนของคุณอาจได้เห็นนี้ ไหลรอบออนไลน์ 145 00:06:53,440 --> 00:06:56,240 แต่ฉันคิดว่าฉันต้องการแสดงให้คุณเพียง ไม่กี่นาทีเหลือบของสิ่งที่ 146 00:06:56,240 --> 00:07:01,890 เทคโนโลยีคอมพิวเตอร์และสิ่งที่ CGI, คอมพิวเตอร์กราฟิกสามารถทำวันนี้ 147 00:07:01,890 --> 00:07:04,510 กับเพลงที่คุ้นเคย และบางทีอาจจะเป็นภาพยนตร์ 148 00:07:04,510 --> 00:07:05,760 >> เพลง [- LANA DEL RAY, "YOUNG และสวยงาม] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> ลำโพง 1: มันก็แค่นิด ๆ หน่อย ๆ ที่น่าตื่นตาตื่นใจบางทีแค่ไหน 151 00:10:52,470 --> 00:10:52,857 ขับไล่ - 152 00:10:52,857 --> 00:10:57,040 >> [APPLAUSE] 153 00:10:57,040 --> 00:10:59,230 >> ลำโพง 1: ผมเพิ่งดาวน์โหลดมัน 154 00:10:59,230 --> 00:11:02,920 แต่มันเป็นที่น่าตื่นตาตื่นใจจริงๆผมคิดว่าเพียงแค่ วิธีการที่ซอฟต์แวร์อยู่ทั่วไปทุกหนทุกแห่งและรหัสและ 155 00:11:02,920 --> 00:11:04,230 เครื่องมือเช่นนี้จริงๆ 156 00:11:04,230 --> 00:11:07,685 เพื่อให้รสชาติของทิศทางของ ในที่ที่คุณสามารถไป 157 00:11:07,685 --> 00:11:10,620 โอ้ Appliance ไม่มีอะไรมากวันนี้ 158 00:11:10,620 --> 00:11:14,640 ดีที่ช่วงเวลาที่น่าเศร้าจริง กำหนดจุดที่ฉันเพียงแค่พยายามที่จะทำให้ 159 00:11:14,640 --> 00:11:18,670 >> ทั้งหมดขวาจึงขอเปิดตัว ฟิวชั่นอีกครั้ง 160 00:11:18,670 --> 00:11:20,800 เตือนฉันภายหลัง 161 00:11:20,800 --> 00:11:24,190 ทั้งหมดถูกต้องและคุณควรจะได้มี อีเมล์เป็นกันถ้าคุณได้รับ 162 00:11:24,190 --> 00:11:25,460 สังเกตเห็นว่า 163 00:11:25,460 --> 00:11:29,940 ทั้งหมดที่ถูกต้องเพื่อให้จำได้ว่าสัปดาห์ที่ผ่านมา เราเริ่มที่จะปอกเปลือกกลับนี้ 164 00:11:29,940 --> 00:11:31,380 ภายหลังเป็นที่รู้จักสตริง 165 00:11:31,380 --> 00:11:34,700 >> สตริงจำได้ว่าชนิดข้อมูลที่ ประกาศใน CS50 ห้องสมุด 166 00:11:34,700 --> 00:11:37,740 และมันก็เป็นส่วนหนึ่งของการฝึกอบรมล้อ ว่าตอนนี้จะเริ่มต้นที่จะปิด 167 00:11:37,740 --> 00:11:41,280 มันเป็นแนวความคิดที่เป็นประโยชน์ในช่วงต้น 168 00:11:41,280 --> 00:11:43,750 แต่ตอนนี้มันกำลังจะได้รับเพิ่มเติม ที่น่าสนใจและมีประสิทธิภาพมากขึ้นเพื่อ 169 00:11:43,750 --> 00:11:48,330 จริงเห็นว่าภายใต้ประทุน, สตริงเป็นเพียงสิ่งที่เราไม่กล่าวว่า? 170 00:11:48,330 --> 00:11:50,500 >> ผมจึงเรียกว่า char * 171 00:11:50,500 --> 00:11:53,860 และมี * หมายถึงว่ามี บางชนิดของที่อยู่ที่เกี่ยวข้อง 172 00:11:53,860 --> 00:11:58,690 ดังนั้นเมื่อคุณพูด ​​char * คุณเพียงแค่หมายถึง ตัวแปรที่มีข้อมูลประเภทคือ 173 00:11:58,690 --> 00:11:59,290 ชี้ขณะนี้ 174 00:11:59,290 --> 00:12:01,770 เป็นจริงที่มีดาวมี ก็หมายความว่าคุณได้รับการประกาศ 175 00:12:01,770 --> 00:12:03,020 ตัวชี้ที่เรียกว่า 176 00:12:03,020 --> 00:12:06,220 และตัวชี้ที่จะเห็นได้ชัดว่า เก็บที่อยู่ของของ 177 00:12:06,220 --> 00:12:07,810 แน่นอนถ่าน 178 00:12:07,810 --> 00:12:08,960 >> ตอนนี้ไม่ทำให้รู้สึกว่าทำไม? 179 00:12:08,960 --> 00:12:11,200 ดีเป็นสตริงอะไร ภายใต้ฝากระโปรง? 180 00:12:11,200 --> 00:12:15,130 ดีบางครั้งที่เราได้รับการบอกว่า สตริงดังกล่าวจะอยู่ภายใต้ฝากระโปรงเป็น 181 00:12:15,130 --> 00:12:18,460 เพียงแค่ H-e-l-L-o ตัวอย่างเช่น 182 00:12:18,460 --> 00:12:21,585 >> แต่เราได้พูดคุยเกี่ยวกับเรื่องนี้ในขณะที่ ถูกหลักอาร์เรย์ 183 00:12:21,585 --> 00:12:25,410 และแถวนั้นก็จะดูเล็ก ๆ น้อย ๆ มากขึ้นเช่นนี้กับแต่ละเหล่านี้ 184 00:12:25,410 --> 00:12:26,460 การขึ้นกัด 185 00:12:26,460 --> 00:12:28,710 แล้วเราได้กล่าวว่ามี บางสิ่งที่พิเศษกลับมาที่นี่, 186 00:12:28,710 --> 00:12:31,270 เครื่องหมายทับขวา 0 หรือ null terminator 187 00:12:31,270 --> 00:12:35,230 >> ดังนั้นเวลานี้ที่นี่ ได้รับสตริง 188 00:12:35,230 --> 00:12:38,320 แต่จริงๆสตริงคือ จริงที่อยู่ 189 00:12:38,320 --> 00:12:43,210 และที่อยู่ที่เราจะเห็นมักจะ นำหน้าด้วย 0x โดยการประชุม 190 00:12:43,210 --> 00:12:44,540 สิ่งที่ไม่ 0x แสดง? 191 00:12:44,540 --> 00:12:45,970 ไม่มีใครรู้? 192 00:12:45,970 --> 00:12:47,320 >> ดังนั้นมันก็หมายความว่าเลขฐานสิบหก 193 00:12:47,320 --> 00:12:52,360 ดังนั้นคุณอาจจำจริงจาก PST 1 ผมเชื่อว่าหนึ่งในการอุ่นเครื่อง 194 00:12:52,360 --> 00:12:55,740 คำถามจริงถามเกี่ยวกับ เลขฐานสิบหกที่นอกเหนือไปจาก 195 00:12:55,740 --> 00:12:57,100 ไบนารีและทศนิยม 196 00:12:57,100 --> 00:13:00,460 และแรงจูงใจที่นี่คือ กับเลขฐานสิบหกคุณมี 16 197 00:13:00,460 --> 00:13:01,770 หลักในการกำจัดของคุณ 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ตาม โดย A, B, C, D, E, F 199 00:13:07,900 --> 00:13:10,430 >> และถ้าคุณนับทั้งหมดขึ้นเหล่านั้น คุณจะได้รับรวมเป็น 16 200 00:13:10,430 --> 00:13:13,200 ดังนั้นนี้เป็นในทางตรงกันข้ามกับ ทศนิยมที่เรามี 10 201 00:13:13,200 --> 00:13:14,690 ตัวเลข 0 ถึงเก้า 202 00:13:14,690 --> 00:13:17,750 มันเป็นในทางตรงกันข้ามกับไบนารี ที่เรามีเพียง 0 และ 1 203 00:13:17,750 --> 00:13:21,450 >> แต่ในตอนท้ายของวันที่คุณสามารถเพียงแค่ แทนตัวเลขเดียวกัน แต่ 204 00:13:21,450 --> 00:13:22,500 ค่อนข้างแตกต่างกัน 205 00:13:22,500 --> 00:13:25,840 และเลขฐานสิบหกเป็นเรื่องธรรมดาเพราะเป็น มันจะเปิดออก - และเราจะเห็นสิ่งนี้ 206 00:13:25,840 --> 00:13:28,790 ต่อมาในหลักสูตร - แม้เมื่อเราได้รับ การเขียนโปรแกรมเว็บในบริบทของ 207 00:13:28,790 --> 00:13:32,100 HTML และรหัสสี, เลขฐานสิบหกเป็นสิ่งที่ดี 208 00:13:32,100 --> 00:13:36,390 เพราะแต่ละหลัก, จะเปิดออก แสดงให้เห็นถึงสี่บิตอย่างสมบูรณ์แบบ 209 00:13:36,390 --> 00:13:39,280 ดังนั้นจึงเป็นเพียงแค่ชนิดของสายขึ้นอย่าง ในขณะที่เราจะเห็นในที่สุด 210 00:13:39,280 --> 00:13:44,720 ดังนั้นนี้อาจจะมีบางสิ่งบางอย่างหรือ Ox123 เช่นเดียวกับที่ 123 ที่อยู่, denoting 211 00:13:44,720 --> 00:13:47,050 ที่ไหนสักแห่งภายในของฉัน หน่วยความจำของคอมพิวเตอร์ 212 00:13:47,050 --> 00:13:50,600 >> แต่แน่นอนปัญหาบางอย่างเกิดขึ้น เพราะพื้นฐานนี้ 213 00:13:50,600 --> 00:13:51,520 การดำเนินงาน 214 00:13:51,520 --> 00:13:55,930 และจำได้ว่าผมเอาที่แทง ฟังก์ชั่นการดำเนินการเช่นนี้ - 215 00:13:55,930 --> 00:14:00,260 เปรียบเทียบรีบ 0 จุด C สัปดาห์ที่ผ่านมาว่า แม้ว่ามันจะดูเหมือนว่ามันเป็น 216 00:14:00,260 --> 00:14:04,270 ขวามันก็ไม่ได้เปรียบเทียบ สองสายได้อย่างถูกต้อง 217 00:14:04,270 --> 00:14:07,470 >> ฉันโยนทิ้งไปหลักและฉันได้โยน ออกความเห็นเพียงเพื่อมุ่งเน้นใน 218 00:14:07,470 --> 00:14:08,970 รหัสที่มีความสนใจที่นี่ 219 00:14:08,970 --> 00:14:10,660 และมันก็เป็นสีแดงเพราะมันเป็นรถม้าชนิดเล็ก 220 00:14:10,660 --> 00:14:11,670 สำหรับสิ่งที่เหตุผล? 221 00:14:11,670 --> 00:14:15,890 >> ดีที่ด้านบนมีเมื่อฉันประกาศ สตริงสิ่งที่จริงที่เกิดขึ้น 222 00:14:15,890 --> 00:14:17,260 ภายใต้ฝากระโปรง? 223 00:14:17,260 --> 00:14:19,530 ดีให้ฉันข้ามไป หน้าจอที่นี่และวาดว่า 224 00:14:19,530 --> 00:14:23,230 ดังนั้นผมจึงมีการประกาศอีกครั้ง GetString สตริง s 225 00:14:23,230 --> 00:14:26,640 >> ดังนั้นฉันจะไปข้างหน้าในขณะนี้และ วาด s สำหรับสิ่งที่มันคือเรื่องจริง 226 00:14:26,640 --> 00:14:28,590 มันจะเป็นตารางที่นี่ 227 00:14:28,590 --> 00:14:30,490 และฉันจะเรียกร้อง ว่าที่ 32 บิต 228 00:14:30,490 --> 00:14:32,890 อย่างน้อยก็มักจะเป็น อย่างน้อยใน CS50 229 00:14:32,890 --> 00:14:34,520 เครื่องใช้ในจำนวนมากของเครื่องคอมพิวเตอร์ 230 00:14:34,520 --> 00:14:35,980 ฉันจะเรียกมันว่า s 231 00:14:35,980 --> 00:14:39,070 >> แต่ตอนนี้จำได้ว่าเรา เรียกว่า GetString 232 00:14:39,070 --> 00:14:41,430 ผลตอบแทนที่ GetString ดังนั้น ของหลักสูตรสตริง 233 00:14:41,430 --> 00:14:45,790 ถ้าผู้ใช้ใน H-e-l-L-O ใส่ สตริงสวัสดีได้รับกลับมา 234 00:14:45,790 --> 00:14:51,010 และสตริงที่ในขณะที่เราเพียงแค่บอกว่าจบ ขึ้นที่ไหนสักแห่งในหน่วยความจำของคอมพิวเตอร์ของคุณ 235 00:14:51,010 --> 00:14:53,240 กับ 0 เครื่องหมายทับขวาที่สิ้นสุด 236 00:14:53,240 --> 00:14:56,650 ผมจะวาดนี้เช่นอาร์เรย์ - หรือ บล็อกติดกันของตัวละคร - 237 00:14:56,650 --> 00:14:58,330 ที่มันเป็นจริง 238 00:14:58,330 --> 00:15:01,790 >> และตอนนี้สิ่งที่เป็น getString จริงกลับไปที่ไหน? 239 00:15:01,790 --> 00:15:04,340 สิ่งที่ได้รับกลับมา getString ทั้งหมดในเวลานี้? 240 00:15:04,340 --> 00:15:07,520 ดีที่เราบอกว่าในสัปดาห์ก่อน, ก็จะส่งกลับสตริง 241 00:15:07,520 --> 00:15:10,250 แต่ในทางเทคนิคสิ่งที่ไม่ getString ผลตอบแทนที่เห็นได้ชัด? 242 00:15:10,250 --> 00:15:11,610 >> ผู้ชม: ที่อยู่ 243 00:15:11,610 --> 00:15:12,600 >> ลำโพง 1: ที่อยู่ 244 00:15:12,600 --> 00:15:16,630 โดยเฉพาะที่จะส่งกลับที่อยู่ของ กัดแรกสิ่งที่เป็น 245 00:15:16,630 --> 00:15:18,830 ผมให้ใช้เพียงหนึ่งสองสาม เพราะมันสะดวก 246 00:15:18,830 --> 00:15:21,380 >> ก็จะส่งกลับที่อยู่ของแรก ตัวอักษรในสตริง 247 00:15:21,380 --> 00:15:23,510 และเรากล่าวว่าสัปดาห์สุดท้ายที่ ที่เพียงพอ 248 00:15:23,510 --> 00:15:26,710 เพราะเรามักจะสามารถคิดออกว่า ในตอนท้ายของสตริงเพียงแค่ 249 00:15:26,710 --> 00:15:30,150 iterating กว่ามันอาจจะมีสำหรับ ห่วงหรือในขณะที่ห่วงหรือสิ่งที่ต้องการ 250 00:15:30,150 --> 00:15:34,990 ที่เพียงแค่มองหา "เครื่องหมาย 0" ตัวละครแมวมองพิเศษ 251 00:15:34,990 --> 00:15:37,220 >> แล้วเรารู้ว่าสตริง ที่จะเกิดขึ้นของความยาว - 252 00:15:37,220 --> 00:15:37,980 ในกรณีนี้ - 253 00:15:37,980 --> 00:15:38,670 ห้า 254 00:15:38,670 --> 00:15:43,800 ดังนั้นในทางเทคนิคสิ่ง GetString ไม่ มันคือผลตอบแทนที่ Ox123 ในกรณีนี้ 255 00:15:43,800 --> 00:15:53,670 และในทางเทคนิคแล้วสิ่งที่เกิดขึ้นคือ ที่เราจัดเก็บภายในของ s, Ox123 256 00:15:53,670 --> 00:15:56,460 ในตอนท้ายของวันที่แม้ว่านี้ เป็นแนวคิดใหม่ชี้ว่าพวกเขากำลัง 257 00:15:56,460 --> 00:15:57,350 ตัวแปรเพียง 258 00:15:57,350 --> 00:16:00,440 แต่พวกเขาเกิดขึ้นในการจัดเก็บบิตที่ รวมแสดงที่อยู่ 259 00:16:00,440 --> 00:16:03,700 ดังนั้นในทางเทคนิคทั้งหมดที่พวกเขาได้รับ เก็บไว้ในเป็น Ox123 260 00:16:03,700 --> 00:16:04,680 >> แต่เราเป็นมนุษย์ - 261 00:16:04,680 --> 00:16:06,020 รวมทั้งวันนี้เป็นต้นไป - 262 00:16:06,020 --> 00:16:09,290 จริงๆไม่ได้ไปดูแลปกติ ที่อยู่ที่เกิดขึ้นจริงคือสิ่งที่ 263 00:16:09,290 --> 00:16:10,520 ของหน่วยความจำอันบาง 264 00:16:10,520 --> 00:16:14,040 มันเป็นเพียงในระดับต่ำของรายละเอียดเพื่อ จะน่าสนใจทางสติปัญญา 265 00:16:14,040 --> 00:16:15,440 ดังนั้นฉันจะยกเลิกการนี​​้ 266 00:16:15,440 --> 00:16:19,810 แทนระดับสูงมากขึ้นเพียงแค่พูดว่า ที่ว่าเมื่อเรากำลังพูดถึงเกี่ยวกับตัวชี้ 267 00:16:19,810 --> 00:16:22,170 ฉันจะเพียงแค่วาดขึ้น ลูกศรใช้งานง่ายที่บ่งบอกถึง 268 00:16:22,170 --> 00:16:26,060 ความคิดเดียวกันและบทคัดย่อไป รายการของสิ่งที่เกิดขึ้นจริง 269 00:16:26,060 --> 00:16:27,700 ที่อยู่พื้นฐานคือ 270 00:16:27,700 --> 00:16:33,290 >> ตอนนี้ถ้าเรากลับไปที่รหัสสิ่งที่ ที่เกิดขึ้นสัปดาห์ที่ผ่านมาถ้าเรามีสาย T 271 00:16:33,290 --> 00:16:34,510 เท่ากับ getString? 272 00:16:34,510 --> 00:16:38,630 ดีถ้าผมอีกครั้งประเภทในสวัสดี เวลาที่ฉันจะได้รับนี้ 273 00:16:38,630 --> 00:16:40,460 หน่วยความจำอันอื่น 274 00:16:40,460 --> 00:16:44,820 H-e-l-l-o-0 เครื่องหมายทับขวา 275 00:16:44,820 --> 00:16:48,320 >> แต่เพราะฉันเรียกว่า getString เป็นครั้งที่สอง - 276 00:16:48,320 --> 00:16:51,100 และฉันรู้ว่านี้กำลังมองหาที่ รหัสแหล่งที่มาสำหรับ GetString - แม้ 277 00:16:51,100 --> 00:16:54,350 แม้ว่ามันจะบังเอิญว่าสวัสดีเป็น พิมพ์ในสองครั้ง GetString ไม่ได้เป็น 278 00:16:54,350 --> 00:16:55,890 จะพยายามที่จะเพิ่มประสิทธิภาพ และจะฉลาด 279 00:16:55,890 --> 00:16:58,550 มันก็จะได้รับก้อนของผู้อื่น หน่วยความจำจากคอมพิวเตอร์ซึ่งเป็น 280 00:16:58,550 --> 00:16:59,640 จะเป็นที่อยู่ที่อื่น 281 00:16:59,640 --> 00:17:02,330 ขอเพียงแค่พูดว่าพล 456 282 00:17:02,330 --> 00:17:04,079 >> และแล้วมันก็คือสิ่งที่เกิดขึ้นที่จะกลับมา? 283 00:17:04,079 --> 00:17:08,030 มันจะกลับมา 456 และเก็บไว้ในที 284 00:17:08,030 --> 00:17:12,010 ดังนั้นสิ่งที่เป็นจริงที่เกิดขึ้นเมื่อ ด้านซ้ายมือเป็นฉันมีก้อนอื่น 285 00:17:12,010 --> 00:17:14,260 ของหน่วยความจำ 32 บิตโดยทั่วไปแล้ว 286 00:17:14,260 --> 00:17:16,720 และในนั้นเป็นไป Ox456 287 00:17:16,720 --> 00:17:20,140 แต่อีกครั้งฉันไม่สนใจในเหล่านี้ โดยเฉพาะอย่างยิ่งตัวเลขอีกต่อไป 288 00:17:20,140 --> 00:17:23,069 ฉันแค่จะไปเป็นนามธรรม วาดลูกศร 289 00:17:23,069 --> 00:17:25,202 >> ดังนั้นนี่คือตอนนี้คำอธิบายใหม่ 290 00:17:25,202 --> 00:17:28,735 แต่มันเป็นความคิดที่แน่นอนเดียวกันที่ รับสิ่งที่เกิดขึ้นทั้งหมดในครั้งนี้ 291 00:17:28,735 --> 00:17:33,150 และเพื่อเหตุผลแล้วว่านี่เป็นครั้งแรก รุ่นของรถเปรียบเทียบคือ 292 00:17:33,150 --> 00:17:34,480 สัปดาห์ที่ผ่านมาทำไม 293 00:17:34,480 --> 00:17:38,000 เมื่อคุณทำเช่นถ้า s เท่ากับเท่ากับ ทีสิ่งที่เป็นคุณอย่างแท้จริง 294 00:17:38,000 --> 00:17:40,550 ภายใต้ฝากระโปรงเปรียบเทียบ? 295 00:17:40,550 --> 00:17:41,910 >> คุณกำลังเปรียบเทียบอยู่ 296 00:17:41,910 --> 00:17:47,950 และเพียงแค่สังหรณ์ใจอย่างเห็นได้ชัด, Ox123 จะไม่เท่ากับ Ox456 297 00:17:47,950 --> 00:17:49,380 ตัวเลขเหล่านั้นบรรดาบิต จะแตกต่างกันเพียงแค่ 298 00:17:49,380 --> 00:17:53,220 >> และอื่น ๆ อย่างต่อเนื่องสัปดาห์ที่ผ่านมาก็กล่าวว่า คุณพิมพ์สิ่งที่แตกต่างแม้ว่า 299 00:17:53,220 --> 00:17:55,360 เป็นคำต่อคำคำเดียวกัน 300 00:17:55,360 --> 00:17:58,770 ดังนั้นเราจึงแก้ไขปัญหานี้ 301 00:17:58,770 --> 00:18:00,120 ในแง่คนธรรมดาสิ่งที่แก้ไขคือ? 302 00:18:00,120 --> 00:18:02,110 >> ผู้ชม: ใช้ฟังก์ชัน 303 00:18:02,110 --> 00:18:02,870 >> 1 SPEAKER: ใช้ฟังก์ชั่น 304 00:18:02,870 --> 00:18:05,190 หรือดาวที่มีส่วนเกี่ยวข้องแน่นอน แต่ใช้ฟังก์ชั่นที่จะทำอะไร 305 00:18:05,190 --> 00:18:05,962 >> ผู้ชม: เพ​​ื่อเปรียบเทียบสตริง 306 00:18:05,962 --> 00:18:07,390 >> 1 SPEAKER: เพื่อเปรียบเทียบสตริง 307 00:18:07,390 --> 00:18:11,030 ดังนั้นปัญหาพื้นฐานที่นี่คือ ว่าฉันเป็นเพียงการพิจารณา 308 00:18:11,030 --> 00:18:15,870 คุณภาพของสายที่จะถูกกำหนดโดย การเปรียบเทียบของที่อยู่ของพวกเขา 309 00:18:15,870 --> 00:18:18,540 และเห็นได้ชัดว่าเป็นใบ้เพียงครั้งเดียวในขณะนี้ คุณเข้าใจสิ่งที่เกิดขึ้น 310 00:18:18,540 --> 00:18:19,510 ภายใต้ฝากระโปรง 311 00:18:19,510 --> 00:18:23,270 อย่างแท้จริงเปรียบเทียบสตริงเพื่อดูว่า พวกเขาจะเท่าเทียมกันในวิธีการที่มนุษย์ 312 00:18:23,270 --> 00:18:26,680 จะพิจารณาสองสายจะเท่ากับ เราต้องเปรียบเทียบพวกเขาสำหรับตัวละคร 313 00:18:26,680 --> 00:18:28,070 ตัวอักษรสำหรับอักขระ 314 00:18:28,070 --> 00:18:30,020 >> ตอนนี้ฉันจะได้ทำ นี้อย่างน่าเอือมระอา 315 00:18:30,020 --> 00:18:32,240 แต่กันเองเราไม่ ใช้สำหรับวง 316 00:18:32,240 --> 00:18:36,050 และเพียงแค่เปรียบเทียบวงเล็บ s ผมกับทียึดผม 317 00:18:36,050 --> 00:18:39,590 s วงเล็บผมบวก 1 กับ T วงเล็บ ผมบวก 1, และอื่น ๆ ภายใน 318 00:18:39,590 --> 00:18:40,580 ชนิดของห่วงบาง 319 00:18:40,580 --> 00:18:44,950 และถ้าจุดใดที่ตัวละครทั้งสอง แตกต่างกันหรือถ้าฉันตระหนักดีว่าโอคือ 320 00:18:44,950 --> 00:18:48,410 สั้นกว่า T หรือนานกว่า T ฉันทันทีสามารถพูดเท็จ 321 00:18:48,410 --> 00:18:49,390 พวกเขาไม่ได้เหมือนกัน 322 00:18:49,390 --> 00:18:55,370 >> แต่ถ้าฉันได้รับผ่านและ T และพูดว่า เดียวกันเดียวกันเดียวกันเดียวกันสิ้นสุดเดียวกันของ 323 00:18:55,370 --> 00:18:58,520 สตริงทั้งฉันสามารถพูดได้ ความจริงพวกเขามีค่าเท่ากัน 324 00:18:58,520 --> 00:19:01,040 ดีโชคดีปีที่ผ่านมาใครบางคน เขียนรหัสว่าสำหรับเรา 325 00:19:01,040 --> 00:19:03,790 >> และพวกเขาเรียกมันว่า StrComp สำหรับสตริงเปรียบเทียบ 326 00:19:03,790 --> 00:19:11,900 และถึงแม้จะเป็นเคาน์เตอร์เล็ก ๆ น้อย ๆ ใช้งานง่าย StrComp กลับ 0 ถ้าคนเหล่านั้น 327 00:19:11,900 --> 00:19:14,520 สองสตริง, S และ T จะเหมือนกัน 328 00:19:14,520 --> 00:19:18,090 แต่ก็จะส่งกลับค่าลบถ้า s ควรจะมาก่อน T ตามลำดับตัวอักษรหรือ 329 00:19:18,090 --> 00:19:20,610 ค่าบวกถ้ามันจะมา หลังจากที่ T ตามลำดับตัวอักษร 330 00:19:20,610 --> 00:19:24,030 >> ดังนั้นหากคุณเคยต้องการที่จะเรียงลำดับบางสิ่งบางอย่าง ปรากฎว่า StrComp เป็นประโยชน์ 331 00:19:24,030 --> 00:19:26,660 เพราะไม่เพียงแค่พูดว่า ใช่หรือไม่เท่ากันหรือไม่ 332 00:19:26,660 --> 00:19:30,440 มันจะให้ความรู้สึกของการสั่งซื้อ เช่นพจนานุกรมอาจ 333 00:19:30,440 --> 00:19:33,770 ดังนั้น StrComp, s จุลภาค T เท่ากับ เท่ากับ 0 หมายความว่า 334 00:19:33,770 --> 00:19:35,200 สตริงมีความเสมอภาคอย่างแท้จริง 335 00:19:35,200 --> 00:19:38,680 เพราะใครก็ตามที่เขียนฟังก์ชันนี้ ปีที่ผ่านมาน่าจะนำมาใช้สำหรับวง 336 00:19:38,680 --> 00:19:42,840 หรือในขณะที่ห่วงหรือสิ่งที่ต้องการที่ เพื่อบูรณาการตัวละครอีกครั้ง 337 00:19:42,840 --> 00:19:45,270 และอีกครั้งและอีกครั้ง 338 00:19:45,270 --> 00:19:47,300 >> แต่สองปัญหาที่เกิดขึ้นที่นี่ 339 00:19:47,300 --> 00:19:48,750 นี่เป็น copy0.c 340 00:19:48,750 --> 00:19:51,680 และทั้งสองคนในชุดสีแดงเป็น เพราะมันเป็นข้อบกพร่อง 341 00:19:51,680 --> 00:19:52,800 และสิ่งที่พวกเราทำที่นี่? 342 00:19:52,800 --> 00:19:54,310 ดีแรกที่ผมเรียกว่า getString 343 00:19:54,310 --> 00:19:56,255 และฉันเก็บค่าตอบแทนใน s 344 00:19:56,255 --> 00:20:00,260 ดังนั้นที่สวยมากเช่นเดียวกับ นี้ส่วนบนของภาพ 345 00:20:00,260 --> 00:20:01,490 >> แต่เกิดขึ้นหลังจากที่อะไร 346 00:20:01,490 --> 00:20:04,980 ดีให้ฉันไปข้างหน้าและได้รับการกำจัด ของทั้งกลุ่มนี้ 347 00:20:04,980 --> 00:20:09,650 เราจะย้อนกลับในเวลาที่จะที่เราเพียงแค่ มี s ซึ่งขณะนี้สอดคล้องกับ 348 00:20:09,650 --> 00:20:10,940 หนึ่งบรรทัดขึ้น 349 00:20:10,940 --> 00:20:11,400 >> ผมตรวจสอบ 350 00:20:11,400 --> 00:20:13,450 ถ้า s เท่ากับเท่ากับ 0 351 00:20:13,450 --> 00:20:18,670 ตอนนี้ทราบด้านข้างอย่างรวดเร็วเมื่อ GetString อาจกลับ 0? 352 00:20:18,670 --> 00:20:19,580 มีหน่วยความจำไม่พอ 353 00:20:19,580 --> 00:20:19,880 ใช่ไหม? 354 00:20:19,880 --> 00:20:22,310 >> มันหายากว่าเรื่องนี้จะเกิดขึ้น, แน่นอนบนคอมพิวเตอร์ที่เป็น 355 00:20:22,310 --> 00:20:24,740 หลายร้อย megs หรือ แม้แต่กิ๊กของ RAM 356 00:20:24,740 --> 00:20:27,080 แต่มันอาจจะในทางทฤษฎีกลับ 0 โดยเฉพาะอย่างยิ่งถ้า 357 00:20:27,080 --> 00:20:28,080 ผู้ใช้ไม่ให้ความร่วมมือ 358 00:20:28,080 --> 00:20:31,640 มีวิธีที่จะแกล้งทำเป็นเหมือนคุณมีไม่ได้อะไร อะไรที่ป้อนและเคล็ดลับ 359 00:20:31,640 --> 00:20:34,100 getString เข้ากลับมา 0 ได้อย่างมีประสิทธิภาพ 360 00:20:34,100 --> 00:20:35,470 >> ดังนั้นมันจะตรวจสอบว่า 361 00:20:35,470 --> 00:20:39,430 เพราะถ้าใด ๆ ของคุณได้เริ่มต้น ได้รับแล้วความผิดพลาดของการแบ่งส่วน - 362 00:20:39,430 --> 00:20:42,280 ที่ได้รับอาจจะเป็นแหล่งที่มา ของบางแห้ว - 363 00:20:42,280 --> 00:20:46,150 เหล่านั้นก็มักจะเป็นผลที่ตามมา ข้อผิดพลาดของหน่วยความจำที่เกี่ยวข้องกับ 364 00:20:46,150 --> 00:20:50,440 อย่างไรก็ตามคุณ messed up ในเรื่องเกี่ยวกับ ตัวชี้แม้ว่าคุณจะไม่ได้ตระหนักถึง 365 00:20:50,440 --> 00:20:51,530 มีตัวชี้เป็น 366 00:20:51,530 --> 00:20:55,260 ดังนั้นคุณอาจจะมีการเหนี่ยวนำให้เกิดการแบ่งส่วน ความผิดพลาดที่เร็วที่สุดเท่าที่ใช้เวลาหนึ่งสัปดาห์ 367 00:20:55,260 --> 00:21:02,100 สิ่งที่ต้องการสำหรับวงหรือในขณะที่ ห่วงและอาร์เรย์โดยจะไกลเกินไป 368 00:21:02,100 --> 00:21:05,900 อดีตขอบเขตของอาร์เรย์บางอย่างที่ คุณประกาศในสัปดาห์ที่สองใน 369 00:21:05,900 --> 00:21:06,690 โดยเฉพาะ 370 00:21:06,690 --> 00:21:09,220 >> คุณอาจจะได้ทำมันแม้จะอยู่ในปัญหา ตั้งสี่กับการฝ่าวงล้อม 371 00:21:09,220 --> 00:21:12,910 แม้ว่าคุณอาจจะไม่ได้เห็น ดาวใด ๆ ในรหัสการจัดจำหน่ายสำหรับ 372 00:21:12,910 --> 00:21:17,410 ฝ่าวงล้อมก็จะเปิดออกว่า GRect เหล่านั้น และ GOval และสิ่งอื่น ๆ เช่น 373 00:21:17,410 --> 00:21:19,650 เหล่านั้นเป็นจริงชี้ ภายใต้ฝากระโปรง 374 00:21:19,650 --> 00:21:23,430 >> แต่ Stanford เหมือนเราเรียงลำดับของหนัง ที่รายละเอียดอย่างน้อยสำหรับห้องสมุด 375 00:21:23,430 --> 00:21:26,540 วัตถุประสงค์เหมือนที่เราทำ สำหรับสตริงและ char * 376 00:21:26,540 --> 00:21:30,060 แต่ GRect และ GOval และทุกคน สิ่งที่พวกคุณหรือจะใช้ 377 00:21:30,060 --> 00:21:32,630 ในสัปดาห์นี้เป็นที่สุด อยู่หน่วยความจำ 378 00:21:32,630 --> 00:21:33,650 คุณเพียงแค่ไม่ทราบว่ามัน 379 00:21:33,650 --> 00:21:37,240 >> ดังนั้นจึงไม่น่าแปลกใจแล้วบางที ที่คุณอาจจะเดินทางไปบางส่วน 380 00:21:37,240 --> 00:21:38,580 ความผิดพลาดของการแบ่งส่วน 381 00:21:38,580 --> 00:21:41,290 แต่สิ่งที่น่าสนใจที่นี่ตอนนี้ ถ้าหลังจากที่เราตรวจสอบ 0 ที่เราทำ 382 00:21:41,290 --> 00:21:43,460 สตริงทีได้รับ s 383 00:21:43,460 --> 00:21:44,690 ดีให้ฉันบอกที 384 00:21:44,690 --> 00:21:47,730 ฉันจะวาดมันเป็นสี่เหลี่ยม 32 บิตเรียกว่า T 385 00:21:47,730 --> 00:21:49,740 แล้วฉันจะทำจะได้รับ s 386 00:21:49,740 --> 00:21:51,130 >> ดีที่หมายความว่าอย่างไร 387 00:21:51,130 --> 00:21:53,280 ดีก็เป็นเพียงเล็กน้อยยากที่จะคิดว่า เกี่ยวกับเรื่องภาพที่ชาญฉลาด 388 00:21:53,280 --> 00:21:55,025 แต่ขอให้คิดเกี่ยวกับ อยู่ภายในของ x อะไร 389 00:21:55,025 --> 00:21:59,430 แท้จริงสิ่งที่อยู่ภายในตัวแปรนี้? 390 00:21:59,430 --> 00:22:01,500 Ox123 ค่า 391 00:22:01,500 --> 00:22:05,815 >> ดังนั้นเมื่อผมพูดสตริงทีได้รับของที่เพิ่ง หมายถึงตัวอักษรใช้เวลาหลาย 392 00:22:05,815 --> 00:22:10,070 ในซึ่งเป็น Ox123 และวางไว้ Ox123 393 00:22:10,070 --> 00:22:13,740 หรือ pictorially ถ้าผมชนิดของนามธรรม ออกไปจากรายละเอียดที่มี 394 00:22:13,740 --> 00:22:16,600 ผลกระทบของการทำอย่างแท้จริง นี้เป็นอย่างดี 395 00:22:16,600 --> 00:22:22,110 >> ดังนั้นตอนนี้คิดว่ากลับไปเมื่อสัปดาห์ที่ผ่านมา เราดำเนินการต่อไปทุนนิยม ต. ผม 396 00:22:22,110 --> 00:22:23,800 ไม่ T วงเล็บ 0 397 00:22:23,800 --> 00:22:27,150 ดี T วงเล็บ 0 แม้ว่ามันจะเป็น ตัวชี้ที่คุณสามารถรักษามันราวกับว่า 398 00:22:27,150 --> 00:22:29,220 มันเป็นอาร์เรย์ที่มีตาราง สัญกรณ์วงเล็บ 399 00:22:29,220 --> 00:22:31,550 >> เพื่อที่ T วงเล็บคือ 0? 400 00:22:31,550 --> 00:22:32,990 ดีก็ต่อชั่วโมง 401 00:22:32,990 --> 00:22:36,800 ดังนั้นเมื่อเราใช้บรรทัดของรหัสที่ สองชั้นบนซึ่งอยู่ในที่ค type.h 402 00:22:36,800 --> 00:22:38,460 ไฟล์ส่วนหัวที่ที่ มันประกาศ 403 00:22:38,460 --> 00:22:44,410 คุณกำลังพะวงเอชนี้ แต่ แน่นอนว่าชั่วโมงที่แน่นอนเดียวกันที่ 404 00:22:44,410 --> 00:22:46,540 ด้านในของ s เพื่อที่จะพูด 405 00:22:46,540 --> 00:22:51,930 และดังนั้นตอนนี้คุณมีการเปลี่ยนแปลงหรือ ทุนทั้งที่เป็นต้นฉบับและ 406 00:22:51,930 --> 00:22:53,120 ที่เรียกว่าสำเนา 407 00:22:53,120 --> 00:22:56,620 เพราะคุณไม่ได้ทำสำเนาใน วิธีการที่มนุษย์จะต้องการให้เป็น 408 00:22:56,620 --> 00:22:59,710 >> ดังนั้นสิ่งที่แก้ไขที่นี่คือ ในสัปดาห์สุดท้าย copy1.c? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 ฟังก์ชั่นเพื่อให้เราได้จริง คัดลอกสตริง 411 00:23:05,580 --> 00:23:08,700 และพื้นฐานที่เราทำในสิ่งที่จำเป็นต้อง ทำเพื่อที่จะคัดลอกสตริง? 412 00:23:08,700 --> 00:23:12,070 >> ทั้งในรุ่นสีเขียวนี้ที่นี่ฉัน จะทำมันในระดับที่ค่อนข้างต่ำ 413 00:23:12,070 --> 00:23:14,260 มีจริงฟังก์ชั่น พวกเขาสามารถช่วยนี้ 414 00:23:14,260 --> 00:23:17,710 แต่หนึ่งในพื้นฐานที่สุดและมากที่สุด หนึ่งที่คุ้นเคยอย่างน้อยเร็ว ๆ นี้จะ 415 00:23:17,710 --> 00:23:19,600 คุ้นเคยกับเราต่อไปนี้คือ - 416 00:23:19,600 --> 00:23:21,910 ดังนั้นหนึ่งในบรรทัดแรก ของรหัสในสีเขียวในขณะนี้ 417 00:23:21,910 --> 00:23:23,970 >> ผมแค่เขียนในฐานะที่เป็น char * 418 00:23:23,970 --> 00:23:25,250 มีการทำงานไม่ได้ คือความแตกต่าง 419 00:23:25,250 --> 00:23:28,790 ผมก็โยนไปห้องสมุดและ CS50 ผมเรียกมันว่ามันคืออะไร char * 420 00:23:28,790 --> 00:23:31,640 >> ตอนนี้จุดจุดจุดเพราะมี การตรวจสอบข้อผิดพลาดบางอย่างที่ไม่ 421 00:23:31,640 --> 00:23:33,200 น่าสนใจที่จะพูดคุยเกี่ยวกับอีกครั้ง 422 00:23:33,200 --> 00:23:34,710 ดังนั้นตอนนี้ทีมีการประกาศ 423 00:23:34,710 --> 00:23:35,780 มันก็เป็น char * 424 00:23:35,780 --> 00:23:38,280 ดังนั้นผมจึงดึงตารางเล็ก ๆ น้อย ๆ หน้าจอเหมือนก่อน 425 00:23:38,280 --> 00:23:41,870 >> แต่ในทางด้านขวามือ, malloc, เรากล่าวว่าเป็นหน่วยความจำที่จัดสรร 426 00:23:41,870 --> 00:23:44,130 ดังนั้นการจัดสรรหน่วยความจำอันบาง 427 00:23:44,130 --> 00:23:48,830 และมีกี่ไบต์ที่เราทำจริง ต้องการที่จะจัดสรรมันไม่ดูเหมือน? 428 00:23:48,830 --> 00:23:50,340 >> ดีความยาวสตริงของ s 429 00:23:50,340 --> 00:23:52,310 ดังนั้นถ้ามันสวัสดีที่ จะเป็นห้า 430 00:23:52,310 --> 00:23:53,950 เราจะบอกว่า H-e-l-L-o 431 00:23:53,950 --> 00:23:55,090 ดังนั้นห้าไบต์ 432 00:23:55,090 --> 00:23:57,960 >> แต่แล้วบวก 1, 1 ทำไม? 433 00:23:57,960 --> 00:23:58,830 0 ตัวอักษร 434 00:23:58,830 --> 00:24:03,640 ถ้าเราไม่ได้ออกจากห้องพักสำหรับผู้ชายคนนี้ที่เรา ตั้งใจจะสร้างสถานการณ์ 435 00:24:03,640 --> 00:24:05,600 ที่สตริงคือ H-e-l-L-o 436 00:24:05,600 --> 00:24:08,470 แล้ว GetString เวลาต่อไปคือ และเรียกฉันพิมพ์ในตัวอย่างเช่น 437 00:24:08,470 --> 00:24:14,020 เดวิด, D--V-I-d, คอมพิวเตอร์ที่เป็นไป ที่จะคิดว่าเป็นจริง 438 00:24:14,020 --> 00:24:18,900 H-e-l-l-o-D--V-I-d เพราะมี หยุดพักในระหว่างคำเหล่านั้น 439 00:24:18,900 --> 00:24:19,810 >> ดังนั้นเราจึงจำเป็นต้องหยุดพักที่ 440 00:24:19,810 --> 00:24:20,720 ดังนั้นเราจึงไม่ต้องการห้า 441 00:24:20,720 --> 00:24:22,100 เราต้องการที่หกไบต์ 442 00:24:22,100 --> 00:24:23,110 >> และไบต์ที่ผมพูด 443 00:24:23,110 --> 00:24:25,220 แต่จริงๆขนาดเวลาของถ่าน 444 00:24:25,220 --> 00:24:28,040 เทคนิคถ่านเกือบจะเป็น เสมอ byte เดียว 445 00:24:28,040 --> 00:24:31,030 >> แต่เพียงเพื่อให้รหัสของเราแบบพกพา, เพื่อที่จะพูดเพื่อที่จะทำงานบน 446 00:24:31,030 --> 00:24:33,750 เครื่องคอมพิวเตอร์ที่แตกต่างกันถึงแม้ว่าพวกเขาอาจจะ จะค่อนข้างแตกต่างกันภายใต้ 447 00:24:33,750 --> 00:24:36,590 เครื่องดูดควันฉันจะเป็นยาชื่อสามัญ ขนาดพูดของถ่านเพื่อให้ 448 00:24:36,590 --> 00:24:37,660 รหัสของฉันเสมอไป 449 00:24:37,660 --> 00:24:40,610 และฉันไม่ต้อง recompile มันก็แค่ เพราะผมอัพเกรดคอมพิวเตอร์ของฉันหรือใช้ 450 00:24:40,610 --> 00:24:42,140 บางแพลตฟอร์มที่แตกต่างกัน 451 00:24:42,140 --> 00:24:45,300 >> ดังนั้นผมจึงได้มี 6 ครั้งขนาดของ ถ่านที่เกิดขึ้นเป็น 1 452 00:24:45,300 --> 00:24:47,440 ดังนั้น malloc หมายความว่าจะทำได้ ให้ฉันหกไบต์ 453 00:24:47,440 --> 00:24:49,140 ที่จริงทำอะไร? 454 00:24:49,140 --> 00:24:52,810 ดีให้ฉันย้อนกลับไปในช่วงเวลาที่นี่ ไปยังที่ที่เราอยู่ในเรื่อง 455 00:24:52,810 --> 00:24:57,620 >> ดังนั้นถ้าฉันไปกลับมาที่นี่ผมได้ประกาศ char * เรียกว่า T 456 00:24:57,620 --> 00:25:00,280 ผมเคยเรียกว่าตอนนี้เป็นเวลาหก malloc ไบต์ 457 00:25:00,280 --> 00:25:06,400 และตอนนี้ฉันกำลังจะไปวาดรูปที่หก ไบต์เช่นเดียวกับอาร์เรย์ก่อนหน้านี้ 458 00:25:06,400 --> 00:25:10,570 แต่ที่จริงผมไม่ทราบว่ามีอะไร ภายในอาร์เรย์นี้ 459 00:25:10,570 --> 00:25:14,640 >> หากคุณจัดสรรหน่วยความจำมันกลับกลายเป็นว่า คุณจะไม่สามารถเชื่อถือได้ว่ามีบางอย่าง 460 00:25:14,640 --> 00:25:15,810 ค่าที่รู้จักกันมี 461 00:25:15,810 --> 00:25:18,400 มันอาจจะถูกใช้โดยบางสิ่งบางอย่าง อื่นบางฟังก์ชั่นอื่น ๆ อื่น ๆ บาง 462 00:25:18,400 --> 00:25:19,630 บรรทัดของรหัสที่คุณเขียน 463 00:25:19,630 --> 00:25:22,870 ดังนั้นเราจึงมักจะเรียกขยะเหล่านี้ ค่านิยมและวาดพวกเขาอาจจะเป็น 464 00:25:22,870 --> 00:25:26,170 เครื่องหมายคำถามเพียงแค่แสดงให้เห็นว่าเรา ไม่ทราบว่ามีจริง 465 00:25:26,170 --> 00:25:30,390 และที่ว่าไม่มีเรื่องใหญ่ตราบใดที่เรา ฉลาดพอที่จะเขียนทับ 466 00:25:30,390 --> 00:25:34,550 ค่าขยะด้วยตัวเลขหรือ ตัวอักษรที่เราดูแลเกี่ยวกับ 467 00:25:34,550 --> 00:25:36,340 >> ดังนั้นในกรณีนี้สิ่งที่ฉันจะทำอย่างไร 468 00:25:36,340 --> 00:25:38,670 ดีบรรทัดของฉันของรหัส ต่อไปฉันมีสี่ 469 00:25:38,670 --> 00:25:41,350 int ฉันได้รับ 0, n ได้รับ ความยาวสตริงของ s 470 00:25:41,350 --> 00:25:42,750 ดังนั้นคุ้นเคยสำหรับวง 471 00:25:42,750 --> 00:25:45,875 ผมมีค่าน้อยกว่าหรือเท่ากับ n, ซึ่งมักจะอยู่เหนือ 472 00:25:45,875 --> 00:25:47,500 >> แต่ครั้งนี้มันโดยเจตนา 473 00:25:47,500 --> 00:25:51,890 ผม + + และแล้วผมก็ทำ T วงเล็บผมได้รับของ 474 00:25:51,890 --> 00:25:56,320 เพราะภาพของฉันมีลักษณะเช่นนี้ที่ ขณะนี้ถูกเก็บไว้ใน T คือ 475 00:25:56,320 --> 00:25:59,530 ที่อยู่ของก้อนสุ่มที่ของหน่วยความจำ ค่าที่ไม่เป็นที่รู้จัก 476 00:25:59,530 --> 00:26:03,030 แต่ทันทีที่ฉันทำทีวงเล็บ 0 ที่ทำให้ฉันที่นี่ 477 00:26:03,030 --> 00:26:07,430 >> และสิ่งที่จบลงด้วยการวาดมี? 478 00:26:07,430 --> 00:26:08,740 เราจบลงด้วยการวางชั่วโมง 479 00:26:08,740 --> 00:26:11,170 เพราะนั่นคือสิ่งที่อยู่ในวงเล็บ s 0 480 00:26:11,170 --> 00:26:14,300 และแล้วสิ่งเดียวกันสำหรับ e และลิตรและลิตรและ o 481 00:26:14,300 --> 00:26:17,930 >> n ผมทำไมขึ้นไปผ่าน เท่ากับ n? 482 00:26:17,930 --> 00:26:19,200 เพราะตัวละคร 0 483 00:26:19,200 --> 00:26:23,580 ดังนั้นเพียงแค่ต้องมีความชัดเจนแล้วถ้าผมจริง ลบสิ่งที่ขยะเหล่านี้ 484 00:26:23,580 --> 00:26:28,870 มีค่าแล้วจริงวาดใน สิ่งที่ผมคาดหวังนี้เป็น s วงเล็บ 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, บวกที่ต่อท้าย ตัวละครใหม่ 486 00:26:32,440 --> 00:26:36,080 >> และดังนั้นตอนนี้ถ้าเรายังคงผ่านมาจุด, จุดจุดในรุ่นที่ถูกต้องนี้ 487 00:26:36,080 --> 00:26:41,930 และวงเล็บ T ทุน 0 ฉันจะของ แน่นอนจะพะวงอยู่เพียงแค่นี้ 488 00:26:41,930 --> 00:26:47,050 คนที่แต่งตัวประหลาดที่นี่ซึ่งแนวคิด ท้ายที่สุดก็คือเป้าหมาย 489 00:26:47,050 --> 00:26:48,040 เพื่อให้ทุกตัวชี้เป็น 490 00:26:48,040 --> 00:26:51,430 >> และคุณได้รับใช้พวกเขาเป็นเวลาหลายสัปดาห์ ขณะนี้ในบริบทของสตริง 491 00:26:51,430 --> 00:26:53,530 แต่อยู่ภายใต้ฝากระโปรงที่พวกเขากำลัง เล็ก ๆ น้อย ๆ ที่ซับซ้อนมากขึ้น 492 00:26:53,530 --> 00:26:57,520 แต่ถ้าคุณคิดว่าเกี่ยวกับพวกเขาในเรื่องนี้ รูปแบบภาพที่ผมเสนอว่าพวกเขากำลัง 493 00:26:57,520 --> 00:27:01,720 อาจจะไม่ใช่สิ่งที่น่ากลัวขณะที่พวกเขา ครั้งแรกอาจจะดูเหมือนได้อย่างรวดเร็วก่อน 494 00:27:01,720 --> 00:27:04,730 โดยเฉพาะอย่างยิ่งกับไวยากรณ์ใหม่ ๆ เช่น 495 00:27:04,730 --> 00:27:07,290 คำถามใด ๆ เกี่ยวกับตัวชี้ สตริงหรือตัวอักษร? 496 00:27:07,290 --> 00:27:07,580 อ้าง? 497 00:27:07,580 --> 00:27:09,252 >> ผู้ชม: คุณสามารถกลับไป ไป [ได้ยิน] 498 00:27:09,252 --> 00:27:10,502 >> 1 SPEAKER: Sure 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> ผู้ชม: ดังนั้นวิธีการมาในครั้งล่าสุดของคุณมาก สายคุณไม่ได้มีสาย T * 501 00:27:19,525 --> 00:27:21,513 และ * ในเส้น? 502 00:27:21,513 --> 00:27:23,004 คุณไม่ได้มีการอ้างอิงถึง - 503 00:27:23,004 --> 00:27:24,640 >> ลำโพง 1: อ่า, คำถามที่ดีจริงๆ 504 00:27:24,640 --> 00:27:26,800 ทำไมฉันจึงไม่ได้ * t และ * s หรือไม่? 505 00:27:26,800 --> 00:27:30,340 เพราะชั่วครู่สัปดาห์ที่ผ่านมาเช่นเดียวกับในของเรา สลับการทำงานของผมไม่บอกว่าเมื่อ 506 00:27:30,340 --> 00:27:33,350 คุณได้มีตัวชี้หมายถึงการ ซึ่งคุณจะไปที่นั่นในฐานะที่เราทำ 507 00:27:33,350 --> 00:27:36,590 ร่างกายบนเวทีเป็นจริง ใช้ตัวดำเนินการดาว 508 00:27:36,590 --> 00:27:40,570 >> แต่กลับกลายเป็นว่านี้ยึดตาราง สัญกรณ์เป็นสิ่งที่เราจะเรียกประโยค 509 00:27:40,570 --> 00:27:44,190 น้ำตาลซึ่งเป็นเพียงวิธีที่เซ็กซี่ของ บอกว่าสัญกรณ์ชวเลขมันสำหรับ 510 00:27:44,190 --> 00:27:45,950 สิ่งที่คุณอธิบาย 511 00:27:45,950 --> 00:27:49,385 แต่มันก็เป็นเพียงเล็กน้อยง่ายขึ้น 512 00:27:49,385 --> 00:27:53,510 และที่มีความเสี่ยงของการทำนี้ดูเหมือน ซับซ้อนกว่าที่จะต้องมี, 513 00:27:53,510 --> 00:27:56,990 สิ่งที่จริงที่เกิดขึ้นที่นี่ เป็นดังต่อไปนี้ - 514 00:27:56,990 --> 00:28:01,450 ถ้าผมพูด * t นั่นหมายความว่าไป ที่อยู่ที่เก็บไว้ในที 515 00:28:01,450 --> 00:28:04,350 >> ดังนั้นตัวอักษรถ้า T เป็นการจัดเก็บ ที่อยู่ของชั่วโมงที่ 516 00:28:04,350 --> 00:28:07,300 ในขั้นต้น * หมายถึง t go ที่นี่ 517 00:28:07,300 --> 00:28:10,730 ตอนนี้ทีวงเล็บ 0 หมายความว่าอย่างไร 518 00:28:10,730 --> 00:28:11,560 สิ่งที่แน่นอนเดียวกัน 519 00:28:11,560 --> 00:28:13,510 มันเป็นเพียงผู้ใช้น้อยมาก เป็นมิตรกับผู้เขียน 520 00:28:13,510 --> 00:28:14,430 >> แต่ฉันยังไม่ได้ทำ 521 00:28:14,430 --> 00:28:17,800 ฉันไม่สามารถเพียงแค่พูด t * s * ได้รับ 522 00:28:17,800 --> 00:28:19,440 เพราะผมจะต้องทำอะไรแล้ว 523 00:28:19,440 --> 00:28:22,950 ฉันจะวางเอชเอชเอชเอชเอช ตลอดทั้งสิ่ง 524 00:28:22,950 --> 00:28:22,995 ใช่ไหม? 525 00:28:22,995 --> 00:28:26,020 >> เพราะ t * คือไปอยู่ในที 526 00:28:26,020 --> 00:28:27,580 แต่เราก็ด้านในของวง 527 00:28:27,580 --> 00:28:32,150 และฉันว่าค่าการเพิ่ม, แน่นอนแต่ละย้ำ? 528 00:28:32,150 --> 00:28:32,690 ผม 529 00:28:32,690 --> 00:28:34,590 >> แต่มีโอกาสที่ว่า ที่นี่ใช่มั้ย? 530 00:28:34,590 --> 00:28:37,870 แม้ว่านี้รู้สึกเหมือนมันเริ่ม เล็ก ๆ น้อย ๆ ที่ซับซ้อนมากขึ้น 531 00:28:37,870 --> 00:28:40,730 กว่าตารางสัญกรณ์วงเล็บ เราได้ใช้สำหรับบางเวลา - 532 00:28:40,730 --> 00:28:43,840 ให้ฉันยกเลิกการเปลี่ยนแปลงชั่วโมงของฉันมี - 533 00:28:43,840 --> 00:28:48,870 แม้ว่านี่คือตอนนี้ได้รับเพียงเล็กน้อย นักเล่นแนวคิดพื้นฐานถ้า t * 534 00:28:48,870 --> 00:28:53,630 หมายถึงที่นี่และ t * เป็นเพียง ไปที่ที่อยู่ในที 535 00:28:53,630 --> 00:28:54,990 >> แต่สิ่งที่เป็นอยู่ใน T? 536 00:28:54,990 --> 00:28:56,850 จำนวนที่เราให้ใช้? 537 00:28:56,850 --> 00:29:00,540 เช่น Ox456 ให้เอามันกลับไป เพียงเพื่อประโยชน์ของการสนทนา 538 00:29:00,540 --> 00:29:05,380 ดีถ้าฉันต้องการที่จะได้รับ e ใน T สตริงผมเพียงต้องการที่จะไป, 539 00:29:05,380 --> 00:29:06,460 เป็นหลัก 456 540 00:29:06,460 --> 00:29:09,230 >> หรือมากกว่า 457 541 00:29:09,230 --> 00:29:10,590 ผมเพียงแค่ต้องเพิ่มอีกหนึ่ง 542 00:29:10,590 --> 00:29:11,790 แต่ฉันจะทำอย่างนั้นใช่มั้ย? 543 00:29:11,790 --> 00:29:14,680 เพราะทีแม้ว่าฉันให้วาด ตอนนี้ลูกศรก็เพียง 544 00:29:14,680 --> 00:29:16,570 จำนวน Ox456 545 00:29:16,570 --> 00:29:21,400 และถ้าฉันจะเพิ่มหนึ่งนั้นหรือมากกว่า โดยทั่วไปถ้าฉันจะเพิ่ม I เพื่อที่ฉันสามารถ 546 00:29:21,400 --> 00:29:24,350 จริงได้รับสิ่งที่ฉันต้องการ 547 00:29:24,350 --> 00:29:26,260 ดังนั้นหากที่จริงผมทำเช่นนี้ - 548 00:29:26,260 --> 00:29:28,970 และนี่คือสิ่งที่เรียกว่าตอนนี้ คำนวณตัวชี้ - 549 00:29:28,970 --> 00:29:30,375 ฉันจะลบบรรทัดนี้ 550 00:29:30,375 --> 00:29:33,550 ซึ่งก็คือตรงไปตรงมาผมคิดว่าชัดเจนและ ผู้ใช้น้อยมากที่เป็นมิตรที่จะอ่าน 551 00:29:33,550 --> 00:29:35,970 แต่เรื่องนี้ไม่น้อยที่ถูกต้อง 552 00:29:35,970 --> 00:29:38,570 >> บรรทัดของรหัสนี้ในขณะนี้คือการใช้ คำนวณตัวชี้ 553 00:29:38,570 --> 00:29:40,920 มันบอกว่าให้ไปที่ ที่อยู่ดังต่อไปนี้ - 554 00:29:40,920 --> 00:29:44,670 สิ่งที่เริ่มต้นของ T คือที่ คือ T บวกผมซึ่งในขั้นต้น 555 00:29:44,670 --> 00:29:45,730 0 ซึ่งเป็นที่ดีคือ 556 00:29:45,730 --> 00:29:49,280 เพราะนั่นหมายความว่าจุดเริ่มต้นของ T บวก 1 บวก 2 บวก 3 และอื่น ๆ 557 00:29:49,280 --> 00:29:51,030 และการจัดการที่เหมือนกันกับ s 558 00:29:51,030 --> 00:29:52,750 >> ประโยคน้ำตาลดังนั้นสำหรับนี้ 559 00:29:52,750 --> 00:29:55,900 แต่ความเข้าใจของสิ่งที่เกิดขึ้นจริง ภายใต้ฝากระโปรงหน้าผมจะเถียง 560 00:29:55,900 --> 00:29:57,410 เป็นจริงมีประโยชน์ในตัวของมันเอง 561 00:29:57,410 --> 00:30:00,620 เพราะมันหมายความว่าตอนนี้มีไม่ได้ มายากลอื่น ๆ อีกมากมายที่เกิดขึ้น 562 00:30:00,620 --> 00:30:01,620 ภายใต้ฝากระโปรง 563 00:30:01,620 --> 00:30:03,920 มีจะไม่ได้อื่น ๆ อีกมากมาย ชั้นที่เราปอกเปลือกสามารถสำรองสำหรับคุณ 564 00:30:03,920 --> 00:30:04,810 นี้เป็นค 565 00:30:04,810 --> 00:30:06,410 และนี่คือการเขียนโปรแกรม 566 00:30:06,410 --> 00:30:08,002 คำถามที่ดีจริงๆ 567 00:30:08,002 --> 00:30:11,570 >> ขวาทั้งหมดดังนั้นนี้เป็นรถที่ โปรแกรมที่ผมกำลังพูดถึงก่อนหน้านี้ 568 00:30:11,570 --> 00:30:12,650 swap มีข้อบกพร่อง 569 00:30:12,650 --> 00:30:14,070 ถ้าไม่ดูเหมือนจะทำงาน 570 00:30:14,070 --> 00:30:17,390 จำได้ว่าเพียงแค่เช่นเดียวกับนมและ น้ำส้ม - ที่ฉันเริ่ม 571 00:30:17,390 --> 00:30:18,660 สาธิตการดื่มของวันนี้ 572 00:30:18,660 --> 00:30:22,220 ดังนั้นเช่นเดียวกับน้ำส้มและ นมเราไม่ต้องใช้ 573 00:30:22,220 --> 00:30:26,200 ตัวแปรชั่วคราว, tmp, ที่จะถือ ชั่วคราวเพื่อให้เราสามารถแล้ว 574 00:30:26,200 --> 00:30:28,820 เปลี่ยนค่าของมันแล้วปรับปรุงข 575 00:30:28,820 --> 00:30:32,870 >> แต่ฟังก์ชั่นนี้เรากล่าวว่านี้หรือ โปรแกรมที่ฟังก์ชั่นนี้คือ 576 00:30:32,870 --> 00:30:35,670 เขียนเป็นความผิดพลาดและข้อบกพร่องทำไม? 577 00:30:35,670 --> 00:30:38,870 578 00:30:38,870 --> 00:30:39,090 ใช่? 579 00:30:39,090 --> 00:30:42,471 >> ผู้ชม: [ได้ยิน] 580 00:30:42,471 --> 00:30:44,940 >> 1 SPEAKER: ว่าเมื่อ คุณโทร swap - 581 00:30:44,940 --> 00:30:47,820 หรือมากกว่าปกติเมื่อคุณ เรียกฟังก์ชั่นมากที่สุดใด ๆ - 582 00:30:47,820 --> 00:30:51,210 ถ้าขัดแย้งในการทำงานที่มี ints เพื่อที่จะพูด, ดั้งเดิมและตัวอักษร 583 00:30:51,210 --> 00:30:56,740 และคู่ผสมและลอยสิ่งโดยไม่ ดาวคุณจะผ่านในสำเนาของ 584 00:30:56,740 --> 00:30:57,540 อาร์กิวเมนต์ 585 00:30:57,540 --> 00:31:01,580 ดังนั้นถ้า x เป็น 1 และ y เป็น 2 จะ เป็น 1 และ b เป็นไปได้ 2 586 00:31:01,580 --> 00:31:05,250 แต่พวกเขากำลังจะได้รับชิ้นที่แตกต่างกัน ของบิตชิ้นที่แตกต่างกันของ 587 00:31:05,250 --> 00:31:07,540 หน่วยความจำที่เกิดขึ้นที่จะจัดเก็บ ค่าเหมือน 588 00:31:07,540 --> 00:31:12,160 >> ดังนั้นรหัสนี้เป็นซุปเปอร์ที่สมบูรณ์แบบ ที่แลกเปลี่ยน a และ b 589 00:31:12,160 --> 00:31:13,850 มันไม่ดีที่การแลกเปลี่ยน - 590 00:31:13,850 --> 00:31:15,290 ในตัวอย่างสัปดาห์สุดท้ายของ - 591 00:31:15,290 --> 00:31:16,390 x และ y 592 00:31:16,390 --> 00:31:18,780 เพราะอีกครั้งที่พวกเขากำลัง อยู่ในขอบเขตที่ไม่ถูกต้อง 593 00:31:18,780 --> 00:31:21,310 >> ตอนนี้เราก็จะไปเกี่ยวกับการแก้ไขนี้ 594 00:31:21,310 --> 00:31:23,140 เราต้องทำให้ฟังก์ชั่น ดูไม่สวยงามเท่าน้อย 595 00:31:23,140 --> 00:31:25,250 แต่อีกครั้งพิจารณาสิ่งที่ นี้ก็หมายความว่า 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> และที่จริงให้ฉัน, เพื่อความมั่นคง, เปลี่ยนสิ่งหนึ่งดังนั้นมันจึงเหมือนกับ 598 00:31:31,500 --> 00:31:33,200 สิ่งที่เราก็ไม่ได้ 599 00:31:33,200 --> 00:31:35,690 ที่ผมกล่าวถึงสัปดาห์ที่ผ่านมามันไม่ได้ เรื่องที่จะไป 600 00:31:35,690 --> 00:31:38,120 ในความเป็นจริงมักจะคุณจะใส่ ดาวที่อยู่ถัดจากชื่อตัวแปร 601 00:31:38,120 --> 00:31:40,750 แต่ฉันคิดว่ามันจะง่ายขึ้นเล็กน้อย ที่จะต้องพิจารณา * ที่อยู่ถัดจาก 602 00:31:40,750 --> 00:31:44,910 ชนิดของข้อมูลที่เป็นความหมายมันเป็นตัวชี้ เพื่อ int ในกรณีนี้ 603 00:31:44,910 --> 00:31:46,270 >> ฉันดังนั้นสิ่งที่ทำอะไรที่นี่? 604 00:31:46,270 --> 00:31:49,590 ที่ฉันพูดไม่ให้ฉัน int ตามด้วย int อีก 605 00:31:49,590 --> 00:31:50,810 เรียกพวกเขา A และ B 606 00:31:50,810 --> 00:31:52,460 ให้ฉันที่อยู่ของ int 607 00:31:52,460 --> 00:31:53,960 ให้ฉันที่อยู่ของ int อีก 608 00:31:53,960 --> 00:31:56,330 โทรที่อยู่เหล่านั้น A และ B 609 00:31:56,330 --> 00:32:00,860 >> แล้วใช้สัญกรณ์ * ลง ด้านล่างไปแต่ละที่อยู่เหล่านั้น 610 00:32:00,860 --> 00:32:05,290 เท่าที่จำเป็นที่จะได้รับ หรือตั้งค่าของมัน 611 00:32:05,290 --> 00:32:07,400 แต่มีข้อยกเว้นอยู่ที่นี่ 612 00:32:07,400 --> 00:32:11,130 ทำไมฉันจึงไม่ได้มี * ถัด tmp? 613 00:32:11,130 --> 00:32:15,070 ทำไมไม่ทำเช่นนี้ตัวอย่างเช่น? 614 00:32:15,070 --> 00:32:19,370 มันให้ความรู้สึกเหมือนฉันก็ควรไปทั้งหมด ออกและแก้ไขสิ่งที่ทั้ง 615 00:32:19,370 --> 00:32:19,752 อ้าง? 616 00:32:19,752 --> 00:32:21,002 >> ผู้ชม: [ได้ยิน] 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> 1 SPEAKER: ฉันยังไม่ได้ประกาศ tmp เป็นสตริง 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 ดังนั้นนี้จะประกาศในกรณีนี้, tmp ไปจะเป็นที่อยู่ของ int 621 00:32:34,950 --> 00:32:37,380 แต่ที่ไม่มากสิ่งที่ฉันต้องการ สำหรับคู่ของเหตุผล 622 00:32:37,380 --> 00:32:38,616 >> ผู้ชม: คุณไม่ต้องการที่จะแลกเปลี่ยนพวกเขา 623 00:32:38,616 --> 00:32:41,800 >> 1 ลำโพงตรงฉันไม่ต้องการที่จะแลกเปลี่ยน อะไรกับ tmp tmp เป็นเพียง 624 00:32:41,800 --> 00:32:42,790 สิ่งหนึ่งสัปดาห์- 625 00:32:42,790 --> 00:32:45,150 ทั้งหมดที่ฉันต้องการเป็นตัวแปร ในการจัดเก็บบางหมายเลข 626 00:32:45,150 --> 00:32:47,330 ฉันไม่ได้ดูแลเกี่ยวกับที่อยู่ ตอนนี้ 627 00:32:47,330 --> 00:32:50,530 >> ฉันต้อง 32 บิตหรือ เพื่อที่จะเก็บ int 628 00:32:50,530 --> 00:32:56,690 และฉันต้องการที่จะใส่ในที่ 32 บิต อะไรก็ตามที่ไม่ได้อยู่ในเพื่อที่จะพูด แต่ 629 00:32:56,690 --> 00:33:01,260 อยู่ที่อะไรเพียงเพื่อจะแม่นยำมากขึ้น 630 00:33:01,260 --> 00:33:06,420 เพราะถ้าเป็นที่อยู่, * หมายถึง ไปที่นั่นและได้รับมูลค่า 1 631 00:33:06,420 --> 00:33:10,560 ยกตัวอย่างเช่นในตัวอย่างสัปดาห์สุดท้ายของ หรือในกรณีของ b, รับค่าของ 2 632 00:33:10,560 --> 00:33:11,750 >> ดังนั้นสิ่งที่เกิดขึ้นจริง? 633 00:33:11,750 --> 00:33:15,070 ให้ฉันวาดภาพที่นี่ที่จะ เพียงหยอกล้อกันเป็นส่วนหนึ่งของวันนี้ 634 00:33:15,070 --> 00:33:18,580 แต่นี้จะยังคงปรากฏ สำหรับค่อนข้างบางเวลา 635 00:33:18,580 --> 00:33:22,430 >> นี้ผมเรียกร้องคือสิ่งที่คอมพิวเตอร์ของคุณ หน่วยความจำดูเหมือนว่าเมื่อคุณเรียกใช้ 636 00:33:22,430 --> 00:33:24,060 โปรแกรมโปรแกรมใด ๆ 637 00:33:24,060 --> 00:33:28,340 เมื่อคุณเรียกใช้โปรแกรมที่ด้านบนมาก ของ RAM ของคอมพิวเตอร์ของคุณ - ดังนั้นคิดว่า 638 00:33:28,340 --> 00:33:33,530 รูปสี่เหลี่ยมผืนผ้านี้อย่างแท้จริงเป็นของคุณ แรมของคอมพิวเตอร์หรือหน่วยความจำทั้งหมด 101 639 00:33:33,530 --> 00:33:36,920 พันล้านไบต์ของมันทั้งหมดสองพันล้าน ไบต์ทั้งหมดสองกิกะไบต์ของมัน 640 00:33:36,920 --> 00:33:39,910 สิ่งที่ปริมาณที่คุณมีคือ ให้วาดเป็นรูปสี่เหลี่ยมผืนผ้า 641 00:33:39,910 --> 00:33:43,260 และผมก็เรียกร้องว่าเมื่อคุณเรียกใช้โปรแกรม เช่น Microsoft Word หรือ Chrome 642 00:33:43,260 --> 00:33:49,220 หรือสิ่งที่ต้องการที่บิตที่ ไมโครซอฟท์หรือ Google ที่เขียน - 643 00:33:49,220 --> 00:33:50,910 ในกรณีของโปรแกรมเหล่านั้น - 644 00:33:50,910 --> 00:33:54,490 จะโหลดลงในหน่วยความจำของคอมพิวเตอร์ของคุณ ที่พวกเขาสามารถดำเนินการได้มากขึ้น 645 00:33:54,490 --> 00:33:57,520 ได้อย่างรวดเร็วและป้อนเข้า CPU ซึ่ง เป็นสมองของคอมพิวเตอร์ 646 00:33:57,520 --> 00:34:00,940 >> และใน TAM ที่พวกเขากำลังเก็บไว้ที่มาก ด้านบนของโปรแกรมของคุณเพื่อที่จะพูด 647 00:34:00,940 --> 00:34:03,300 ในคำอื่น ๆ ถ้าเป็นก้อน หน่วยความจำเมื่อคุณดับเบิลคลิกที่ 648 00:34:03,300 --> 00:34:05,740 โปรแกรม Microsoft Word, บิตมา ปิดฮาร์ดไดรฟ์ 649 00:34:05,740 --> 00:34:06,680 พวกเขาได้รับการโหลดเข้าสู่ RAM 650 00:34:06,680 --> 00:34:10,330 และเราจะผลักพวกเขาขึ้นที่ด้านบนมาก ของสี่เหลี่ยมผืนผ้าแนวคิดนี้ 651 00:34:10,330 --> 00:34:13,010 >> ดีส่วนที่เหลือของหน่วยความจำของคุณคือ ใช้สำหรับสิ่งที่แตกต่างกัน 652 00:34:13,010 --> 00:34:16,460 ที่ด้านบนมากที่คุณเห็นในการเริ่มต้น ข้อมูลได้และยกเลิกข้อมูล 653 00:34:16,460 --> 00:34:20,500 นี้จะทำอย่างไรสำหรับส่วนใหญ่ที่มี ค่าคงที่หรือตัวแปรทั่วโลก 654 00:34:20,500 --> 00:34:21,340 ที่มีค่า 655 00:34:21,340 --> 00:34:22,980 แต่เพิ่มเติมเกี่ยวกับการเหล่านั้นอีกครั้ง 656 00:34:22,980 --> 00:34:25,150 >> แล้วคุณมีกองซึ่ง เราจะกลับมา 657 00:34:25,150 --> 00:34:28,420 แต่ที่ด้านล่างเป็นส่วนหนึ่งที่ โดยเฉพาะอย่างยิ่งซึ่งเกี่ยวดองกันอย่างใกล้ชิดในขณะนี้ 658 00:34:28,420 --> 00:34:30,210 มันเป็นสแต็คที่เรียกว่า 659 00:34:30,210 --> 00:34:33,850 ดังนั้นเช่นเดียวกับในที่สุดห้องโถง D ใด ๆ ที่นี่ วิทยาเขตคุณมีถาดที่ 660 00:34:33,850 --> 00:34:37,210 เพียงกองอยู่ด้านบนของแต่ละอื่น ๆ ที่ คุณสามารถใส่อาหารและ whatnot 661 00:34:37,210 --> 00:34:40,139 สแต็คในระบบคอมพิวเตอร์ จะคล้ายกันมาก 662 00:34:40,139 --> 00:34:42,679 ยกเว้นในขณะที่ถาดในขณะที่เราใช้ในการ ห้องอาหารของหลักสูตรที่มีความหมาย 663 00:34:42,679 --> 00:34:45,710 ที่จะดำเนินการสิ่งที่ถาด หรือเฟรม - 664 00:34:45,710 --> 00:34:49,469 ในขณะที่เราจะเรียกพวกเขา - ในเครื่องคอมพิวเตอร์ หน่วยความจำที่ใช้ในการถือ 665 00:34:49,469 --> 00:34:51,610 ตัวแปรและค่านิยม 666 00:34:51,610 --> 00:34:53,929 >> ดังนั้นจริงๆสิ่งที่ไปใน ภายใต้ฝากระโปรง? 667 00:34:53,929 --> 00:34:55,820 ดีให้ฉันพลิก ไปยังหน้าจอที่นี่ 668 00:34:55,820 --> 00:34:58,370 และขอเน้นเพียง ส่วนล่างสักครู่ 669 00:34:58,370 --> 00:35:02,770 ถ้าเป็นส่วนที่ด้านล่างของฉัน หน่วยความจำของคอมพิวเตอร์ก็จะเปิดออกเมื่อฉัน 670 00:35:02,770 --> 00:35:05,350 เรียกใช้ฟังก์ชันหลัก - ที่เกิดขึ้นตรงไปตรงมา 671 00:35:05,350 --> 00:35:06,950 โดยอัตโนมัติสำหรับฉัน - 672 00:35:06,950 --> 00:35:10,510 ฉันได้รับรู้ของหน่วยความจำที่ ด้านล่างของแรมของฉันเพื่อที่จะพูด 673 00:35:10,510 --> 00:35:13,390 และนี่คือที่หลักของ ตัวแปรท้องถิ่นไป 674 00:35:13,390 --> 00:35:16,770 มันเป็นเรื่องที่ argc และ argv บางที ไปและตัวแปรที่ฉัน 675 00:35:16,770 --> 00:35:18,170 ประกาศภายในของหลัก 676 00:35:18,170 --> 00:35:20,260 พวกเขาจบลงที่ด้านล่าง ของ RAM คอมพิวเตอร์ของฉัน 677 00:35:20,260 --> 00:35:25,040 >> สมมติว่าขณะนี้สายหลักที่ฟังก์ชั่น เช่นการแลกเปลี่ยนเช่นเดียวกับที่มันทำสัปดาห์สุดท้าย? 678 00:35:25,040 --> 00:35:30,620 ดีเราเป็นหลักใส่ถาดใหม่ กรอบใหม่ลงบนก้อนของฉันของหน่วยความจำ 679 00:35:30,620 --> 00:35:34,160 และฉันจะอธิบายเรื่องนี้ในขณะที่ เป็นฟังก์ชั่นการแลกเปลี่ยน 680 00:35:34,160 --> 00:35:35,770 >> ตอนนี้ภายในของการแลกเปลี่ยนคืออะไร 681 00:35:35,770 --> 00:35:39,240 ดีขึ้นอยู่กับโปรแกรมสัปดาห์สุดท้ายของและ หนึ่งที่เราเพิ่งเห็นข้อความที่ตัดตอนมาจาก, 682 00:35:39,240 --> 00:35:46,590 ภายในกรอบของการแลกเปลี่ยนหรือแลกของ ถาดตัวแปรสิ่งที่เป็น? 683 00:35:46,590 --> 00:35:47,970 ดี a และ b 684 00:35:47,970 --> 00:35:51,850 เพราะผู้ที่มีข้อโต้แย้งในประเทศของตน บวก tmp สาม 685 00:35:51,850 --> 00:35:54,470 ดังนั้นจริงๆที่ฉันสามารถวาดนี้ เล็ก ๆ น้อย ๆ อย่างหมดจด 686 00:35:54,470 --> 00:35:56,680 ให้ฉันไปข้างหน้าและยกเลิกการติดฉลาก 687 00:35:56,680 --> 00:35:58,520 และแจ้งให้เราอ้างว่าคุณรู้ว่าสิ่งที่? 688 00:35:58,520 --> 00:36:00,560 >> อาจจะจบลงที่นี่ 689 00:36:00,560 --> 00:36:02,160 B จะไปจบลงที่นี่ 690 00:36:02,160 --> 00:36:03,810 และ tmp จะไปจบลงที่นี่ 691 00:36:03,810 --> 00:36:05,160 ตอนนี้อาจจะสั่งซื้อ จะเป็นเพียงเล็กน้อยที่แตกต่างกัน 692 00:36:05,160 --> 00:36:06,840 แต่แนวคิดนี้ก็คือค​​วามคิด 693 00:36:06,840 --> 00:36:11,490 >> และเพียงแค่เรียกรวมกันว่านี่คือสิ่งที่ เราจะเรียกกรอบการแลกของหรือ 694 00:36:11,490 --> 00:36:12,136 ถาดอาหารห้องโถง 695 00:36:12,136 --> 00:36:13,150 และการจัดการที่เหมือนกันกับหลัก 696 00:36:13,150 --> 00:36:14,040 แต่ฉันจะไม่วาดว่า 697 00:36:14,040 --> 00:36:17,810 แต่ที่ที่ argc และ argv และใด ๆ ของตัวแปรท้องถิ่นเช่น x และ y 698 00:36:17,810 --> 00:36:18,940 อาจจะมีเช่นกัน 699 00:36:18,940 --> 00:36:22,170 >> ดังนั้นตอนนี้พิจารณาสิ่งที่เกิดขึ้นจริง เมื่อคุณโทร swap 700 00:36:22,170 --> 00:36:26,370 เมื่อคุณโทร swap, รหัสการดำเนินการเช่น นี้คุณผ่านในใน 701 00:36:26,370 --> 00:36:30,670 รุ่นรถ, A และ B เป็นสำเนาของ x และ y 702 00:36:30,670 --> 00:36:34,300 ดังนั้นถ้าฉันทำตอนนี้วาดนี้ บนหน้าจอ - 703 00:36:34,300 --> 00:36:36,700 จะได้รับดีกว่าที่นี้ - 704 00:36:36,700 --> 00:36:40,850 ดังนั้นเรื่องที่ผมบอกกับตัวเอง เป็นรถในรุ่นนี้เมื่อเรา 705 00:36:40,850 --> 00:36:46,130 เรียกสลับผ่านในตัวอักษร A และ B เป็นจำนวนเต็มสิ่งที่เกิดขึ้นจริง? 706 00:36:46,130 --> 00:36:48,250 >> ดีสิ่งที่เกิดขึ้นจริงนี้ 707 00:36:48,250 --> 00:36:52,850 ให้ฉันไปข้างหน้าและยกเลิกเพียง เพื่อล้างพื้นที่นี่คือบางส่วน 708 00:36:52,850 --> 00:36:54,720 ดังนั้นนี่คือหน่วยความจำคอมพิวเตอร์ของฉัน 709 00:36:54,720 --> 00:36:57,510 >> ดังนั้นถ้าฉันมีตัวอย่างเช่น - 710 00:36:57,510 --> 00:36:58,910 ที่จริงเราทำมันด้วยวิธีนี้ - 711 00:36:58,910 --> 00:37:02,690 ถ้าผมเรียกร้องว่านี่คือ x, จัดเก็บ มูลค่า 1 เช่นเดียวกับสัปดาห์ที่ผ่านมา 712 00:37:02,690 --> 00:37:05,930 และนี่คือ y จัดเก็บค่า 2 เช่นเดียวกับสัปดาห์ที่ผ่านมา 713 00:37:05,930 --> 00:37:11,370 และนี่คือหลักเมื่อฉันโทร swap, จึงให้ตัวเองเข้าถึงและ 714 00:37:11,370 --> 00:37:15,150 b และ tmp, ฉั​​นจะอ้างว่า นี้และนี่คือ 1 715 00:37:15,150 --> 00:37:16,080 >> นี่คือข 716 00:37:16,080 --> 00:37:17,010 นี่คือ 2 717 00:37:17,010 --> 00:37:18,370 นี้เรียกว่า tmp 718 00:37:18,370 --> 00:37:23,360 >> และต้นมันมีค่าขยะบาง จนกว่าฉันจะเก็บจริงในนั้น 719 00:37:23,360 --> 00:37:24,450 ซึ่งเป็น 1 720 00:37:24,450 --> 00:37:28,320 แล้วฉันไปข้างหน้าและการเปลี่ยนแปลง จะเป็นสิ่งที่? 721 00:37:28,320 --> 00:37:29,720 มูลค่าของ B 722 00:37:29,720 --> 00:37:31,980 >> และดังนั้นตอนนี้ฉันมีสองที่นี่ 723 00:37:31,980 --> 00:37:34,050 แล้วเรากล่าวว่า b ได้รับ tmp 724 00:37:34,050 --> 00:37:37,670 อีกครั้งเช่นเดียวกับที่ตรวจสอบสติที่สาม บรรทัดของรหัสที่นี่เป็นเพียงนี้ 725 00:37:37,670 --> 00:37:39,440 หนึ่ง b ได้รับ tmp 726 00:37:39,440 --> 00:37:41,730 >> และสุดท้ายสิ่งที่ฉันจะทำอะไร? 727 00:37:41,730 --> 00:37:46,800 ฉันไปข้างหน้าและเปลี่ยน b เป็นสิ่งที่ ค่าของ tmp เป็นซึ่งเป็น 1 728 00:37:46,800 --> 00:37:48,390 ผมไม่ได้สัมผัส tmp อีกครั้ง 729 00:37:48,390 --> 00:37:54,100 >> แต่ตอนนี้ปัญหาคือเร็วที่สุดเท่าที่ swap ผลตอบแทนที่ได้เพราะมันไม่ได้ส่ง 730 00:37:54,100 --> 00:37:57,540 กลับค่าบางอย่างมีผลตอบแทนไม่ได้ คำสั่งอย่างชัดเจนในนั้น 731 00:37:57,540 --> 00:37:59,080 สิ่งที่เกิดขึ้นจริง? 732 00:37:59,080 --> 00:38:03,480 ดีเป็นหลักหน่วยความจำทั้งหมดนี้ - 733 00:38:03,480 --> 00:38:07,410 ตกลงเห็นได้ชัดว่ายางลบชอบ เพียงหนึ่งนิ้วในเวลา - 734 00:38:07,410 --> 00:38:08,180 เพียงแค่หายไป 735 00:38:08,180 --> 00:38:10,070 >> ตอนนี้ในความเป็นจริงมันไม่ใช่ ไปทุกที่ 736 00:38:10,070 --> 00:38:11,810 แต่คุณสามารถคิดว่ามัน ขณะนี้เป็นเครื่องหมายคำถาม 737 00:38:11,810 --> 00:38:14,040 เพราะมันไม่มีอีกต่อไป จริงในการใช้งาน 738 00:38:14,040 --> 00:38:17,470 และไม่มีอะไรที่จะทำกับค่าเหล่านั้น 739 00:38:17,470 --> 00:38:21,920 >> ดังนั้นในกรณีของรุ่นสีเขียวของ รหัสนี้สิ่งที่จะถูกแทน 740 00:38:21,920 --> 00:38:24,640 ผ่านเข้าไปใน swap? 741 00:38:24,640 --> 00:38:25,770 ดังนั้นที่อยู่ 742 00:38:25,770 --> 00:38:28,520 ดังนั้นที่อยู่ของ x และ ที่อยู่ของ y 743 00:38:28,520 --> 00:38:35,790 ดังนั้นถ้าเรากลับบอกเรื่องนี้ล่าสุด เวลาและที่จริงผมวาด swap อีกครั้ง 744 00:38:35,790 --> 00:38:44,620 แต่กับตัวชี้นี่เป็นนี้ เป็น b, tmp นี้เป็นสิ่งที่เป็น 745 00:38:44,620 --> 00:38:49,080 ถูกจัดเก็บจริงในสีเขียวนี้ รุ่นของรหัสของฉันที่ฉันผ่าน 746 00:38:49,080 --> 00:38:52,110 ในที่อยู่? 747 00:38:52,110 --> 00:38:53,780 >> มันจะเป็นตัวชี้ไปยัง x 748 00:38:53,780 --> 00:38:54,890 ดังนั้นผมจึงสามารถวาดลูกศร 749 00:38:54,890 --> 00:38:57,310 แต่ขอใช้กันโดยพลการ ตัวอย่างเช่นที่ผ่านมา 750 00:38:57,310 --> 00:39:01,220 ขอบอกว่านี้คือ สิ่งที่ต้องการ Ox123 751 00:39:01,220 --> 00:39:04,970 และสิ่งนี้เป็นไปได้เพราะ Ox127 มันเป็นไบต์ที่สี่ออกไปเพราะมัน 752 00:39:04,970 --> 00:39:07,370 int ดังนั้น Ox127 753 00:39:07,370 --> 00:39:09,080 >> และอีกครั้งที่ผมสละเสรีภาพบางส่วน กับตัวเลข 754 00:39:09,080 --> 00:39:11,430 พวกเขากำลังมีขนาดเล็กกว่าที่พวกเขาจะ ความเป็นจริงและในการสั่งซื้อที่แตกต่างกัน 755 00:39:11,430 --> 00:39:14,350 แต่ที่วิธีการที่ภาพ คือตอนนี้ที่แตกต่างกัน 756 00:39:14,350 --> 00:39:19,060 >> แต่เมื่อฉันใช้รหัสนี้สีเขียว และ tmp int ฉันจะได้รับ * 757 00:39:19,060 --> 00:39:25,010 * วิธีทำต่อไปนี้จะต้องมีการ ที่อยู่ที่อยู่ในและไปกับมัน 758 00:39:25,010 --> 00:39:26,190 ซึ่งเป็น 1 759 00:39:26,190 --> 00:39:28,480 และนั่นคือสิ่งที่ฉันแล้วใส่ใน tmp 760 00:39:28,480 --> 00:39:32,480 ในขณะเดียวกันในบรรทัดถัดไปของรหัส ที่นี่ได้รับ * b, ว่าหมายความว่าอย่างไร 761 00:39:32,480 --> 00:39:36,910 >> ดี * เพื่อไปที่นี่ได้รับ * b, ซึ่งหมายถึงไปที่นั่น 762 00:39:36,910 --> 00:39:39,310 และนั่นหมายความว่าใส่ค่าที่จะมี 763 00:39:39,310 --> 00:39:43,670 สุดท้ายบรรทัดสุดท้ายของรหัส เพียงกล่าวว่า b * ได้รับ tmp 764 00:39:43,670 --> 00:39:48,900 >> ดังนั้น B พูดว่าไปที่นั่นและเขียนทับด้วย tmp ซึ่งในกรณีนี้เป็นไป 765 00:39:48,900 --> 00:39:51,520 ที่จะเป็นอีกครั้ง 1 766 00:39:51,520 --> 00:39:54,920 และนี่คือเหตุผลที่รุ่นสีเขียว งานรหัสของเราในขณะที่สีแดง 767 00:39:54,920 --> 00:39:56,010 รุ่นที่ไม่เคยทำ 768 00:39:56,010 --> 00:39:59,020 ซึ่งทั้งหมดจะเดือดลงไปเพียงแค่วิธีการที่ หน่วยความจำที่มีการจัดการและที่มัน 769 00:39:59,020 --> 00:40:02,580 จริงวางในของคุณ ของคอมพิวเตอร์ RAM 770 00:40:02,580 --> 00:40:07,270 และสำหรับตอนนี้ที่เป็นหนึ่งในสิ่ง สแต็คที่จะถูกใช้สำหรับ 771 00:40:07,270 --> 00:40:09,225 >> คำถามในรูปแบบ? 772 00:40:09,225 --> 00:40:10,380 เมื่อชี้? 773 00:40:10,380 --> 00:40:11,630 หรือบน swap? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> สิทธิทั้งหมด malloc เพื่อให้การเรียกคืน, ทำอะไรบางอย่างเช่นนี้ 776 00:40:17,043 --> 00:40:18,260 นี้เป็นตัวอย่างง่ายสุด 777 00:40:18,260 --> 00:40:20,550 และนี่ก็เป็นหนึ่งที่บิงกี้ แนะนำให้เราแม้จะค่อนข้าง 778 00:40:20,550 --> 00:40:21,870 ได้อย่างรวดเร็วในตอนท้ายของชั้นเรียน 779 00:40:21,870 --> 00:40:24,480 โธ่เว้ยมีเราไปอีกครั้ง 780 00:40:24,480 --> 00:40:28,780 >> ดังนั้นจำได้ว่าเรื่องนี้เป็นตัวอย่างที่ บิงกี้นำเราไปแม้ว่า 781 00:40:28,780 --> 00:40:30,360 ค่อนข้างได้อย่างรวดเร็วในตอนท้ายของชั้นเรียน 782 00:40:30,360 --> 00:40:33,640 และที่นี่เราใช้ malloc จริงๆ เป็นครั้งที่สอง 783 00:40:33,640 --> 00:40:37,330 เพราะครั้งแรกที่เราใช้มันเพื่อ สร้าง RAM เพียงพอจัดสรร RAM เพียงพอ 784 00:40:37,330 --> 00:40:38,340 เพื่อเก็บสตริง 785 00:40:38,340 --> 00:40:40,250 >> บิงกี้คราวนี้เก็บไว้มันง่าย 786 00:40:40,250 --> 00:40:42,465 ดังนั้นจึงเป็นเพียงการจัดเก็บ int เห็นได้ชัดว่า 787 00:40:42,465 --> 00:40:43,510 และที่ดีโดยสิ้นเชิง 788 00:40:43,510 --> 00:40:46,560 มันเป็นเรื่องที่แปลกเล็กน้อยตรงไปตรงมาเพื่อ ใช้ malloc ในการจัดสรรหนึ่ง int 789 00:40:46,560 --> 00:40:50,650 แต่จุด claymation ของ Nick คือ จริงๆเพียงแค่บอกเล่าเรื่องราวของสิ่งที่ 790 00:40:50,650 --> 00:40:53,830 เกิดขึ้นหรือไม่เกิดขึ้นเมื่อ คุณข่มเหงหน่วยความจำ 791 00:40:53,830 --> 00:40:56,520 >> ดังนั้นในกรณีนี้โปรแกรมนี้ ทำบางสิ่ง 792 00:40:56,520 --> 00:41:01,580 ในกรณีแรกที่นี่ก็บอกว่า ตัวชี้ที่เรียกว่า x เพื่อ int 793 00:41:01,580 --> 00:41:04,480 จากนั้นก็ประกาศตัวชี้ ที่เรียกว่า Y เพื่อ int 794 00:41:04,480 --> 00:41:06,150 จากนั้นจะจัดเก็บใน x, อะไร 795 00:41:06,150 --> 00:41:07,110 คนอื่นในขณะนี้ 796 00:41:07,110 --> 00:41:09,685 สิ่งที่ได้รับการจัดเก็บไว้ใน x ตาม บรรทัดที่สามของโปรแกรมนี้? 797 00:41:09,685 --> 00:41:12,380 >> ผู้ชม: [ได้ยิน] 798 00:41:12,380 --> 00:41:14,130 >> 1 SPEAKER กันไม่มาก ไบต์ต่อว่า 799 00:41:14,130 --> 00:41:16,760 จะแม่นยำมากขึ้นในขณะนี้ 800 00:41:16,760 --> 00:41:18,325 สิ่งที่ได้รับการจัดเก็บไว้ใน X? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 ที่อยู่ฉันคิดว่าฉันได้ยินมัน 803 00:41:22,060 --> 00:41:23,570 >> ดังนั้น malloc สิ่งที่ไม่กลับมา? 804 00:41:23,570 --> 00:41:26,030 malloc behaviorally จัดสรร หน่วยความจำอัน 805 00:41:26,030 --> 00:41:27,850 แต่มันเป็นวิธีการที่ไม่ทำให้คุณสามารถใช้มันได้หรือ 806 00:41:27,850 --> 00:41:29,460 มันกลับอะไร 807 00:41:29,460 --> 00:41:32,000 ที่อยู่ของไบต์แรก ในหน่วยความจำอัน 808 00:41:32,000 --> 00:41:33,020 >> ตอนนี้ง่ายสุด 809 00:41:33,020 --> 00:41:35,380 มันเป็นเพียงหนึ่งไบต์ซึ่งหมายความว่า ที่เราได้รับกลับเป็น 810 00:41:35,380 --> 00:41:37,300 ที่อยู่ของสิ่งที่ทั้ง 811 00:41:37,300 --> 00:41:42,070 เก็บไว้ดังนั้นใน x ก็คือที่อยู่ ของหน่วยความจำอันว่า 812 00:41:42,070 --> 00:41:43,400 ในขณะเดียวกันสิ่งที่เกิดขึ้นต่อไปคืออะไร? 813 00:41:43,400 --> 00:41:45,890 ดังนั้นจริงให้ไปข้างหน้าและ วาดอย่างรวดเร็วนี้จริงออก 814 00:41:45,890 --> 00:41:52,490 >> ดังนั้นถ้าเราไปกว่าไปยังหน้าจอที่นี่และ เราเล่นออกนี้ int * int x และ y * 815 00:41:52,490 --> 00:41:53,740 จะไปทำในสิ่งที่สำหรับฉันหรือไม่ 816 00:41:53,740 --> 00:41:58,280 ผมอ้างว่ามันเป็นเพียงแค่จะทำ บางอย่างเช่นนี้และเรียกว่า x และ 817 00:41:58,280 --> 00:42:00,010 นี้และเรียกว่า y 818 00:42:00,010 --> 00:42:03,110 ขณะที่บรรทัดที่สามของรหัสคือ ไปจัดสรรขนาดของ int, 819 00:42:03,110 --> 00:42:06,160 ที่เกิดขึ้นจะ - ขออภัยหากผมบอกว่า หนึ่งก่อนที่ผมจะหมายถึงหนึ่ง int - 820 00:42:06,160 --> 00:42:08,280 สี่ไบต์บนเครื่องคอมพิวเตอร์ทั่วไป 821 00:42:08,280 --> 00:42:09,720 อย่างน้อยกับ CS50 เครื่องใช้ 822 00:42:09,720 --> 00:42:11,490 >> ดังนั้นนี้เป็นไปจัดสรร มันใครจะรู้? 823 00:42:11,490 --> 00:42:12,800 ที่ไหนสักแห่งออกจากที่นี่ 824 00:42:12,800 --> 00:42:15,780 และนี่คือบางส่วนเก็บไว้ที่ วัวที่อยู่ใครจะรู้? 825 00:42:15,780 --> 00:42:18,330 แต่สิ่งที่จะได้รับกลับมา เป็นที่อยู่ที่ 826 00:42:18,330 --> 00:42:22,270 แต่เราจะวาดนี้ pictorially เป็นเพียงเช่นเดียวกับที่ลูกศร 827 00:42:22,270 --> 00:42:25,430 >> ตอนนี้ในบรรทัดถัดไปจะได้รับ * x 42 828 00:42:25,430 --> 00:42:29,400 สิ่งที่ไม่ x * หมายถึงในแง่ของคนธรรมดา? 829 00:42:29,400 --> 00:42:30,040 เพียงแค่ไปที่นั่น 830 00:42:30,040 --> 00:42:30,960 ไปที่ที่อยู่ที่ 831 00:42:30,960 --> 00:42:35,900 หรือในคำอื่น ๆ ทำตาม ศรและใส่ 42 มี 832 00:42:35,900 --> 00:42:38,140 แต่แล้วสิ่งที่ไม่ดีเกิดขึ้น ไปบิงกี้ใช่มั้ย? 833 00:42:38,140 --> 00:42:43,950 >> จำเส้นที่ห้านี่, y * ได้รับ 13 จริงจำนวนโชคร้าย 834 00:42:43,950 --> 00:42:44,760 ทำในสิ่งที่เรา? 835 00:42:44,760 --> 00:42:47,320 ดี * y หมายถึงไปที่นั่น 836 00:42:47,320 --> 00:42:50,460 อย่างนี้ยังไม่ได้รับ มูลค่ายังขวา? 837 00:42:50,460 --> 00:42:54,090 รหัสไม่ได้เป็น y เริ่มต้นกับสิ่งใด 838 00:42:54,090 --> 00:42:56,120 เราได้ x ถูกเริ่มต้น ไปยังที่อยู่ 839 00:42:56,120 --> 00:42:57,640 แต่ y ถูกประกาศขึ้นด้านบน 840 00:42:57,640 --> 00:43:00,250 แต่แล้วอัฒภาคไม่มีค่า ถูกจริงใส่ในนั้น 841 00:43:00,250 --> 00:43:02,330 ดังนั้นมันยุติธรรมที่จะเรียกสิ่งนี้ว่า ค่าขยะ 842 00:43:02,330 --> 00:43:03,430 รู้ว่าสิ่งที่อยู่ที่นั่นใคร? 843 00:43:03,430 --> 00:43:07,160 มันเป็นเศษเล็กเศษน้อยของบิตที่ถูกนำมาใช้ โดยบรรทัดก่อนหน้าบางส่วนของรหัสใน 844 00:43:07,160 --> 00:43:08,300 โปรแกรมของฉัน 845 00:43:08,300 --> 00:43:13,250 >> ดังนั้นถ้าฉันบอกว่าไปที่นั่นเช่นนี้, ผมมีความคิดที่ลูกศรนี้จะไม่มี 846 00:43:13,250 --> 00:43:14,490 จะจบลง 847 00:43:14,490 --> 00:43:17,720 และที่ว่าเมื่อคุณมักจะ ได้รับความผิดส่วน 848 00:43:17,720 --> 00:43:22,430 หากคุณ dereference ตั้งใจเพื่อที่จะ พูดหรือไปยังที่อยู่ที่ไม่ 849 00:43:22,430 --> 00:43:25,400 จริงที่อยู่ถูกต้องตามกฎหมาย สิ่งเลวร้ายที่เกิดขึ้น 850 00:43:25,400 --> 00:43:27,550 >> และนั่นคือสิ่งที่เกิดขึ้น ที่จะคิดว่าบิงกี้ 851 00:43:27,550 --> 00:43:31,060 ดังนั้นจำได้ว่าเรื่องที่นิคคือ บอกที่นี่เป็นความคิดเดียวกันกับสิ่งที่ 852 00:43:31,060 --> 00:43:34,050 ผมเคยวาดด้วยภาพลวงตาของ ชอล์กบนกระดานมี 853 00:43:34,050 --> 00:43:35,960 x และ y มีการประกาศ 854 00:43:35,960 --> 00:43:39,690 >> แล้วเราจัดสรรขนาดของ int และเก็บไว้ใน x 855 00:43:39,690 --> 00:43:42,130 แล้วบรรทัดถัดไปที่เราทำ x * 856 00:43:42,130 --> 00:43:46,070 นี่เป็นไม้กายสิทธิ์ของ Nick จาก dereferencing 857 00:43:46,070 --> 00:43:49,780 ที่วาง 42 ในหน่วยความจำ แหลมออกโดย x 858 00:43:49,780 --> 00:43:51,600 >> แต่นี่คือสิ่งที่ ไปอย่างน่ากลัวผิด 859 00:43:51,600 --> 00:43:51,820 ใช่ไหม? 860 00:43:51,820 --> 00:43:53,550 เราพยายามที่จะ y dereference 861 00:43:53,550 --> 00:43:55,620 แต่ y มีค่าบางอย่างที่ปลอมใช่มั้ย? 862 00:43:55,620 --> 00:43:57,720 >> ลูกศรในด้านล่างซ้ายมือว่า มุมไม่ได้ 863 00:43:57,720 --> 00:43:58,950 จริงชี้ไปที่ใด 864 00:43:58,950 --> 00:44:01,520 เป็นชนิดของการทำสิ่งที่ฉัน ได้ที่นี่บนกระดาน 865 00:44:01,520 --> 00:44:05,900 ดังนั้นสิ่งที่ไม่ดีเกิดขึ้นการแบ่งส่วน, ความผิดความผิดหรือบิงกี้ในกรณีนี้ 866 00:44:05,900 --> 00:44:10,800 >> แต่ถ้าเราแก้ไขแล้วว่าการดำเนินการ x y วิธีการที่ไม่ได้รับการเปลี่ยนแปลงเรื่อง? 867 00:44:10,800 --> 00:44:15,760 ดีถ้าฉันได้รับ x y ที่ ได้อย่างมีประสิทธิภาพเช่นเดียวกับการพูด 868 00:44:15,760 --> 00:44:19,235 สิ่งนี้คือวัวบางสิ่งบางอย่าง เป็นไปได้เหมือนกันที่นี่ 869 00:44:19,235 --> 00:44:20,080 วัวบางสิ่งบางอย่าง 870 00:44:20,080 --> 00:44:22,970 หรือ pictorially เราจะวาดล​​ูกศร 871 00:44:22,970 --> 00:44:25,530 >> ดังนั้นที่นี่บนกระดานกับบิงกี้, ด้วยบรรทัดถัดไปของ 872 00:44:25,530 --> 00:44:28,350 รหัส * y หมายถึงไปที่นั่น 873 00:44:28,350 --> 00:44:29,400 ที่มี? 874 00:44:29,400 --> 00:44:30,820 มันหมายความว่ากว่าที่นี่ 875 00:44:30,820 --> 00:44:36,050 >> และเมื่อเราปรับปรุงนั้นให้อยู่เป็น 13 มันก็เกี่ยวข้องกับการคงอยู่และ 876 00:44:36,050 --> 00:44:39,470 เขียน 13 ที่นี่ตอนนี้ 877 00:44:39,470 --> 00:44:44,130 ดังนั้นอาจจะไม่สมบูรณ์ ตรงไปตรงมาอย่างรวดเร็วก่อน 878 00:44:44,130 --> 00:44:47,740 แต่การที่จะปะยางรถและการใช้ศัพท์แสงเดียวกัน ที่บิงกี้ก็ใช้ที่นี่ดังนั้น 879 00:44:47,740 --> 00:44:50,485 สองคนแรกที่จัดสรรตัวชี้, x และ y แต่ไม่ pointees 880 00:44:50,485 --> 00:44:54,750 และ pointees ไม่ได้เป็น คำที่ใช้โดยทั่วไป 881 00:44:54,750 --> 00:44:56,120 แต่ตัวชี้อย่างแน่นอนคือ 882 00:44:56,120 --> 00:44:59,200 แต่มันเป็นสิ่งที่ถูกชี้ ที่ในบิงกี้ของศัพท์ 883 00:44:59,200 --> 00:45:01,660 >> บรรทัดนี้ต่อไปแน่นอน จัดสรร pointee int 884 00:45:01,660 --> 00:45:04,840 ดังนั้นก้อนของหน่วยความจำ - เป็นฉันวาดไปบน ด้านขวามือมี - และชุด 885 00:45:04,840 --> 00:45:06,470 x เท่ากับชี้ไปที่มัน 886 00:45:06,470 --> 00:45:11,350 นี้ x dereferences ในการจัดเก็บที่ 42 ใน หน่วยความจำที่มันชี้ไปที่ 887 00:45:11,350 --> 00:45:13,380 และแล้วนี้แน่นอน เป็นสิ่งที่ไม่ดี 888 00:45:13,380 --> 00:45:15,600 เพราะ y ไม่ได้ชี้ ที่อะไรเลย 889 00:45:15,600 --> 00:45:16,530 นี้จะแก้ไขมัน 890 00:45:16,530 --> 00:45:18,240 ดังนั้นนี่คือโปรแกรมยังรถม้าชนิดเล็ก 891 00:45:18,240 --> 00:45:21,580 เพียงเพราะเรากำลังพัดผ่าน รหัสสายเส้นและพูดว่าโอ้ดี 892 00:45:21,580 --> 00:45:22,690 ปล่อยให้มันผิดพลาดมี 893 00:45:22,690 --> 00:45:23,420 นั่นเป็นสิ่งที่ไม่ดี 894 00:45:23,420 --> 00:45:26,790 ราคาต่อรองเป็นโปรแกรมเพียงแค่ไป ยกเลิกทั้งหมดที่บรรทัดที่ 895 00:45:26,790 --> 00:45:30,550 แต่ถ้าคุณจะเอาชน แถวและแทนที่ด้วยสองคนสุดท้าย 896 00:45:30,550 --> 00:45:32,470 สายมีคุณกำหนด - 897 00:45:32,470 --> 00:45:35,310 โดยใช้ตัวชี้ที่ได้รับมอบหมาย - y ให้ชี้ไปที่ x เป็นจุดที 898 00:45:35,310 --> 00:45:39,280 แล้ว dereference คุณ y วิธีการที่ปลอดภัยมาก 899 00:45:39,280 --> 00:45:41,520 >> ดังนั้นนี้ไม่ที่ปล่อยให้เรา? 900 00:45:41,520 --> 00:45:45,350 ดีปรากฎว่าอยู่ภายใต้ฝากระโปรง ในห้องสมุด CS50 ตัวชี้เป็น 901 00:45:45,350 --> 00:45:46,320 ใช้ตลอด 902 00:45:46,320 --> 00:45:48,910 และเราจริงจะเริ่มต้นในการปอกเปลือก กลับชั้นก่อนที่จะมานานแล้วว่า 903 00:45:48,910 --> 00:45:51,740 แต่ปรากฎเกินไปนิพจน์ที่ บางส่วนของคุณอาจจะคุ้นเคยกับ 904 00:45:51,740 --> 00:45:54,580 โดยเฉพาะผู้ที่สะดวกสบายมากขึ้น เป็นจริงที่เป็นที่นิยมมาก 905 00:45:54,580 --> 00:45:56,390 เว็บไซต์หรือกองล้น, วันนี้ 906 00:45:56,390 --> 00:45:58,720 >> แต่เรื่องนี้จริงมีมาก ความหมายทางเทคนิค 907 00:45:58,720 --> 00:46:00,160 ตอนนี้เรารู้ว่าสิ่งที่สแต็คเป็น 908 00:46:00,160 --> 00:46:02,550 มันเหมือนสแต็คของถาด ภายในห้องโถง 909 00:46:02,550 --> 00:46:05,140 >> หรือด้านในของเครื่องคอมพิวเตอร์ของคุณ หน่วยความจำของเฟรมเหล่านั้น 910 00:46:05,140 --> 00:46:06,900 ที่ใช้โดยฟังก์ชั่น 911 00:46:06,900 --> 00:46:10,760 ดีก็ปรากฎว่าเนื่องจากการที่ การดำเนินงานที่ง่ายมาก 912 00:46:10,760 --> 00:46:14,970 หน่วยความจำและกรอบบนที่เรียกว่า สแต็คที่คุณจริงสามารถที่จะควบคุม 913 00:46:14,970 --> 00:46:17,050 ของระบบคอมพิวเตอร์ได้ค่อนข้างง่าย 914 00:46:17,050 --> 00:46:22,180 คุณสามารถตัดเข้าสู่ระบบถ้าคน เหมือนเรายังไม่ได้เขียนรหัสของเรา 915 00:46:22,180 --> 00:46:23,300 โดยเฉพาะอย่างยิ่ง 916 00:46:23,300 --> 00:46:26,670 >> ถ้าคนชอบเราใช้ชิ้น ของอาร์เรย์หน่วยความจำหรือการใช้งาน - 917 00:46:26,670 --> 00:46:27,810 มากยิ่งขึ้นโดยทั่วไป - 918 00:46:27,810 --> 00:46:31,800 แต่บางครั้งลืมที่จะตรวจสอบ ขอบเขตของอาร์เรย์ของเราในขณะที่คุณอาจจะ 919 00:46:31,800 --> 00:46:38,470 ตัวเองมีบางครั้งและซ้ำ วิธีการที่ผ่านมาปลายแถว 920 00:46:38,470 --> 00:46:40,520 ในกรณีที่ดีที่สุดโปรแกรมของคุณ เพียงแค่อาจผิดพลาด 921 00:46:40,520 --> 00:46:42,280 ความผิดส่วนชนิด, อาย 922 00:46:42,280 --> 00:46:45,480 ไม่ดี แต่มันก็ไม่จำเป็นต้อง สิ่งที่ไม่ดีอย่างมหาศาล 923 00:46:45,480 --> 00:46:49,480 >> แต่ถ้าโปรแกรมของคุณเป็นจริงจริง คอมพิวเตอร์ของผู้ใช้ถ้ามันทำงาน 924 00:46:49,480 --> 00:46:53,070 บนเว็บไซต์ที่คนสุ่มที่เกิดขึ้นจริง บนอินเทอร์เน็ตจะตีให้ 925 00:46:53,070 --> 00:46:56,690 คนก่อให้เกิดสิ่งที่ไม่ดีเกี่ยวกับรหัสของคุณ โดยทั่วไปไม่ได้เป็นสิ่งที่ดีเพราะ 926 00:46:56,690 --> 00:46:59,930 มันหมายถึงโอกาสที่จะ การควบคุมของเครื่องคอมพิวเตอร์ 927 00:46:59,930 --> 00:47:01,350 และสิ่งนี้จะไปดู เล็ก ๆ น้อย ๆ เป็นความลับ 928 00:47:01,350 --> 00:47:04,570 แต่ฉันคิดว่าฉันทำให้คุณกลัวด้วย ตัวอย่างสุดท้ายนี้ที่นี่ 929 00:47:04,570 --> 00:47:05,650 >> นี่คือตัวอย่างของรหัสของ 930 00:47:05,650 --> 00:47:07,370 และมีดีวิกิพีเดีย บทความที่เดินผ่าน 931 00:47:07,370 --> 00:47:08,530 นี้ในรายละเอียดมากขึ้น 932 00:47:08,530 --> 00:47:13,890 ผมมีหลักในการโทรด้านล่าง foo ผ่านใน argv จาก 1 933 00:47:13,890 --> 00:47:15,750 และนี่เป็นเพียงเพื่อให้คุณสามารถ รันโปรแกรมและผ่าน 934 00:47:15,750 --> 00:47:17,080 การป้อนข้อมูลโดยพลการ 935 00:47:17,080 --> 00:47:20,180 >> แล้ว foo มีการประกาศขึ้นด้านบน เป็นที่ยอมรับสตริงหรือมากกว่า 936 00:47:20,180 --> 00:47:21,700 แม่นยำ char * 937 00:47:21,700 --> 00:47:23,860 จากนั้นจะประกาศอาร์เรย์ของตัวอักษร 938 00:47:23,860 --> 00:47:27,130 เรียกว่าบัฟเฟอร์มากกว่าโดยทั่วไป จากขนาด 12 939 00:47:27,130 --> 00:47:30,900 ดังนั้น 12 ตัวอักษรสามารถพอดีภายใน ของอาร์เรย์เรียกว่า C ที่ 940 00:47:30,900 --> 00:47:33,510 >> และจากนั้นจะใช้ฟังก์ชันนี้ใหม่ ซึ่งเป็นของใหม่ แต่ไม่ยากที่จะ 941 00:47:33,510 --> 00:47:34,930 เข้าใจสำเนาหน่วยความจำ 942 00:47:34,930 --> 00:47:39,290 เป็นชุดหน่วยความจำจากแถบซึ่งเป็น n ที่ผ่านมาตัวแปรอะไรก็ตาม 943 00:47:39,290 --> 00:47:42,080 ผู้ใช้พิมพ์ลงใน argv 1 เป็น C 944 00:47:42,080 --> 00:47:43,090 กี่ไบต์? 945 00:47:43,090 --> 00:47:44,260 ความยาวสตริงของแถบ 946 00:47:44,260 --> 00:47:48,380 >> ดังนั้นในคำอื่น ๆ ถ้าผู้ใช้ใน H-e-l-L-O ใส่, ความยาวสตริง 947 00:47:48,380 --> 00:47:49,260 ของสวัสดีคือห้า 948 00:47:49,260 --> 00:47:52,790 ดังนั้นห้าของไบต์ที่เป็นไปได้ คัดลอกลงในอาร์เรย์เรียกว่า C ซึ่ง 949 00:47:52,790 --> 00:47:54,110 เป็นขนาด 12 950 00:47:54,110 --> 00:47:58,710 แต่สิ่งที่ผู้ใช้ชนิดในอีกไม่นาน คำที่ 13 อักขระหรือ 14 951 00:47:58,710 --> 00:48:01,250 อักขระหรือ 100 ตัวอักษรหรือมากกว่า? 952 00:48:01,250 --> 00:48:02,660 >> พวกเขาจะไปที่ไหน? 953 00:48:02,660 --> 00:48:06,090 ดีกรอบที่ถาดว่า ในกอง Dining Hall, 954 00:48:06,090 --> 00:48:06,930 พวกเขากำลังจะไปที่นั่น 955 00:48:06,930 --> 00:48:10,080 และเป็นเพียงจะเริ่มต้นการเขียนทับ สิ่งอื่น ๆ ที่มีอยู่แล้ว 956 00:48:10,080 --> 00:48:12,880 บนสแต็คที่ล้น สแต็คเพื่อที่จะพูด 957 00:48:12,880 --> 00:48:14,780 >> ดังนั้น pictorially คิดว่าวิธีนี้ 958 00:48:14,780 --> 00:48:17,970 นี่เป็นเพียงรุ่นที่มีสีสันของ ภาพที่เราได้วาดภาพ 959 00:48:17,970 --> 00:48:20,060 ที่ด้านล่างสมมติว่าเป็นหลัก 960 00:48:20,060 --> 00:48:24,690 และด้านบนสิ่งที่คุณเห็นในขณะนี้ เป็นกรอบสีที่เขียนตอนนี้สำหรับ 961 00:48:24,690 --> 00:48:26,090 ฟังก์ชันที่เรียกว่า foo 962 00:48:26,090 --> 00:48:30,170 แต่สิ่งที่น่าสนใจเกี่ยวกับที่นี่ foo คือว่าที่นี่เป็นกรอบ 963 00:48:30,170 --> 00:48:32,860 จึงดึงออกมาเช่นเดียวกับผม แต่ไม่ได้อยู่ในแสงไฟสีฟ้า 964 00:48:32,860 --> 00:48:35,220 และตอนนี้เป็นที่ที่ ควงเล็บ 0 ไป 965 00:48:35,220 --> 00:48:37,410 และนี่คือที่ c วงเล็บ 11 จะจบลง 966 00:48:37,410 --> 00:48:39,670 >> ในคำอื่น ๆ มันเกิดขึ้นกับ จะแสดงเป็นตาราง 967 00:48:39,670 --> 00:48:42,320 แต่ถ้าคุณเพียงแค่ให้ plopping ไบต์ ลง - หรือตัวอักษร - พวกเขากำลังจะสิ้นสุด 968 00:48:42,320 --> 00:48:46,070 ขึ้นที่สถานที่ตั้ง 0 ตลอดทางขึ้น ถึง 11 เพราะมันเป็น 0 การจัดทำดัชนี 969 00:48:46,070 --> 00:48:49,170 >> แต่ที่ตัวละครที่ 13 คือ จะจบลง? 970 00:48:49,170 --> 00:48:50,310 ที่ 14 หรือไม่ 971 00:48:50,310 --> 00:48:52,430 ในกรณีที่ตัวละคร 50 คน จะจบลง? 972 00:48:52,430 --> 00:48:54,070 >> มันจะให้ไปลง 973 00:48:54,070 --> 00:48:57,350 เพราะแม้ว่าเราจะวาด รูปภาพที่มีสแต็คเติบโตขึ้น 974 00:48:57,350 --> 00:48:59,920 ที่อยู่ก็จะเปิดออกไปจาก ที่อยู่เล็ก ๆ 975 00:48:59,920 --> 00:49:01,830 ชี้ไปยังที่อยู่ขนาดใหญ่ 976 00:49:01,830 --> 00:49:03,540 ดังนั้นมันก็ช่วยให้ขึ้นไปและขึ้น 977 00:49:03,540 --> 00:49:05,660 >> ดังนั้นหากผู้ใช้ประเภทใน สวัสดีที่ดี 978 00:49:05,660 --> 00:49:08,650 ข้อผิดพลาดไม่มีไม่มีปัญหาทุกคนปลอดภัย 979 00:49:08,650 --> 00:49:11,940 แต่ถ้าผู้ใช้ในสิ่งที่เราจะ เรียกรหัสขัดแย้งแทน 980 00:49:11,940 --> 00:49:16,040 โดยทั่วไปในขณะที่การโจมตีการโจมตี, โจมตีการโจมตีสิ่งที่สามารถเกิดขึ้นได้อย่างไร 981 00:49:16,040 --> 00:49:19,760 >> ดีถ้าทั้งหมดของท่านที่ผู้ใช้ พิมพ์ในไม่ได้เป็นเพียงบางส่วนที่เป็นมิตร 982 00:49:19,760 --> 00:49:21,540 หรือสตริงที่น่ารังเกียจของตัวอักษร 983 00:49:21,540 --> 00:49:24,050 เป็นจริงลำดับของตัวอักษร ว่าถ้าคุณเรียบเรียง, 984 00:49:24,050 --> 00:49:26,050 มันเป็นจริงรหัส 985 00:49:26,050 --> 00:49:29,570 อาจจะเป็นรหัสที่ลบทั้งหมด ไฟล์บนฮาร์ดไดรฟ์ของคุณหรือส่งสแปม 986 00:49:29,570 --> 00:49:30,810 หรือสิ่งที่ต้องการที่ 987 00:49:30,810 --> 00:49:35,110 ขอให้สังเกตว่าสิ่งที่สำคัญที่นี่คือ ถ้าคนเลวโชคดีพอที่จะ 988 00:49:35,110 --> 00:49:37,830 เขียนทับก้อนสีแดงของหน่วยความจำ - 989 00:49:37,830 --> 00:49:41,080 ซึ่งผมไม่ได้วาดภาพของฉัน แต่ นี้ภาพที่วิกิพีเดียที่นี่มี - 990 00:49:41,080 --> 00:49:42,890 ที่อยู่ผู้ส่งของที่เรียกว่า 991 00:49:42,890 --> 00:49:47,470 >> เมื่อผลตอบแทนอาหารเมื่อผลตอบแทนที่ได้แลกเปลี่ยน คอมพิวเตอร์ไม่ทราบว่าจะไปจากวิธี 992 00:49:47,470 --> 00:49:49,790 ขึ้นที่นี่เพื่อลงที่นี่? 993 00:49:49,790 --> 00:49:52,920 หรือในส่วนของเทคโนโลยีขึ้นข้างต้นว่า ก็รู้ว่าจะไปจากการแลกเปลี่ยน 994 00:49:52,920 --> 00:49:54,870 รหัส - 0 และ 1 ที่ประกอบด้วยการแลกเปลี่ยน - 995 00:49:54,870 --> 00:49:56,020 กลับไปที่หน้าหลัก? 996 00:49:56,020 --> 00:50:00,450 มีที่อยู่ผู้ส่งที่เรียกว่าคน เก็บไว้ในกองกรอบที่เดียวกันบน 997 00:50:00,450 --> 00:50:02,140 ถาดโรงอาหารเดียวกัน 998 00:50:02,140 --> 00:50:06,080 >> ดังนั้นถ้าคนเลวเป็นคนฉลาดพอที่จะ ใส่รหัสโจมตี, รหัสโจมตีการโจมตี, 999 00:50:06,080 --> 00:50:07,960 รหัสและได้รับโชคดีพอ - 1000 00:50:07,960 --> 00:50:11,630 มักจะผ่านการทดลองและข้อผิดพลาด - เพื่อ เขียนทับที่อยู่ผู้ส่งที่สีแดง, 1001 00:50:11,630 --> 00:50:14,360 มีที่อยู่และแจ้งให้ทราบล่วงหน้า ด้านบนมาก 1002 00:50:14,360 --> 00:50:16,830 สังเกต 0835C080 1003 00:50:16,830 --> 00:50:20,650 มันเขียนย้อนกลับขึ้นด้านบนสำหรับ เหตุผลที่เราอาจจะทบทวน 1004 00:50:20,650 --> 00:50:22,050 นี้เป็นตัวเลขที่ 1005 00:50:22,050 --> 00:50:25,790 >> ดังนั้นถ้าคนเลวได้รับโชคดีพอหรือ ฉลาดพอที่จะเขียนทับสีแดง 1006 00:50:25,790 --> 00:50:29,480 เปลื้องผ้าของหน่วยความจำที่มีอยู่ของ รหัสที่เขาหรือเธอมีอย่างใด 1007 00:50:29,480 --> 00:50:34,980 ฉีดเข้าไปในเครื่องคอมพิวเตอร์ของคุณซึ่งเดา รหัสจะถูกส่งกลับไปยัง 1008 00:50:34,980 --> 00:50:38,260 เร็วที่สุดเท่าที่จะทำ foo ทํางาน 1009 00:50:38,260 --> 00:50:39,440 >> รหัสของคนเลว 1010 00:50:39,440 --> 00:50:43,610 ดังนั้นรหัสการโจมตีนี้ AAA อีกครั้งอาจจะ ส่งสแปมอาจลบไฟล์ทั้งหมด 1011 00:50:43,610 --> 00:50:44,500 ในฮาร์ดดิสก์ของคุณ 1012 00:50:44,500 --> 00:50:48,740 แต่นั่นคือสิ่งที่แท้จริงแตกล้น เป็นหรือลักษณะ buffer overrun หรือ 1013 00:50:48,740 --> 00:50:51,060 การโจมตีหน่วยความจำล้น 1014 00:50:51,060 --> 00:50:54,400 >> และมันก็เป็นอย่างไม่น่าเชื่อเหมือนกันอย่างไม่น่าเชื่อ จนถึงวันที่มีโปรแกรมที่เขียนในนี้ 1015 00:50:54,400 --> 00:50:58,220 C, C + + และแม้กระทั่งบางภาษาอื่น ๆ 1016 00:50:58,220 --> 00:51:02,275 ในบันทึกที่น่ากลัวว่าเราจะ จบลงด้วยเรื่องตลก 1017 00:51:02,275 --> 00:51:03,230 >> [เสียงหัวเราะ] 1018 00:51:03,230 --> 00:51:04,550 >> ดูคุณในวันพุธที่ 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 ที่ต่อไป CS50 - 1021 00:51:10,310 --> 00:51:15,920 ดังนั้นฉันออกจากโคมไฟดิสก์ทั้งหมดในวันนี้ แต่ รอไขมันฟรีนมครึ่งโทรศัพท์ 1022 00:51:15,920 --> 00:51:17,850 หนังสือน้ำส้ม ที่ฉันดื่มวันนี้ 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 สาย USB, ประแจ 1025 00:51:22,780 --> 00:51:24,800 >> [เล่นเพลง]