1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [เล่นเพลง] 3 00:00:11,261 --> 00:00:12,640 >> เดวิดเจลัน: ทั้งหมดขวา 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 และเพื่อให้เรามีความยินดีที่จะ ประกาศ CS50 ที่ตัวเอง Gheng 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 ตรงข้ามกับการเพิ่มเติม scribbly 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 >> โดยไม่ต้องกังวลใจต่อไป เราเริ่มที่จะปอกเปลือกกลับ 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 S ประเภท 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 และจากนั้นก็ populates ก้อนของหน่วยความจำที่ 51 00:02:09,139 --> 00:02:11,764 ด้วยตัวอักษรที่ผู้ใช้มี พิมพ์ในตามด้วยแน่นอน 52 00:02:11,764 --> 00:02:14,800 อักขระ null หรือเครื่องหมาย ศูนย์ที่ท้ายสุด 53 00:02:14,800 --> 00:02:18,280 >> ในขณะเดียวกันในด้านซ้ายมือ ในเรื่องนี้ตลอดเวลานี้ 54 00:02:18,280 --> 00:02:20,850 เราได้รับการประกาศตัวแปรเช่น S 55 00:02:20,850 --> 00:02:24,770 และตัวแปรที่เป็นสิ่งที่ตอนนี้ จะเริ่มเรียกตัวชี้ 56 00:02:24,770 --> 00:02:29,190 มันไม่ใช่กล่องภายในที่ เราใส่สตริง Daven ต่อ se 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 >> เดวิดเจลัน: แน่นอน 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 >> เดวิดเจลัน: ตัวอักษรตัวแรก ใน 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 เดวิดเจลัน: ใช่ว่า 79 00:03:12,900 --> 00:03:18,100 เครื่องหมาย 0 ช่วยให้คุณแม้ว่าใน เส้นเวลาการสำรวจสตริง 80 00:03:18,100 --> 00:03:20,400 เดินจากซ้ายไปขวา กับการห่วงหรือในขณะที่ 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 แล้วเราก็ทำถ้า S เท่ากับ เท่ากับเสื้อก็ควรจะพูดว่า 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: แน็ล 106 00:04:17,779 --> 00:04:19,529 เดวิดเจลัน: แน็, มีความสุขที่ได้พบคุณ 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 ดังนั้นเสื้อและอาจจะมี แสดงวิธีการบนหน้าจอ? 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 เดวิดเจลัน: 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 โอ้ตกลง 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 ดังนั้นมันจะใส่มันลงไปใน อยู่เเล้ไม่แน่ใจว่า 130 00:05:14,237 --> 00:05:17,320 ฉันไม่สามารถว่าจำเลขที่ แต่ผมเชื่อว่ามันก็เริ่มต้นด้วย 0 131 00:05:17,320 --> 00:05:18,420 >> เดวิดเจลัน: นั่นเป็นสิทธิทั้งหมด เพราะผมทำตัวเลขขึ้น 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 >> เดวิดเจลัน: 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 >> เดวิดเจลัน: ตกลงกลับมาให้คุณ 138 00:05:30,496 --> 00:05:33,629 >> JANELLE: ดังนั้นองค์ประกอบ 0 และ แล้วองค์ประกอบ 1 หรือ 2 องค์ประกอบ 139 00:05:33,629 --> 00:05:36,670 เดวิดเจลัน: และที่ชิ้นส่วนของ ภาพที่คุณวาดตอนนี้? 140 00:05:36,670 --> 00:05:37,690 โทรไป getString? 141 00:05:37,690 --> 00:05:38,830 หรือการประกาศของ S? 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 >> เดวิดเจลัน: ดี 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 >> เดวิดเจลัน: โดยอาร์? 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 >> เดวิดเจลัน: แน่นอน 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 เดวิดเจลัน: ใช่ 179 00:07:06,850 --> 00:07:08,516 JANELLE: หรือก็ยังอยู่ในกล่องเดียวกันได้หรือไม่ 180 00:07:08,516 --> 00:07:11,940 เดวิดเจลัน: ผมขอเสนอใช่ ว่าดังนั้นในกล่องเหล่านี้เพิ่มเติม 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 ดังนั้นถ้าเป็นกรณีที่ สิ่งที่เกิดขึ้นจะจบลงที่นี่ใน T? 186 00:07:29,955 --> 00:07:30,830 >> JANELLE: 0x10? 187 00:07:30,830 --> 00:07:31,830 เดวิดเจลัน: แน่นอน 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 ถ้า S เท่ากับเท่ากับตันสิ่งที่ฉันจริง เปรียบเทียบว่าเราได้มาที่นี่? 193 00:07:47,630 --> 00:07:49,271 >> JANELLE: สองที่อยู่? 194 00:07:49,271 --> 00:07:50,270 เดวิดเจลัน: แน่นอน 195 00:07:50,270 --> 00:07:53,350 ดังนั้นฉันพูดคือ s เท่ากับเท่ากับ 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 >> เดวิดเจลัน: ดังนั้นหาก คือ 1 และเสื้อคือ 10? 202 00:08:11,446 --> 00:08:13,320 >> JANELLE: คุณพิมพ์สิ่งที่แตกต่าง 203 00:08:13,320 --> 00:08:13,570 >> เดวิดเจลัน: แน่นอน 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 [APPLAUSE] 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 และแน่นอนเมื่อเราคงที่เจ้านี่ ซึ่งตอนนี้ผมจะเป็นตัวแทนทับด้วยสีเขียว 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 ถ้า S เท่ากับโมฆะและเสื้อเท่ากับโมฆะ 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 >> เดวิดเจลัน: แน่นอน 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 กล่าวว่ามันจะกลับมาเป็นโมฆะ ค่าแมวมองพิเศษ 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 null ที่เป็นค่าที่อันตรายมาก 230 00:09:09,720 --> 00:09:14,250 >> บ่อยครั้งที่ถ้าคุณพยายามที่จะทำอะไรกับ null ที่เกี่ยวข้องกับฟังก์ชันผ่านมัน 231 00:09:14,250 --> 00:09:17,470 เป็น input สำหรับ 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 >> เดวิดเจลัน: ใช่ ผมเปลี่ยนวินาที, เช่นเดียวกับ 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 >> หากคืออีกครั้งกรัมคำว่า A, B, E, เครื่องหมาย, 0, และ S 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 สามารถมีได้สูงสุดเพียง สี่กิกะไบต์แรม 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 เสื้อเป็นเพียงตัวชี้อื่นหรือ จริงๆดาวถ่านสตริงอาคา 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 เมื่อฉันทำสตริงทีเท่ากับ S อัฒภาค วิธีการที่ไม่ภาพนี้เปลี่ยน? 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 >> เดวิดเจลัน: ใช่ 298 00:12:42,020 --> 00:12:42,600 ว่า 299 00:12:42,600 --> 00:12:45,620 ฉันเพียงแค่ใส่ลูกศรจาก กล่องทีไปยังที่อยู่เดียวกัน 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 โดยแม้ว่าเสื้อเป็น ตัวชี้หรือคือตัวชี้ 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 เพียงเพื่อแสดงว่า s แน่นอน ดาวถ่านเพียงคำพ้องความหมาย 320 00:13:41,170 --> 00:13:43,540 และเสื้อยังเป็นดาวถ่าน 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 ทำไม heck ไม่นี้ เส้นลักษณะที่ซับซ้อนเพื่อ? 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 มันเป็นสิ่งที่จัดเก็บใน T? 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 >> เดวิดเจลัน: ที่สมบูรณ์แบบ 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 เดวิดเจลัน: แน่นอน 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 เดวิดเจลัน: แน่นอน 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 >> ในขณะเดียวกันก็จะสุด ทางทวารหนั​​กฉันมี 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 >> ตอนนี้ในขณะที่ผมไปข้างหน้าและคัดลอก สตริง, เสื้อตัวฉันเท่ากับเสื้อวงเล็บ S 366 00:15:11,490 --> 00:15:14,962 และพ่อท่านคล้อยสัปดาห์สุดท้ายของ รหัสแหล่งที่มาเพื่อดูสิ่งที่เกิดขึ้น 367 00:15:14,962 --> 00:15:17,670 แต่ Takeaway ที่สำคัญและ เหตุผลที่ฉันใส่รหัสตอนนี้อยู่ในสีเขียว 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 >> t เพียงเพราะสิ่งที่เป็น ที่เกิดขึ้นเวลานี้ 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 ที่มีตัวอักษรที่เกิดขึ้นจริงที่ผม ทำในสิ่งที่ห่วงมี 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 ที่ถูกหักดูเหมือนว่าเวลาที่ผ่านมา ตัวอย่างเช่น Swap นี้ฟังก์ชั่นนี้ 389 00:16:20,730 --> 00:16:23,670 ทำงานอยู่ในความรู้สึก ว่ามันเปลี่ยนและข 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 >> เดวิดเจลัน: แน่นอน 396 00:16:36,700 --> 00:16:39,530 ถ้าฉันจะเรียกใช้ฟังก์ชันนี้ จาก another-- เช่น 397 00:16:39,530 --> 00:16:42,870 จากการทำงานเช่นเดียวกับหลักที่ ฉันมีตัวแปร x, และ y เป็นฉัน 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 คือสิ่งที่เรากำลังจะ ดูหน่อยมันไม่ได้ทำงาน 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-- เรามาดูว่าฉันสามารถหา นี้ตกลง fast-- จริง [ไม่ได้ยิน] 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 ตกลงมีเป็น 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 จากครั้งล่าสุดที่ เรียกว่าตอนนี้ไม่ Swap 410 00:17:27,960 --> 00:17:30,200 >> จึงไม่มี Swap คือที่ เราซ้ายปิดครั้งสุดท้าย 411 00:17:30,200 --> 00:17:32,930 โดยผมเริ่มต้นได้ x 1 และ y 2 412 00:17:32,930 --> 00:17:35,840 จากนั้นผมก็เรียก Swap ผ่านใน 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 >> เดวิดเจลัน: ใช่ 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 หรือจริงๆพูดคุยเกี่ยวกับพวกเขาในที่ใด ๆ รายละเอียดอื่น ๆ กว่าบางที preemptively 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 อยู่ในหน่วยความจำเพื่อให้ Swap สามารถทำตามแผนที่ที่ 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 >> ดังนั้น Swap ต้องเปลี่ยนเล็กน้อยเกินไป 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 ดังนั้นจึงเป็น int 446 00:19:01,620 --> 00:19:04,880 >> ดังนั้นไม่ int, มันเป็นที่อยู่ของ int 447 00:19:04,880 --> 00:19:07,910 และในทำนองเดียวกันขอยู่ในขณะนี้ไป ให้เป็นที่อยู่ของ int 448 00:19:07,910 --> 00:19:12,470 ดังนั้นเมื่อผมตอนนี้เรียก Swap จากหลัก ฉันจะไม่ให้สลับที่ 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 >> เดวิดเจลัน: แน่นอน 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 >> ในทำนองเดียวกันอุณหภูมิ int เป็นเพียง int 475 00:20:19,272 --> 00:20:20,730 ไม่มีอะไรที่ต้องเปลี่ยนเกี่ยวกับอุณหภูมิ 476 00:20:20,730 --> 00:20:24,810 มันเป็นเพียงแก้วว่างจาก Annenberg สำหรับนมหรือน้ำผลไม้สีส้ม 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 ถาดที่สองนี้แสดงให้เห็นถึงการแลกเปลี่ยนเมื่อ ฉันผ่านเครื่องหมาย x และเครื่องหมายปี 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 เดวิดเจลัน: แน่นอน 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 Oxford Street 35 Oxford Street และคุณ 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 ที่ไหนในโลกที่สามารถ คุณจะพบว่าทั้งสอง ints? 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 และเรียก ./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 สิ่งที่ฉันควรจะเห็นที่นี่? 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 >> เดวิดเจลันดังนั้น ตัวเลขสุ่มอาจจะ 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 พิมพ์ต่อไปและจากนั้นพิมพ์ x มีที่ บรรทัดของรหัสสาย 19, ถูกประหารชีวิต 517 00:22:06,280 --> 00:22:10,942 >> ขณะเดียวกันถ้าฉันพิมพ์ต่อไปอีกครั้งและ ตอนนี้พิมพ์ออกมาปีนี้ผมกำลังจะไปดู 2 518 00:22:10,942 --> 00:22:13,900 ตอนนี้ถ้าฉันพิมพ์ต่อไปมันจะ ได้รับความสับสนเล็กน้อยเพราะตอนนี้ 519 00:22:13,900 --> 00:22:17,250 printf จะปรากฏบน หน้าจอขณะที่มันทำ x 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 ก่อนที่ผมจะเรียก Swap หรือแม้กระทั่งขั้นตอนที่ เป็นมันลองมาแอบมองเล็ก ๆ น้อย ๆ 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 มันเป็นตัวชี้ไปยัง 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 ที่ int ของคุณอยู่ที่ใด อยู่ที่ว่าใหญ่ 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 ถ้าผมชนิด b ก็เหมือนกัน ไปยังที่อยู่ของ y 555 00:23:52,130 --> 00:23:57,020 ดังนั้นสิ่งที่ฉันควรจะดูว่าฉัน บอกว่าให้ไปที่ที่อยู่ได้หรือไม่ 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 ดังนั้นรุ่นของ Swap นี้ คือตอนที่ถูกต้องและช่วยให้ 565 00:24:23,850 --> 00:24:26,650 เราจะแลกเปลี่ยนข้อมูลชนิดนี้โดยเฉพาะ 566 00:24:26,650 --> 00:24:29,120 >> ดังนั้นคำถามใด ๆ แล้วใน Swap? 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 มันประกาศ int เรียกว่า x 591 00:25:28,920 --> 00:25:30,850 มันบอกว่าสิ่งที่ต้องการจำนวนโปรด 592 00:25:30,850 --> 00:25:33,940 และตอนนี้ก็กล่าวว่า scanf% i & x 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 ซึ่งหมายความว่า ผู้ใช้สามารถพิมพ์ int 599 00:25:49,410 --> 00:25:52,820 และตอนนี้ทำไมคุณคิดว่าฉัน อาจจะมีการผ่าน scanf และ x? 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 เดวิดเจลัน: แน่นอน 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 แต่ถ้าแทนคุณทำไม่ได้ ให้ฉัน int จริง 614 00:26:32,560 --> 00:26:36,640 แต่คุณให้ฉันเส้นทางไป int ที่ตอนนี้ผมเป็น 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 แฮะ 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 แต่ผมไม่ได้ประกาศว่า int เวลานี้ 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 ถ้า% s ผ่านและบัฟเฟอร์ ซึ่งเป็นที่อยู่? 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 >> เดวิดเจลัน: แน่นอน 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 buffer โดยปริยายหรือไม่? 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 ไม่ว่าสิ่งนี้จะชี้ ยา่และฉันวาดเครื่องหมายคำถาม 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 >> ดังนั้นถ้าผมพิมพ์ในเกบตอนนี้มันจะ เพื่อพยายามที่จะนำ G--b-e / 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 เดวิดเจลัน: ดี 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 >> ดังนั้นโปรแกรมนี้ ทั้งหมดปลอดภัยถ้าฉันพิมพ์ 700 00:30:25,440 --> 00:30:29,760 ในสตริงตัวละครตัวหนึ่งในสองตัวละคร สตริงสตริง 15 ตัวอักษร 701 00:30:29,760 --> 00:30:34,970 แต่ทันทีที่ผมเริ่มพิมพ์ 16 17, 18, 1,000 สตริงตัวอักษร 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 ฉันจะเริ่มวาง A, B, C, D, 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 เดวิดเจลัน: ใช่ 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 และถ้าคุณเคยดูแลจริงๆว่าได้รับ int ทำงานที่นี่เป็นเอกสารประกอบ 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 และเหตุผลที่ฉันไม่กลับเป็นโมฆะ ว่าในทางเทคนิค null เป็นตัวชี้ 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 ทั้ง n int และถ่านค 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 และฉันรู้ว่ามีเพียงโดยไป กลับขึ้นที่นี่และพูดว่าโอ้ตกลง 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 และ int และอาจจะเป็นตัวละครอื่น 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 และ x เป็นไปจบลงที่นี่ 817 00:35:41,580 --> 00:35:43,970 แต่ฉันไม่ต้องการ x จะได้รับการเติมเต็ม 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 คือว่าเรากำลังทำ heck ของ จำนวนมากของข้อผิดพลาดการตรวจสอบเช่นนี้เพื่อให้ 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 เป็นแหล่งที่มาของข้อผิดพลาดในส่วนของคุณ โปรแกรมเพราะเรา defensively 827 00:36:13,300 --> 00:36:16,270 การตรวจสอบสำหรับทุกโง่ สิ่งที่ผู้ใช้อาจจะทำ 828 00:36:16,270 --> 00:36:18,900 เช่นการพิมพ์สตริงเมื่อ คุณต้องการ int จริงๆ 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 ในขณะที่คุณอาจจำจากบิงกี้ล่าสุด 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 >> เดวิดเจลัน: ตกลงคุณกำลังสร้าง ที่อยู่สำหรับ 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 เดวิดเจลัน: ดี 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 ที่มีค่าขยะบาง ในนั้นเรียกมันว่าปี 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 >> ดังนั้นเมื่อบิงกี้ทำอย่างนี้ ดินเพียงแค่มองเช่นนี้ 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 >> เดวิดเจลัน: ที่สมบูรณ์แบบ 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 >> เดวิดเจลัน: และกำหนด ให้ตัวแปร 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 >> ดังนั้นสิ่งที่นิคได้เป็นครั้งสุดท้ายกับบิงกี้เป็น เขาลากตัวชี้ให้เห็นว่าดินที่ 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 >> ตอนนี้บรรทัดถัดไปของรหัส ทำอย่างนี้ได้รับดาว x 42 890 00:38:55,310 --> 00:38:58,530 ดังนั้น 42 ตรงไปตรงมาเกี่ยวกับ ด้านขวามือ, ความหมายของชีวิต 891 00:38:58,530 --> 00:39:00,500 ด้านซ้ายมือดาว x หมายถึงอะไร 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 ที่มากเกินไปอาจมี gone-- ที่ตกลง 894 00:39:03,280 --> 00:39:04,220 ตกลง 895 00:39:04,220 --> 00:39:06,875 >> ผู้ชม: โดยทั่วไป ไปที่ [ไม่ได้ยิน] 896 00:39:06,875 --> 00:39:07,750 เดวิดเจลัน: ดี 897 00:39:07,750 --> 00:39:08,760 ผู้ชม: [ไม่ได้ยิน] 898 00:39:08,760 --> 00:39:09,760 เดวิดเจลัน: แน่นอน 899 00:39:09,760 --> 00:39:11,979 ด้านซ้ายมือหมายถึงการไปที่ x 900 00:39:11,979 --> 00:39:12,520 x คือที่อยู่ 901 00:39:12,520 --> 00:39:15,520 มันก็เหมือนกับ 33 Oxford Street หรือ OX1 902 00:39:15,520 --> 00:39:18,690 และดาว x หมายถึงการไปที่ ที่อยู่และนำสิ่งที่มี? 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 บิงกี้จะสูญเสียหัวของเขา 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 และเร็วที่สุดเท่าที่คุณพยายามที่จะ ทำ Y ดาวบอกว่าไปที่นั่น 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 และหัวบิงกี้เป็นไป ที่จะบินออกจากที่นี่เท่าที่จะทำได้ 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 แต่ถ้าเราจะแก้ไขปัญหานี้สิ่งที่ ผลกระทบไม่ทำ Y x เท่ากับมี? 927 00:40:26,170 --> 00:40:30,010 ดีก็เป็นหลักชี้ปีที่ สิ่งที่ค่า x จะชี้ไปที่ 928 00:40:30,010 --> 00:40:32,430 >> ดังนั้นในเรื่องของนิค หรือเรื่องราวของบิงกี้ทั้ง 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 เมื่อมันเกิดขึ้นก่อนที่คุณจะ ที่ได้รับมอบหมายจริง Y ค่าบางอย่าง 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 ให้ฉันไปข้างหน้าและเปิด ขึ้นหน้าต่าง terminal ที่นี่ 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 ดังนั้นในมือข้างหนึ่ง ตรงนี้และแจ้งให้เราทำให้ 952 00:41:29,840 --> 00:41:32,680 นี้สอดคล้องกับก่อนหน้านี้ ยกตัวอย่างในมือข้างหนึ่ง 953 00:41:32,680 --> 00:41:35,830 ด้านซ้ายมือเป็น ทำในสิ่งที่ในภาษาอังกฤษได้ไหม 954 00:41:35,830 --> 00:41:36,493 มันค่าเท่าใด 955 00:41:36,493 --> 00:41:37,701 ผู้ชม: การสร้างตัวชี้ 956 00:41:37,701 --> 00:41:40,830 เดวิดเจลัน: การสร้างตัวชี้ เป็น int และเรียกมันว่า x 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 และฉันรู้ว่าเพียงเพราะฉันรู้ว่า int ในเครื่อง 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 ints ที่ 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 มันจะช่วยให้คุณหนึ่งก้อนของหน่วยความจำ ติดกันจากการดำเนินงาน 972 00:42:14,220 --> 00:42:15,240 ระบบ 973 00:42:15,240 --> 00:42:18,500 >> ตอนนี้สิ่งที่เกี่ยวกับเรื่องนี้ x 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 แต่ก็เป็นที่น่าสนใจ เพราะ x วงเล็บ 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 >> เดวิดเจลัน: x วงเล็บ 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 ints รวม 986 00:42:45,120 --> 00:42:48,790 40 ไบต์ แต่ 10 ints, การจัดทำดัชนี 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 และอื่น ๆ เพียงเพื่อแสดงให้เห็นถึง เจ้านี่และตรงไปตรงมา 995 00:43:07,706 --> 00:43:11,000 ที่คุณไม่เคยรู้ว่าก่อนที่คุณจะ พูดไปไม่ให้ทำงานนี้ 996 00:43:11,000 --> 00:43:12,480 มันไม่ได้ผิดพลาดจริง 997 00:43:12,480 --> 00:43:15,032 >> แต่ถ้าผมเปลี่ยนนี้สำหรับ เช่นจะเป็นเหมือน 1,000 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 ตกลงมันไม่ได้ผิดพลาด 1001 00:43:20,070 --> 00:43:22,600 วิธีการเกี่ยวกับ 100,000? 1002 00:43:22,600 --> 00:43:25,000 ลองรีเมคมันและตอนนี้มันวิ่ง 1003 00:43:25,000 --> 00:43:25,500 ตกลง 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 เป็นโปรแกรมที่จะช่วยให้ คุณไม่ได้แก้ปัญหาโปรแกรมต่อ se 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 ระบบมากขึ้นและมากขึ้น หน่วยความจำสำหรับสตริงและ whatnot, 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 แต่ถ้าคุณเคยใช้ Mac ของคุณหรือ เครื่องคอมพิวเตอร์ของคุณสำหรับค่อนข้างบางเวลาเปิด 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 จาก memory.c 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 ไม่ล้น int แต่บัฟเฟอร์ 1075 00:46:40,740 --> 00:46:43,490 และกันชนเป็นเพียงวิธีแฟนซี ที่บอกว่ามันเป็นพวงของหน่วยความจำ 1076 00:46:43,490 --> 00:46:46,710 >> และแน่นอนฉันเรียกว่าสตริง ก่อนที่จะบัฟเฟอร์แทนที่จะ S 1077 00:46:46,710 --> 00:46:49,234 เพราะถ้ามันเป็นกันชน เหมือนในความรู้สึก YouTube, 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 และฟังก์ชั่นที่, F, ขึ้นที่นี่มี อาร์เรย์ถ่านที่เรียกว่าค, ขนาด 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 ที่แป้นพิมพ์ที่สร้างขึ้นอย่างมากเป็นพิเศษ สตริงไม่ abc, 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 ที่มีความเสี่ยงเช่นเดียวกัน, daresay, เขาหรือเธอในที่สุดสามารถลบทั้งหมด 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 >> [เล่นเพลง] 1118 00:48:54,754 --> 00:48:57,790 >> ลำโพง: และตอนนี้ลึก ความคิดโดย Daven อัม 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