1 00:00:00,000 --> 00:00:03,381 >> [เล่นเพลง] 2 00:00:03,381 --> 00:00:10,626 3 00:00:10,626 --> 00:00:11,610 >> [วิดีโอเล่นภาพ] 4 00:00:11,610 --> 00:00:13,640 >> -เขาโกหก. 5 00:00:13,640 --> 00:00:14,380 >> -เกี่ยวกับอะไร? 6 00:00:14,380 --> 00:00:17,182 >> -I ไม่ทราบ 7 00:00:17,182 --> 00:00:19,990 >> งั้นสิ่งที่เรารู้หรือไม่? 8 00:00:19,990 --> 00:00:23,145 >> ใช่หรือไม่เพราะที่ 09:15 เรย์ Santoya อยู่ที่ตู้เอทีเอ็ม 9 00:00:23,145 --> 00:00:23,644 -Yeah 10 00:00:23,644 --> 00:00:27,030 ดังนั้นคำถามคือสิ่งที่ เขาก็ทำอยู่ที่ 09:16? 11 00:00:27,030 --> 00:00:29,720 >> -Shooting 9 มิลลิเมตรที่บางสิ่งบางอย่าง 12 00:00:29,720 --> 00:00:31,540 บางทีเขาอาจจะเห็นมือปืน 13 00:00:31,540 --> 00:00:33,412 >> -Or ได้ทำงานร่วมกับเขา 14 00:00:33,412 --> 00:00:34,340 >> cmd- รอ 15 00:00:34,340 --> 00:00:36,200 กลับหนึ่ง 16 00:00:36,200 --> 00:00:36,975 >> -คุณเห็นอะไร? 17 00:00:36,975 --> 00:00:44,400 18 00:00:44,400 --> 00:00:47,805 >> -Bring ใบหน้าของเขาขึ้นมาแบบเต็มหน้าจอ 19 00:00:47,805 --> 00:00:48,680 >> แว่นตา -His 20 00:00:48,680 --> 00:00:50,060 >> -There สะท้อนเป็น 21 00:00:50,060 --> 00:01:00,455 22 00:01:00,455 --> 00:01:02,280 >> -It เป็นทีมเบสบอล Nuevitas 23 00:01:02,280 --> 00:01:03,110 นั่นเป็นโลโก้ของพวกเขา 24 00:01:03,110 --> 00:01:05,820 >> และอื่นเขาพูดคุยกับ ใครก็ตามที่สวมแจ็คเก็ตที่ 25 00:01:05,820 --> 00:01:06,670 >> [จบเล่นภาพ] 26 00:01:06,670 --> 00:01:07,628 >> DAVID ลัน: สิทธิทั้งหมด 27 00:01:07,628 --> 00:01:11,210 นี่คือ CS50 และนี่คืออีกเล็กน้อย ของ [ไม่ได้ยิน] กับที่คุณ 28 00:01:11,210 --> 00:01:12,890 เล่นน้ำที่มีปัญหาตั้งสี่ 29 00:01:12,890 --> 00:01:16,606 วันนี้เราเริ่มมองเล็ก ๆ น้อย ๆ อย่างลึกซึ้งในสิ่งเหล่านี้เรียกว่าตัวชี้ 30 00:01:16,606 --> 00:01:18,480 ซึ่งแม้ว่าจะเป็น หัวข้อความลับสวย 31 00:01:18,480 --> 00:01:20,813 ปรากฎว่ามันจะ จะเป็นวิธีการที่เรา 32 00:01:20,813 --> 00:01:24,320 สามารถเริ่มต้นสร้างและประกอบ โปรแกรมที่มีความซับซ้อนมากขึ้น 33 00:01:24,320 --> 00:01:28,150 แต่เราไม่ได้ในวันพุธ โดยวิธีการ claymation บางครั้งแรก 34 00:01:28,150 --> 00:01:30,190 ดังนั้นการเรียกคืนเป็น บิงกี้และเราใช้เขา 35 00:01:30,190 --> 00:01:33,148 ที่จะดูที่โปรแกรมที่ ไม่ได้จริงๆทำอะไรที่น่าสนใจ 36 00:01:33,148 --> 00:01:34,950 แต่มันก็แสดงให้เห็นถึงปัญหาที่เกิดขึ้นไม่กี่ 37 00:01:34,950 --> 00:01:38,570 เพื่อที่จะเริ่มต้นในวันนี้ทำไมเราไม่เดิน ได้อย่างรวดเร็วผ่านไม่กี่ขั้นตอนเหล่านี้ 38 00:01:38,570 --> 00:01:41,920 พยายามที่จะสกัดลงในแง่ของมนุษย์ ว่าสิ่งที่เกิดขึ้นที่นี่ 39 00:01:41,920 --> 00:01:45,410 และเหตุผลนี้ไม่ดีและจากนั้นย้ายไป และที่จริงเริ่มต้นสร้างบางสิ่งบางอย่าง 40 00:01:45,410 --> 00:01:46,309 ด้วยเทคนิคนี้หรือไม่? 41 00:01:46,309 --> 00:01:48,350 ดังนั้นเหล่านี้เป็นครั้งแรก สองบรรทัดในโปรแกรมนี้ 42 00:01:48,350 --> 00:01:51,340 และในแง่คนธรรมดาของสิ่งที่ กำลังทั้งสองสายทำ? 43 00:01:51,340 --> 00:01:55,600 คนที่สะดวกสบายพอสมควร กับสิ่งที่ประกาศบนหน้าจอ? 44 00:01:55,600 --> 00:01:58,340 45 00:01:58,340 --> 00:02:00,120 สิ่งที่ทั้งสองสายทำ? 46 00:02:00,120 --> 00:02:02,070 มันไม่ได้ทั้งหมดที่ แตกต่างจากหนึ่งสัปดาห์ 47 00:02:02,070 --> 00:02:03,611 แต่มีบางสัญลักษณ์พิเศษใหม่ 48 00:02:03,611 --> 00:02:04,152 ใช่? 49 00:02:04,152 --> 00:02:05,628 มีกลับ 50 00:02:05,628 --> 00:02:07,092 >> ผู้ชม: ประกาศตัวชี้? 51 00:02:07,092 --> 00:02:08,050 DAVID ลัน: Say อีกครั้งหรือไม่ 52 00:02:08,050 --> 00:02:08,860 ผู้ชม: ประกาศตัวชี้? 53 00:02:08,860 --> 00:02:11,776 DAVID ลัน: ชี้และประกาศ ขอปรับแก้นิด ๆ หน่อย ๆ 54 00:02:11,776 --> 00:02:14,050 ผู้ชม: [ไม่ได้ยิน] ที่อยู่ x y ที่แล้ว 55 00:02:14,050 --> 00:02:15,300 DAVID ลัน: และแล้วอยู่ 56 00:02:15,300 --> 00:02:18,550 ดังนั้นเฉพาะสิ่งที่เรากำลังทำ คือเราจะประกาศตัวแปรทั้งสอง 57 00:02:18,550 --> 00:02:21,252 ตัวแปรเหล่านี้แม้ว่าจะ จะเป็นชนิด int ดาวซึ่ง 58 00:02:21,252 --> 00:02:23,210 มากขึ้นโดยเฉพาะหมายถึง พวกเขาจะไปจัดเก็บ 59 00:02:23,210 --> 00:02:26,450 ที่อยู่ของ int ที่, ตามลำดับ x และ y 60 00:02:26,450 --> 00:02:27,660 ตอนนี้จะมีค่าใด ๆ 61 00:02:27,660 --> 00:02:32,621 มีที่อยู่ที่แท้จริงใด ๆ ในเหล่านี้ สองตัวแปรที่จุดในเวลานี้หรือไม่? 62 00:02:32,621 --> 00:02:33,120 เลขที่ 63 00:02:33,120 --> 00:02:35,030 มันเป็นเพียงแค่สิ่งที่เรียกว่าค่าขยะ 64 00:02:35,030 --> 00:02:38,120 หากคุณไม่ได้จริงกำหนด ตัวแปรสิ่งที่อยู่ในหน่วยความจำ 65 00:02:38,120 --> 00:02:42,224 ก่อนหน้านี้เป็นไปเพื่อเติมเลขศูนย์ และคนทั้งสองตัวแปรเหล่านั้น 66 00:02:42,224 --> 00:02:44,140 แต่เรายังไม่ทราบ สิ่งที่พวกเขาและนั่นคือ 67 00:02:44,140 --> 00:02:47,060 จะเป็นกุญแจสำคัญในการทำไมบิงกี้ หายไปหัวของเขาเมื่อสัปดาห์ที่แล้ว 68 00:02:47,060 --> 00:02:49,980 >> ดังนั้นนี่เป็น claymation ชาตินี้ 69 00:02:49,980 --> 00:02:53,580 โดยคุณมีเวลาเพียงสองตัวแปร ชิ้นวงกลมเล็ก ๆ น้อย ๆ ของดิน 70 00:02:53,580 --> 00:02:57,330 ที่สามารถจัดเก็บตัวแปร แต่เป็น ลูกศรห่อแนะนำ 71 00:02:57,330 --> 00:03:00,640 พวกเขาไม่ได้จริงชี้ ไปทุกที่ที่รู้จักกันต่อ 72 00:03:00,640 --> 00:03:03,670 ดังนั้นแล้วเรามีบรรทัดนี้และนี้ เป็นสัปดาห์ที่ผ่านมาใหม่ malloc สำหรับหน่วยความจำ 73 00:03:03,670 --> 00:03:07,130 การจัดสรรซึ่งเป็นเพียงวิธีแฟนซี บอกระบบปฏิบัติการลีนุกซ์ 74 00:03:07,130 --> 00:03:09,750 หรือ Mac OS หรือ Windows, เดี๋ยวก่อนให้ฉันหน่วยความจำบางส่วน 75 00:03:09,750 --> 00:03:11,780 และสิ่งที่คุณต้องบอก ระบบปฏิบัติการ 76 00:03:11,780 --> 00:03:14,699 คือสิ่งที่เมื่อถามมันสำหรับหน่วยความจำ 77 00:03:14,699 --> 00:03:16,990 มันจะไม่สนใจสิ่งที่ คุณจะทำอย่างไรกับมัน 78 00:03:16,990 --> 00:03:19,786 แต่คุณไม่จำเป็นต้องบอกปฏิบัติการ สิ่งที่ระบบโดยวิธีการ malloc 79 00:03:19,786 --> 00:03:20,286 ใช่? 80 00:03:20,286 --> 00:03:21,078 >> ผู้ชม: เท่าไหร่? 81 00:03:21,078 --> 00:03:21,994 DAVID ลัน: เท่าไหร่? 82 00:03:21,994 --> 00:03:25,280 เท่าไหร่ในไบต์และเป็นเช่นนี้อีกครั้ง เป็นตัวอย่างที่วางแผนไว้เป็นเพียงแค่ว่า 83 00:03:25,280 --> 00:03:27,360 ให้ฉันขนาดของ int ที่ 84 00:03:27,360 --> 00:03:30,550 ตอนนี้ขนาดของ int ที่ สี่ไบต์หรือ 32 บิต 85 00:03:30,550 --> 00:03:32,850 ดังนั้นนี่เป็นเพียงวิธีการของ ว่าเดี๋ยวก่อนระบบปฏิบัติการ 86 00:03:32,850 --> 00:03:37,290 ให้ฉันสี่ไบต์ของหน่วยความจำ ที่ฉันสามารถใช้ในการกำจัดของฉัน 87 00:03:37,290 --> 00:03:40,560 และโดยเฉพาะสิ่งที่ไม่ ผลตอบแทน malloc ด้วยความเคารพ 88 00:03:40,560 --> 00:03:41,795 เพื่อก้อนสี่ไบต์ที่? 89 00:03:41,795 --> 00:03:44,110 90 00:03:44,110 --> 00:03:44,860 ผู้ชม: อยู่? 91 00:03:44,860 --> 00:03:45,901 DAVID ลัน: ที่อยู่ 92 00:03:45,901 --> 00:03:47,580 ที่อยู่ของก้อนสี่ไบต์ที่ 93 00:03:47,580 --> 00:03:48,190 ที่แน่นอน 94 00:03:48,190 --> 00:03:51,430 และเพื่อให้เป็นสิ่งที่เก็บไว้ในท้ายที่สุดได้ ใน x และที่ว่าทำไมเราทำไม่ได้จริงๆ 95 00:03:51,430 --> 00:03:55,240 สนใจสิ่งที่จำนวนว่า ที่อยู่ไม่ว่าจะเป็น OX1 หรือ OX2 96 00:03:55,240 --> 00:03:57,110 หรือบางคนที่อยู่เลขฐานสิบหกที่เป็นความลับ 97 00:03:57,110 --> 00:03:59,850 เพียงแค่เราดูแล pictorially ที่ตัวแปร x ที่ตอนนี้ 98 00:03:59,850 --> 00:04:01,630 ชี้ไปที่ก้อนของหน่วยความจำที่ 99 00:04:01,630 --> 00:04:05,570 ดังนั้นลูกศรหมายถึงตัวชี้หรือ โดยเฉพาะอย่างยิ่งที่อยู่หน่วยความจำ 100 00:04:05,570 --> 00:04:09,120 แต่อีกครั้งที่เราไม่สนใจโดยทั่วไป สิ่งที่เกิดขึ้นจริงที่อยู่เหล่านี้ 101 00:04:09,120 --> 00:04:11,780 ตอนนี้สายนี้กล่าวว่า สิ่งที่ในแง่ของคนธรรมดา? 102 00:04:11,780 --> 00:04:14,330 ได้รับดาว x 42 อัฒภาค 103 00:04:14,330 --> 00:04:17,390 สิ่งนี้หมายความว่า? 104 00:04:17,390 --> 00:04:18,200 คุณต้องการไป? 105 00:04:18,200 --> 00:04:20,102 และไม่ควรเกาคอของคุณ 106 00:04:20,102 --> 00:04:22,360 >> ผู้ชม: อยู่ของ x อยู่ที่ 42 107 00:04:22,360 --> 00:04:24,300 >> DAVID ลัน: อยู่ของ x อยู่ที่ 42 108 00:04:24,300 --> 00:04:25,190 ไม่มาก 109 00:04:25,190 --> 00:04:28,485 เพื่อให้ใกล้เคียง แต่ไม่มากเพราะมี ดาวที่ prefixing x นี้ 110 00:04:28,485 --> 00:04:29,860 ดังนั้นเราจึงต้องปรับแต่งนิด ๆ หน่อย ๆ 111 00:04:29,860 --> 00:04:31,032 ใช่? 112 00:04:31,032 --> 00:04:36,044 >> ผู้ชม: ค่าที่ได้ ตัวชี้ x จะชี้ไปที่ 42 113 00:04:36,044 --> 00:04:36,710 DAVID ลัน: OK 114 00:04:36,710 --> 00:04:40,840 ค่าที่ x เป็นตัวชี้ ชี้ไปที่สมมติว่าจะเป็น 42, 115 00:04:40,840 --> 00:04:44,165 หรือใส่อีกทางหนึ่งดาว x บอกว่าให้ไปที่สิ่งที่อยู่ 116 00:04:44,165 --> 00:04:48,340 อยู่ใน x ไม่ว่าจะเป็นฟอร์ด 1 ถนนหรือ 33 Oxford Street 117 00:04:48,340 --> 00:04:51,850 หรือ OX1 ox33 หรืออะไรก็ตาม ว่าที่อยู่ที่เป็นตัวเลขคือ 118 00:04:51,850 --> 00:04:54,380 ดาว x เป็น dereferencing ของ x 119 00:04:54,380 --> 00:04:57,297 เพื่อไปที่ที่อยู่และ แล้วใส่หมายเลข 42 มี 120 00:04:57,297 --> 00:04:59,380 เพื่อที่จะเป็น วิธีที่เทียบเท่ากับการบอกว่า 121 00:04:59,380 --> 00:05:01,860 ดังนั้นนั่นคือทั้งหมดที่ดีและจากนั้น เราจะเป็นตัวแทนของภาพ 122 00:05:01,860 --> 00:05:05,370 ดังต่อไปนี้ที่เราได้เพิ่ม 42 ไปก้อนที่สี่ 123 00:05:05,370 --> 00:05:09,370 ไบต์บนด้านขวามือ แต่ บรรทัดนี้เป็นสิ่งที่ผิดพลาดไป 124 00:05:09,370 --> 00:05:11,120 และหัวหน้าของบิงกี้โผล่ ออกที่จุดนี้ 125 00:05:11,120 --> 00:05:15,290 เพราะสิ่งที่ไม่ดีเกิดขึ้นเมื่อ คุณ dereference ค่าขยะ 126 00:05:15,290 --> 00:05:18,210 หรือคุณ dereference ที่ไม่ถูกต้อง ชี้และผมพูดไม่ถูกต้อง 127 00:05:18,210 --> 00:05:21,020 เพราะที่จุดในนี้ เรื่องสิ่งที่อยู่ภายในของ Y? 128 00:05:21,020 --> 00:05:24,440 มีอะไรค่า y ตาม ในไม่กี่ขั้นตอนที่ผ่านมา? 129 00:05:24,440 --> 00:05:25,360 ใช่? 130 00:05:25,360 --> 00:05:26,115 นั่นอะไร? 131 00:05:26,115 --> 00:05:26,990 >> ผู้ชม: อยู่ 132 00:05:26,990 --> 00:05:28,460 DAVID ลัน: อยู่ 133 00:05:28,460 --> 00:05:31,910 มันควรจะอยู่ แต่ผมเริ่มต้นได้หรือไม่ 134 00:05:31,910 --> 00:05:32,800 ดังนั้นผมจึงยังไม่ได้ 135 00:05:32,800 --> 00:05:35,430 ดังนั้นสิ่งที่เป็นที่รู้จักกันที่จะอยู่ในที่นั่น? 136 00:05:35,430 --> 00:05:37,590 มันเป็นเพียงค่าขยะบางอย่าง 137 00:05:37,590 --> 00:05:41,500 มันอาจจะเป็นที่อยู่ใด ๆ จากศูนย์ถึง 2 พันล้านถ้าคุณมีสองกิ๊กแรม 138 00:05:41,500 --> 00:05:44,289 หรือศูนย์ถึง 4 พันล้านถ้าคุณได้ มีสี่กิกะไบต์แรม 139 00:05:44,289 --> 00:05:46,080 มันเป็นค่าขยะบางอย่าง แต่ปัญหาคือ 140 00:05:46,080 --> 00:05:48,200 ที่ระบบปฏิบัติการ ถ้ามันไม่ได้ให้คุณ 141 00:05:48,200 --> 00:05:51,140 ก้อนของหน่วยความจำที่เฉพาะ ว่าคุณกำลังพยายามที่จะไปถึง 142 00:05:51,140 --> 00:05:54,650 โดยทั่วไปก็จะทำให้เกิดสิ่งที่ เราได้เห็นเป็นความผิดส่วน 143 00:05:54,650 --> 00:05:57,810 ดังนั้นในความเป็นจริงใด ๆ ของคุณที่มี พยายามที่ปัญหาในเวลาทำการ 144 00:05:57,810 --> 00:06:00,393 หรือปัญหาที่มากขึ้น โดยทั่วไปกับการพยายามที่จะคิดออก 145 00:06:00,393 --> 00:06:02,150 ความผิดส่วนหนึ่ง ที่โดยทั่วไปหมายถึง 146 00:06:02,150 --> 00:06:05,017 คุณจะสัมผัสส่วนของ หน่วยความจำที่คุณไม่ควรจะ 147 00:06:05,017 --> 00:06:07,350 คุณสัมผัสหน่วยความจำที่ ระบบปฏิบัติการที่ไม่ได้ 148 00:06:07,350 --> 00:06:10,450 ได้รับอนุญาตให้คุณไปสัมผัสไม่ว่าจะเป็น โดยไปไกลเกินไปในอาร์เรย์ของคุณ 149 00:06:10,450 --> 00:06:12,870 หรือเริ่มต้นในขณะนี้ไม่ว่าจะเป็น มันเป็นเพราะคุณสัมผัส 150 00:06:12,870 --> 00:06:14,780 หน่วยความจำที่เป็นเพียงแค่ค่าขยะบางอย่าง 151 00:06:14,780 --> 00:06:18,230 >> ดังนั้นการทำดาว x นี่ การเรียงลำดับของพฤติกรรมที่ไม่ได้กำหนด 152 00:06:18,230 --> 00:06:22,030 คุณไม่ควรทำเพราะราคาต่อรอง มีการโปรแกรมที่เพิ่งจะผิดพลาด 153 00:06:22,030 --> 00:06:24,050 เพราะคุณกำลังจะบอกว่า ไปยังที่อยู่นี้ 154 00:06:24,050 --> 00:06:27,000 และคุณมีความคิดที่ไม่มี ที่อยู่ที่เป็นจริง 155 00:06:27,000 --> 00:06:30,300 ดังนั้นระบบปฏิบัติการที่มีแนวโน้ม จะผิดพลาดโปรแกรมของคุณ 156 00:06:30,300 --> 00:06:33,840 เป็นผลมาและแน่นอนว่าเป็น สิ่งที่เกิดขึ้นมีการบิงกี้ 157 00:06:33,840 --> 00:06:37,210 ดังนั้นในท้ายที่สุดคงบิงกี้ ปัญหานี้กับเรื่องนี้ 158 00:06:37,210 --> 00:06:38,909 ดังนั้นโปรแกรมเองว่ามีข้อบกพร่อง 159 00:06:38,909 --> 00:06:41,450 แต่ถ้าคุณเรียงลำดับของการเคลื่อนไปข้างหน้า และดำเนินการสายนี้แทน 160 00:06:41,450 --> 00:06:45,580 ปีเท่ากับ x ก็หมายความว่าสิ่งที่ อยู่เป็น x ยังวางไว้ในปี 161 00:06:45,580 --> 00:06:48,740 >> และเพื่อ pictorially เราได้ เป็นตัวแทนของทั้งสองนี้กับลูกศร 162 00:06:48,740 --> 00:06:51,570 จาก x และ y ที่ชี้จาก ไปยังสถานที่เดียวกัน 163 00:06:51,570 --> 00:06:55,760 ดังนั้นความหมาย x เท่ากับ จะวายเพราะทั้งสองของคนเหล่านั้น 164 00:06:55,760 --> 00:07:00,300 เก็บเดียวกัน ที่อยู่เพราะฉะนั้นชี้ไปที่ 42, 165 00:07:00,300 --> 00:07:04,910 และตอนนี้เมื่อคุณบอกว่าดาว y ที่ไปอยู่ใน Y, 166 00:07:04,910 --> 00:07:06,790 นี้มีผลข้างเคียงที่น่าสนใจ 167 00:07:06,790 --> 00:07:10,320 ดังนั้นที่อยู่ใน y ที่เป็น สิ่งเดียวกับที่อยู่ใน x 168 00:07:10,320 --> 00:07:15,060 ดังนั้นถ้าคุณพูดไปยังที่อยู่ที่ ใน Y และเปลี่ยนค่าเป็น 13 169 00:07:15,060 --> 00:07:17,140 ใครได้รับผลกระทบ? 170 00:07:17,140 --> 00:07:21,100 X คือ D จุดเพื่อที่จะพูด ควรจะได้รับผลกระทบเช่นกัน 171 00:07:21,100 --> 00:07:24,340 >> และแน่นอนว่านิควาดภาพนี้ ใน claymation เป็นสิ่งที่ 172 00:07:24,340 --> 00:07:28,665 แม้ว่าเราทำตามตัวชี้ y ที่เราจบลงด้วยการอยู่ในสถานที่เดียวกัน 173 00:07:28,665 --> 00:07:32,780 และอื่น ๆ ถ้าเราจะพิมพ์ ออก x หรือ y ที่ pointee ของ 174 00:07:32,780 --> 00:07:35,720 แล้วเราจะเห็นคุณค่าของ 13 175 00:07:35,720 --> 00:07:37,927 ตอนนี้ผมพูด pointee จะเป็น สอดคล้องกับวิดีโอ 176 00:07:37,927 --> 00:07:39,760 โปรแกรมเมอร์ของฉัน ความรู้ไม่จริง 177 00:07:39,760 --> 00:07:42,460 pointee พูดคำว่า ที่ซึ่งเป็นแหลม 178 00:07:42,460 --> 00:07:44,650 ที่ แต่เพื่อความมั่นคง กับวิดีโอที่ตระหนักถึง 179 00:07:44,650 --> 00:07:47,520 นั่นคือทั้งหมดที่ได้รับ หมายความว่าในสถานการณ์ที่ 180 00:07:47,520 --> 00:07:54,190 ดังนั้นคำถามใด ๆ เกี่ยวกับ claymation หรือคำแนะนำหรือ malloc เพียงหรือยัง 181 00:07:54,190 --> 00:07:54,850 ไม่ได้หรือไม่ 182 00:07:54,850 --> 00:07:55,470 ทั้งหมดขวา 183 00:07:55,470 --> 00:07:58,560 >> โดยไม่ต้องต่อไป ความกังวลใจให้มาดู 184 00:07:58,560 --> 00:08:00,700 ในที่นี้มีจริง ถูกนำมาใช้เป็นบางครั้ง 185 00:08:00,700 --> 00:08:03,580 ดังนั้นเราจึงได้มีนี้ห้องสมุด CS50 ที่มีทั้งหมดของฟังก์ชันเหล่านี้ 186 00:08:03,580 --> 00:08:06,810 เราได้ใช้ GetInt มาก GetString, อาจ GetLongLong ก่อนหน้านี้ 187 00:08:06,810 --> 00:08:09,840 ใน PSet ของฉันหนึ่งหรือมากกว่านั้น แต่ สิ่งที่ถูกจริงที่เกิดขึ้น? 188 00:08:09,840 --> 00:08:12,920 ดีลองมาดูอย่างรวดเร็ว เครื่องดูดควันที่อยู่ภายใต้โปรแกรมที่ 189 00:08:12,920 --> 00:08:17,017 เป็นแรงบันดาลใจเหตุผลที่เราให้คุณ CS50 ห้องสมุดและแน่นอนขณะที่สัปดาห์ที่ผ่านมา 190 00:08:17,017 --> 00:08:18,850 เราเริ่มต้นการเหล่านั้น ล้อการฝึกอบรมออก 191 00:08:18,850 --> 00:08:21,080 ดังนั้นนี้จะถูกจัดเรียงในขณะนี้ ของการชันสูตรศพของสิ่งที่ 192 00:08:21,080 --> 00:08:23,690 มีเกิดขึ้น ภายในห้องสมุด CS50, 193 00:08:23,690 --> 00:08:27,250 แม้ว่าตอนนี้เราจะเริ่มต้นการย้าย ห่างจากมันสำหรับโปรแกรมส่วนใหญ่ 194 00:08:27,250 --> 00:08:29,460 >> ดังนั้นนี้เป็นโปรแกรมที่เรียกว่า scanf 0 195 00:08:29,460 --> 00:08:30,510 มันสั้นสุด 196 00:08:30,510 --> 00:08:33,909 มันก็มีเส้นเหล่านี้ แต่ แนะนำฟังก์ชั่นที่เรียกว่า scanf 197 00:08:33,909 --> 00:08:36,909 ที่เรากำลังจริงจะเห็นใน ขณะที่ด้านในของห้องสมุด CS50 ที่ 198 00:08:36,909 --> 00:08:38,600 แม้ว่าในรูปแบบที่แตกต่างกันเล็กน้อย 199 00:08:38,600 --> 00:08:41,330 ดังนั้นโปรแกรมนี้ในบรรทัดที่ 16 มีการประกาศตัวแปร x 200 00:08:41,330 --> 00:08:43,150 ดังนั้นให้ฉันสี่ไบต์เป็น int 201 00:08:43,150 --> 00:08:45,750 จะได้รับการบอกเล่าของผู้ใช้ จำนวนโปรดแล้ว 202 00:08:45,750 --> 00:08:49,010 นี้เป็นสายที่น่าสนใจที่ จริงความสัมพันธ์ร่วมกันเมื่อสัปดาห์ที่แล้ว 203 00:08:49,010 --> 00:08:49,790 และนี่. 204 00:08:49,790 --> 00:08:53,230 scanf และจากนั้นแจ้งให้ทราบว่าจะใช้เวลา สตริงรูปแบบเช่นเดียวกับ printf, 205 00:08:53,230 --> 00:08:57,480 ฉันหมายถึง% int แล้วจะใช้เวลา อาร์กิวเมนต์ที่สองซึ่งมีลักษณะเล็ก ๆ น้อย ๆ 206 00:08:57,480 --> 00:08:58,260 ขี้ขลาด 207 00:08:58,260 --> 00:09:01,880 มันเป็นเครื่องหมาย x และจำ เราจะเห็นในครั้งนี้เมื่อสัปดาห์ที่แล้ว 208 00:09:01,880 --> 00:09:03,465 สิ่งที่ไม่แสดงเครื่องหมาย x? 209 00:09:03,465 --> 00:09:06,210 210 00:09:06,210 --> 00:09:08,450 สิ่งที่ไม่ทำเครื่องหมายใน C? 211 00:09:08,450 --> 00:09:08,950 ใช่? 212 00:09:08,950 --> 00:09:10,024 >> ผู้ชม: ที่อยู่ของ 213 00:09:10,024 --> 00:09:11,190 DAVID ลัน: ที่อยู่ของ 214 00:09:11,190 --> 00:09:13,190 ดังนั้นจึงเป็นตรงข้าม ของผู้ประกอบการดาว 215 00:09:13,190 --> 00:09:17,270 ในขณะที่ผู้ประกอบการที่ดาวบอกว่าให้ไปที่ ที่อยู่นี้ผู้ประกอบเครื่องหมาย 216 00:09:17,270 --> 00:09:20,280 กล่าวว่าคิดออก ที่อยู่ของตัวแปรนี้ 217 00:09:20,280 --> 00:09:23,530 และดังนั้นนี้เป็นกุญแจสำคัญเพราะ วัตถุประสงค์ scanf ในชีวิต 218 00:09:23,530 --> 00:09:26,320 คือการสแกนของผู้ใช้ การป้อนข้อมูลจากแป้นพิมพ์ 219 00:09:26,320 --> 00:09:29,970 ขึ้นอยู่กับสิ่งที่เขาหรือเธอ ประเภทแล้วอ่านการป้อนข้อมูลของผู้ใช้นั้น 220 00:09:29,970 --> 00:09:32,970 ลงในตัวแปร แต่เรา เห็นในสองสัปดาห์ที่ผ่านมา 221 00:09:32,970 --> 00:09:36,080 ที่ฟังก์ชั่นที่เราแลกเปลี่ยน พยายามที่จะดำเนินการได้อย่างง่ายดาย 222 00:09:36,080 --> 00:09:37,110 ถูกทำลายเพียง 223 00:09:37,110 --> 00:09:42,470 จำได้ว่ามีฟังก์ชั่แลกเปลี่ยน, ถ้าเราเพียงแค่ประกาศ A และ B เป็น ints, 224 00:09:42,470 --> 00:09:47,040 เราไม่ประสบความสำเร็จสลับ สองตัวแปรภายในของการแลกเปลี่ยน 225 00:09:47,040 --> 00:09:50,080 เช่นเดียวกับนมและ OJ, แต่ทันทีที่สลับกลับ 226 00:09:50,080 --> 00:09:55,200 สิ่งที่เป็นผลมาด้วยความเคารพ เพื่อ x และ y ค่าเดิม? 227 00:09:55,200 --> 00:09:55,700 ไม่มีอะไร 228 00:09:55,700 --> 00:09:56,200 ใช่ 229 00:09:56,200 --> 00:09:59,754 ไม่มีอะไรเกิดขึ้นในช่วงเวลานั้นเพราะ แลกเปลี่ยนเปลี่ยนเฉพาะสำเนาเฉพาะของตน 230 00:09:59,754 --> 00:10:01,670 ซึ่งก็คือการพูดว่าทั้งหมด เวลานี้เมื่อใดก็ตามที่เราได้ 231 00:10:01,670 --> 00:10:04,010 รับการผ่านในการขัดแย้ง ฟังก์ชั่นเรา 232 00:10:04,010 --> 00:10:05,939 เพียงแค่ผ่านสำเนาของข้อโต้แย้งเหล่านั้น 233 00:10:05,939 --> 00:10:07,980 คุณสามารถทำอะไรกับที่ สิ่งที่คุณต้องการกับพวกเขา 234 00:10:07,980 --> 00:10:10,890 แต่พวกเขากำลังจะมีไม่มี ผลกระทบต่อค่าเดิม 235 00:10:10,890 --> 00:10:13,650 ดังนั้นนี่คือปัญหาถ้าคุณ ต้องการที่จะมีฟังก์ชั่นเช่น scanf 236 00:10:13,650 --> 00:10:17,170 ในชีวิตที่มีวัตถุประสงค์ในการสแกน การป้อนข้อมูลของผู้ใช้จากแป้นพิมพ์ 237 00:10:17,170 --> 00:10:22,010 แล้วกรอกในช่องว่างเพื่อที่จะ พูดที่ให้ตัวแปรเช่น x 238 00:10:22,010 --> 00:10:25,410 ค่าเพราะถ้าฉันเป็น เพียงแค่ผ่าน x เพื่อ scanf, 239 00:10:25,410 --> 00:10:28,790 ถ้าคุณพิจารณาเหตุผลของการที่ผ่านมา สัปดาห์ scanf สามารถทำสิ่งที่มันต้องการ 240 00:10:28,790 --> 00:10:33,100 สำเนา x แต่มันทำไม่ได้ เปลี่ยนแปลงอย่างถาวร x ยกเว้นกรณีที่เราให้ 241 00:10:33,100 --> 00:10:37,120 scanf แผนที่สมบัติเพื่อที่จะพูด ที่ x เครื่องหมายจุดโดย 242 00:10:37,120 --> 00:10:41,860 เราผ่านในที่อยู่ของ x เพื่อให้ scanf สามารถไปที่นั่นและการเปลี่ยนแปลงจริง 243 00:10:41,860 --> 00:10:42,920 ค่าของ x 244 00:10:42,920 --> 00:10:45,080 และเพื่อให้จริงทั้งหมด ว่าโปรแกรมนี้ไม่ 245 00:10:45,080 --> 00:10:53,180 ถ้าผมทำ scanf 0 ในแหล่งที่มาของฉัน ไดเรกทอรี 5m ให้ scanf 0, 246 00:10:53,180 --> 00:10:57,730 จุดเฉือน scanf จำนวน โปรด 50 ขอบคุณสำหรับ 50 247 00:10:57,730 --> 00:11:01,020 >> ดังนั้นจึงเป็นที่น่าสนใจไม่ได้ทั้งหมดว่า แต่สิ่งที่เกิดขึ้นจริง 248 00:11:01,020 --> 00:11:04,820 คือว่าเร็วที่สุดเท่าที่ผมเรียกว่า scanf นี่ค่าของ x 249 00:11:04,820 --> 00:11:06,410 จะถูกเปลี่ยนไปอย่างถาวร 250 00:11:06,410 --> 00:11:08,335 ตอนนี้ดูเหมือนว่าดีและ ที่ดีและในความเป็นจริงมัน 251 00:11:08,335 --> 00:11:11,200 ดูเหมือนว่าเราไม่จำเป็นต้องใช้จริงๆ ห้องสมุด CS50 ที่ทุกคนอีกต่อไป 252 00:11:11,200 --> 00:11:13,960 ยกตัวอย่างเช่นเรามาทำงาน ครั้งนี้เพิ่มเติมได้ที่นี่ 253 00:11:13,960 --> 00:11:15,750 ผมขอเปิดใหม่อีกครั้งเป็นครั้งที่สอง 254 00:11:15,750 --> 00:11:20,600 ลองจำนวนและกรุณ​​า แทนที่จะพูดว่า 50 เหมือนก่อน 255 00:11:20,600 --> 00:11:22,810 ขอเพียงแค่บอกว่าไม่มี 256 00:11:22,810 --> 00:11:24,000 ตกลงที่แปลก ๆ 257 00:11:24,000 --> 00:11:25,270 ตกลง. 258 00:11:25,270 --> 00:11:28,680 และเพียงแค่เรื่องไร้สาระบางอย่างที่นี่ 259 00:11:28,680 --> 00:11:31,170 ดังนั้นจึงไม่ได้ดูเหมือนจะ จัดการกับสถานการณ์ที่ผิดพลาด 260 00:11:31,170 --> 00:11:33,620 ดังนั้นเราจึงจำเป็นที่จะต้องเริ่มต้นที่น้อยที่สุด เพิ่มบางข้อผิดพลาดการตรวจสอบ 261 00:11:33,620 --> 00:11:37,460 เพื่อให้แน่ใจว่าผู้ใช้มี พิมพ์ในจำนวนที่เกิดขึ้นจริงเช่น 50, 262 00:11:37,460 --> 00:11:40,720 เพราะเห็นได้ชัดว่าการพิมพ์คำ ไม่ได้ตรวจพบว่าเป็นปัญหา 263 00:11:40,720 --> 00:11:42,020 แต่มันอาจจะ 264 00:11:42,020 --> 00:11:46,450 >> ลองดูที่รุ่นนี้ตอนนี้ที่ ความพยายามของฉันที่จะ reimplement GetString 265 00:11:46,450 --> 00:11:48,437 หาก scanf มีทั้งหมดนี้ ฟังก์ชั่นในตัว 266 00:11:48,437 --> 00:11:51,270 เหตุผลที่เราได้รับการเล่นน้ำกับสิ่งเหล่านี้ ล้อการฝึกอบรมเช่น GetString? 267 00:11:51,270 --> 00:11:55,450 ดีที่นี่อาจจะเป็นของตัวเอง รุ่นที่เรียบง่ายของ GetString 268 00:11:55,450 --> 00:12:00,766 โดยสัปดาห์ที่ผ่านมาผมอาจจะได้กล่าวว่า ให้ฉันสตริงและเรียกว่าบัฟเฟอร์ 269 00:12:00,766 --> 00:12:03,390 วันนี้ฉันจะเริ่มต้นเพียง บอกว่าดาวถ่านซึ่งการเรียกคืน 270 00:12:03,390 --> 00:12:04,400 มันเป็นเพียงความหมายเหมือนกัน 271 00:12:04,400 --> 00:12:06,629 มันดูน่ากลัว แต่ก็ สิ่งเดียวที่แน่นอน 272 00:12:06,629 --> 00:12:09,420 ดังนั้นให้ฉันตัวแปรที่เรียกว่าบัฟเฟอร์ ที่เกิดขึ้นในการจัดเก็บสตริง 273 00:12:09,420 --> 00:12:12,780 บอกสตริงผู้ใช้โปรด แล้วเช่นเดียวกับก่อน 274 00:12:12,780 --> 00:12:17,760 ลองยืมบทเรียนนี้ scanf % s เวลานี้แล้วผ่านในบัฟเฟอร์ 275 00:12:17,760 --> 00:12:19,310 ตอนนี้การตรวจสอบสติอย่างรวดเร็ว 276 00:12:19,310 --> 00:12:22,120 ทำไมฉันไม่ได้บอกว่า เครื่องหมาย buffer ครั้งนี้หรือไม่ 277 00:12:22,120 --> 00:12:25,190 278 00:12:25,190 --> 00:12:26,625 สรุปจากตัวอย่างก่อนหน้านี้ 279 00:12:26,625 --> 00:12:28,000 ผู้ชม: Char ดาวเป็นตัวชี้ 280 00:12:28,000 --> 00:12:29,920 DAVID ลัน: แน่นอน, เพราะเวลานี้ถ่าน 281 00:12:29,920 --> 00:12:34,080 ดาวที่มีอยู่แล้วตัวชี้ที่อยู่ โดยความหมายของดาวที่อยู่ที่นั่น 282 00:12:34,080 --> 00:12:37,530 และถ้า scanf คาดว่าที่อยู่ มันพอเพียงเพียงเพื่อให้ผ่านในบัฟเฟอร์ 283 00:12:37,530 --> 00:12:39,260 ฉันไม่ต้องการที่จะพูดบัฟเฟอร์เครื่องหมาย 284 00:12:39,260 --> 00:12:42,177 สำหรับการอยากรู้อยากเห็นที่คุณสามารถทำได้ ทำอะไรเช่นนี้ 285 00:12:42,177 --> 00:12:43,510 มันจะมีความหมายที่แตกต่างกัน 286 00:12:43,510 --> 00:12:47,240 นี้จะให้คุณเป็นตัวชี้ ที่จะเป็นตัวชี้ที่เป็นจริง 287 00:12:47,240 --> 00:12:50,050 เป็นสิ่งที่ถูกต้องใน C แต่สำหรับ ตอนนี้ขอให้มันง่าย 288 00:12:50,050 --> 00:12:51,750 และเก็บเรื่องที่สอดคล้องกัน 289 00:12:51,750 --> 00:12:54,100 ฉันแค่จะผ่านใน บัฟเฟอร์และที่ถูกต้อง 290 00:12:54,100 --> 00:12:56,487 ปัญหาที่เกิดขึ้นนี้ว่าเป็น 291 00:12:56,487 --> 00:12:58,820 ให้ฉันไปข้างหน้าและทำงานนี้ โปรแกรมหลังจากที่รวบรวม 292 00:12:58,820 --> 00:13:00,902 ทำให้ scanf 1 293 00:13:00,902 --> 00:13:02,610 ประณามมันคอมไพเลอร์ของฉัน จับข้อผิดพลาดของฉัน 294 00:13:02,610 --> 00:13:04,090 ให้ฉันคนที่สอง 295 00:13:04,090 --> 00:13:05,460 ทำเสียงดังกราว 296 00:13:05,460 --> 00:13:06,990 สมมติว่า scanf-1.c 297 00:13:06,990 --> 00:13:10,880 298 00:13:10,880 --> 00:13:11,380 ตกลง. 299 00:13:11,380 --> 00:13:12,720 เราจะไปที่นั่น. 300 00:13:12,720 --> 00:13:14,280 ฉันต้องการมัน. 301 00:13:14,280 --> 00:13:16,750 ID CS50 มีต่างๆ การตั้งค่า 302 00:13:16,750 --> 00:13:18,280 ที่ปกป้องคุณกับตัวเอง 303 00:13:18,280 --> 00:13:21,300 ฉันต้องการที่จะปิดการใช้งานเหล่านั้นด้วย ทำงานเสียงดังกราวด้วยตนเองในครั้งนี้ 304 00:13:21,300 --> 00:13:22,140 ดังนั้นโปรดสตริง 305 00:13:22,140 --> 00:13:25,560 ฉันจะไปข้างหน้าและพิมพ์ ในโลกสวัสดีที่ชื่นชอบ 306 00:13:25,560 --> 00:13:26,490 ตกลง null 307 00:13:26,490 --> 00:13:27,700 นั่นไม่ใช่สิ่งที่ผมพิมพ์ 308 00:13:27,700 --> 00:13:29,690 ดังนั้นจึงเป็นตัวบ่งชี้ของ บางสิ่งบางอย่างที่ไม่ถูกต้องเป็น 309 00:13:29,690 --> 00:13:33,920 ให้ฉันไปข้างหน้าและพิมพ์ ในสายยาวจริงๆ 310 00:13:33,920 --> 00:13:37,210 ขอบคุณสำหรับการเป็นโมฆะและผมไม่ทราบว่า ถ้าฉันจะสามารถที่จะผิดพลาดมัน 311 00:13:37,210 --> 00:13:40,240 ลองสำเนาเล็ก ๆ น้อย ๆ วางและดูว่านี้จะช่วยให้ 312 00:13:40,240 --> 00:13:43,290 เพียงแค่วางจำนวนมากนี้ 313 00:13:43,290 --> 00:13:47,310 มันแน่นอนที่ใหญ่กว่า สตริงกว่าปกติ 314 00:13:47,310 --> 00:13:51,450 ขอเพียงเขียนมันจริงๆ 315 00:13:51,450 --> 00:13:51,950 เลขที่ 316 00:13:51,950 --> 00:13:52,650 ประณามมัน 317 00:13:52,650 --> 00:13:53,480 ไม่พบคำสั่ง. 318 00:13:53,480 --> 00:13:54,550 เพื่อให้เป็นที่ไม่เกี่ยวข้อง 319 00:13:54,550 --> 00:13:56,440 นั่นเป็นเพราะผมวาง บางตัวอักษรที่ไม่ดี 320 00:13:56,440 --> 00:13:59,780 แต่จะเปิดออกไม่ได้ไปทำงาน 321 00:13:59,780 --> 00:14:03,510 >> ลองครั้งนี้มากขึ้นเพราะ มันสนุกมากขึ้นถ้าเราจริงมันผิดพลาด 322 00:14:03,510 --> 00:14:09,116 ลองพิมพ์นี้และตอนนี้ฉัน จะคัดลอกสายยาวจริงๆ 323 00:14:09,116 --> 00:14:10,990 และตอนนี้เรามาดูว่าเรา สามารถผิดพลาดสิ่งนี้ 324 00:14:10,990 --> 00:14:14,235 ผมสังเกตเห็นช่องว่างและละเว้น สายใหม่และอัฒภาค 325 00:14:14,235 --> 00:14:16,035 และตัวละครขี้ขลาดทั้งหมด 326 00:14:16,035 --> 00:14:16,535 เข้าสู่ 327 00:14:16,535 --> 00:14:21,090 328 00:14:21,090 --> 00:14:22,880 และตอนนี้เครือข่ายเป็นเพียงแค่ช้า 329 00:14:22,880 --> 00:14:27,460 ผมจัดลงคำสั่ง V นานเกินไปอย่างเห็นได้ชัด 330 00:14:27,460 --> 00:14:28,190 ประณามมัน! 331 00:14:28,190 --> 00:14:29,260 ไม่พบคำสั่ง. 332 00:14:29,260 --> 00:14:29,780 >> ตกลง. 333 00:14:29,780 --> 00:14:32,240 ดีประเด็นก็คือ แต่ต่อไปนี้ 334 00:14:32,240 --> 00:14:36,910 ดังนั้นสิ่งที่เป็นจริงที่เกิด กับประกาศนี้ 335 00:14:36,910 --> 00:14:39,240 ของบัฟเฟอร์ดาวถ่านในบรรทัดที่ 16? 336 00:14:39,240 --> 00:14:41,820 ดังนั้นสิ่งที่ฉันได้รับ เมื่อผมประกาศตัวชี้? 337 00:14:41,820 --> 00:14:47,440 ทั้งหมดที่ฉันได้รับเป็นค่าสี่ไบต์ เรียกว่าบัฟเฟอร์ แต่สิ่งที่ภายในของมัน 338 00:14:47,440 --> 00:14:49,540 ในตอนนี้? 339 00:14:49,540 --> 00:14:50,930 มันเป็นเพียงค่าขยะบางอย่าง 340 00:14:50,930 --> 00:14:54,170 เพราะเวลาที่คุณประกาศตัวแปร ใน C ก็เพียงบางค่าขยะ 341 00:14:54,170 --> 00:14:56,220 และเรากำลังเริ่ม การเดินทางมากกว่าความเป็นจริงนี้ 342 00:14:56,220 --> 00:14:59,720 ตอนนี้เมื่อฉันบอก scanf, ไปยังที่อยู่นี้ 343 00:14:59,720 --> 00:15:01,520 และนำสิ่งที่ประเภทของผู้ใช้ใน 344 00:15:01,520 --> 00:15:06,400 ถ้าผู้ใช้ชนิดในสวัสดี โลกดีที่ฉันจะใส่มันได้หรือไม่ 345 00:15:06,400 --> 00:15:07,750 บัฟเฟอร์คือค่าขยะ 346 00:15:07,750 --> 00:15:11,510 >> เพื่อให้เป็นชนิดเช่นลูกศร ที่ชี้ให้ผู้รู้ที่ 347 00:15:11,510 --> 00:15:13,880 บางทีมันอาจจะชี้ ขวาที่นี่ในความทรงจำของฉัน 348 00:15:13,880 --> 00:15:16,560 ดังนั้นเมื่อผู้ใช้ ชนิดในโลกสวัสดี 349 00:15:16,560 --> 00:15:22,380 โปรแกรมพยายามที่จะนำ สตริงสวัสดีเครื่องหมายโลก 0 350 00:15:22,380 --> 00:15:23,910 ในก้อนของหน่วยความจำที่ 351 00:15:23,910 --> 00:15:27,070 แต่มีโอกาสสูง แต่ น่าจะเป็นอย่างชัดเจนไม่ได้ 100% 352 00:15:27,070 --> 00:15:30,440 คอมพิวเตอร์เป็นไปแล้วผิดพลาด โปรแกรมเพราะเรื่องนี้ไม่ได้ 353 00:15:30,440 --> 00:15:32,490 หน่วยความจำที่ฉันควรจะได้รับอนุญาตให้สัมผัส 354 00:15:32,490 --> 00:15:36,330 ดังนั้นในระยะสั้นโปรแกรมนี้ มีข้อบกพร่องตรงด้วยเหตุผลที่ว่า 355 00:15:36,330 --> 00:15:38,070 ฉันพื้นฐานไม่ได้ทำอะไร 356 00:15:38,070 --> 00:15:42,366 ขั้นตอนสิ่งที่ฉันได้มองข้ามเช่นเดียวกับ เรามองข้ามกับตัวอย่างแรกของบิงกี้? 357 00:15:42,366 --> 00:15:42,866 ใช่? 358 00:15:42,866 --> 00:15:43,710 >> ผู้ชม: การจัดสรรหน่วยความจำ? 359 00:15:43,710 --> 00:15:45,001 >> DAVID ลัน: การจัดสรรหน่วยความจำ 360 00:15:45,001 --> 00:15:48,400 ผมยังไม่ได้รับการจัดสรรจริง หน่วยความจำสำหรับสตริงที่ใด ๆ 361 00:15:48,400 --> 00:15:50,270 ดังนั้นเราจึงสามารถแก้ไขปัญหานี้ในสองวิธี 362 00:15:50,270 --> 00:15:52,700 หนึ่งเราสามารถให้มันง่าย และในความเป็นจริงตอนนี้คุณ 363 00:15:52,700 --> 00:15:55,116 จะเริ่มเห็นเบลอ ของเส้นระหว่างสิ่งที่เป็น 364 00:15:55,116 --> 00:15:58,520 อาร์เรย์คือสิ่งที่สตริงเป็นสิ่งที่ ดาวถ่านคือสิ่งที่อาร์เรย์ของตัวอักษร 365 00:15:58,520 --> 00:15:59,020 คือ. 366 00:15:59,020 --> 00:16:02,450 นี่เป็นตัวอย่างที่สองคือ ที่เกี่ยวข้องกับสายและแจ้งให้ทราบล่วงหน้า 367 00:16:02,450 --> 00:16:05,690 ทั้งหมดที่ฉันได้ทำในบรรทัด 16 แทนที่จะพูดว่า 368 00:16:05,690 --> 00:16:09,530 บัฟเฟอร์ที่เป็นไปได้ถ่าน ดาวตัวชี้ไปยังก้อนของหน่วยความจำ, 369 00:16:09,530 --> 00:16:14,057 ฉันจะไปในเชิงรุกให้มาก ตัวเองบัฟเฟอร์ 16 ตัวอักษร 370 00:16:14,057 --> 00:16:16,390 และในความเป็นจริงถ้าคุณคุ้นเคย บัฟเฟอร์กับคำว่า 371 00:16:16,390 --> 00:16:20,570 อาจจะมาจากโลกของวิดีโอ วิดีโอที่เป็นบัฟเฟอร์บัฟเฟอร์ 372 00:16:20,570 --> 00:16:21,175 บัฟเฟอร์ 373 00:16:21,175 --> 00:16:22,550 ดีสิ่งที่การเชื่อมต่อที่นี่? 374 00:16:22,550 --> 00:16:24,960 ดีภายใน YouTube และภายในของผู้เล่นวิดีโอ 375 00:16:24,960 --> 00:16:27,200 โดยทั่วไปอาร์เรย์ ที่มีขนาดใหญ่กว่า 16 376 00:16:27,200 --> 00:16:30,340 มันอาจจะมีอาร์เรย์ขนาดหนึ่ง เมกะไบต์อาจจะ 10 เมกะไบต์ 377 00:16:30,340 --> 00:16:34,330 และเข้าแถวที่ไ​​ม่เบราว์เซอร์ของคุณ ดาวน์โหลดทั้งกลุ่มของไบต์ 378 00:16:34,330 --> 00:16:37,500 ทั้งกลุ่มของเมกะไบต์ วิดีโอและเล่นวิดีโอ 379 00:16:37,500 --> 00:16:40,930 ของ YouTube หรือใครก็ตามที่เป็นเริ่มต้น อ่านไบต์จากแถวนั้น 380 00:16:40,930 --> 00:16:43,530 และทุกครั้งที่คุณเห็น บัฟเฟอร์คำบัฟเฟอร์ 381 00:16:43,530 --> 00:16:46,350 นั่นหมายความว่าผู้เล่นที่มี อากาศไปยังปลายแถวว่า 382 00:16:46,350 --> 00:16:50,430 เครือข่ายช้าเพื่อให้มันไม่ได้ เติมอาร์เรย์กับไบต์ 383 00:16:50,430 --> 00:16:55,610 และเพื่อให้คุณจะออกจากบิต ที่จะแสดงให้กับผู้ใช้ 384 00:16:55,610 --> 00:16:59,430 >> บัฟเฟอร์ดังนั้นเป็นคำที่มีแนวโน้มในการที่นี่ มันเป็นเพียงแค่อาร์เรย์ก้อนของหน่วยความจำ 385 00:16:59,430 --> 00:17:02,530 และสิ่งนี้จะแก้ไขได้ เพราะมันจะเปิดออก 386 00:17:02,530 --> 00:17:07,410 ที่คุณสามารถรักษาอาร์เรย์ราวกับว่า พวกเขาจะอยู่ถึงแม้ว่าบัฟเฟอร์ 387 00:17:07,410 --> 00:17:10,710 เป็นเพียงสัญลักษณ์มันเป็น ลำดับของตัวอักษรบัฟเฟอร์ 388 00:17:10,710 --> 00:17:14,760 ที่มีประโยชน์สำหรับฉันโปรแกรมเมอร์ คุณสามารถส่งชื่อไปรอบ ๆ 389 00:17:14,760 --> 00:17:17,079 ราวกับว่ามันเป็น ตัวชี้ราวกับว่ามัน 390 00:17:17,079 --> 00:17:21,000 เป็นที่อยู่ของก้อนที่ หน่วยความจำ 16 ตัวอักษร 391 00:17:21,000 --> 00:17:24,530 เพื่อที่จะบอกว่าผมสามารถผ่าน scanf ว่าคำว่า 392 00:17:24,530 --> 00:17:30,670 และอื่น ๆ ตอนนี้ถ้าผมทำโปรแกรมนี้ ทำให้ scanf 2 เฉือนจุด scanf 2 393 00:17:30,670 --> 00:17:35,386 และพิมพ์สวัสดีโลก ใส่ time-- ว่า 394 00:17:35,386 --> 00:17:37,590 >> อืมสิ่งที่เกิดขึ้น? 395 00:17:37,590 --> 00:17:39,340 String โปรด 396 00:17:39,340 --> 00:17:41,430 ฉันทำผิดอะไร? 397 00:17:41,430 --> 00:17:43,800 สวัสดีชาวโลกบัฟเฟอร์ 398 00:17:43,800 --> 00:17:44,705 สวัสดีชาวโลก. 399 00:17:44,705 --> 00:17:48,201 400 00:17:48,201 --> 00:17:49,420 โอ้ฉันรู้ว่าสิ่งที่มันทำ 401 00:17:49,420 --> 00:17:49,920 ตกลง. 402 00:17:49,920 --> 00:17:51,628 ดังนั้นจึงอ่าน จนพื้นที่แรก 403 00:17:51,628 --> 00:17:55,680 ดังนั้นขอโกงเพียงสักครู่และ บอกว่าผมแค่อยากจะพิมพ์อะไรบางอย่าง 404 00:17:55,680 --> 00:18:01,408 จริงๆยาวเช่นนี้เป็นประโยคยาว ที่หนึ่งสองสามสี่ห้า 405 00:18:01,408 --> 00:18:04,420 หกเจ็ดแปดเก้า 10, 11, 12, 13, 14, 15, 16 406 00:18:04,420 --> 00:18:05,300 ตกลง. 407 00:18:05,300 --> 00:18:07,600 มันย่อมเป็นประโยคยาว 408 00:18:07,600 --> 00:18:10,710 ดังนั้นประโยคนี้คือ นานกว่า 16 ตัวอักษร 409 00:18:10,710 --> 00:18:13,670 และดังนั้นเมื่อผมกด Enter, สิ่งที่จะเกิดขึ้น? 410 00:18:13,670 --> 00:18:16,940 ดีในกรณีนี้ เรื่องที่ผมได้ประกาศบัฟเฟอร์ 411 00:18:16,940 --> 00:18:22,190 ที่จริงเป็นอาร์เรย์ 16 ตัวอักษรพร้อมที่จะไป 412 00:18:22,190 --> 00:18:27,426 ดังนั้นหนึ่งสองสามสี่ห้าหก เจ็ดแปดเก้า, 10, 11, 12, 13, 14 413 00:18:27,426 --> 00:18:29,440 15, 16 414 00:18:29,440 --> 00:18:34,410 ดังนั้น 16 ตัวอักษรและตอนนี้เมื่อฉัน อ่านในบางสิ่งบางอย่างเช่นนี้เป็นเวลานาน 415 00:18:34,410 --> 00:18:43,950 ประโยคสิ่งที่จะเกิดขึ้นคือ ที่ฉันจะอ่านในนี้เป็นเวลานาน 416 00:18:43,950 --> 00:18:49,660 S-E-N-T-E-N-C-E, ประโยค 417 00:18:49,660 --> 00:18:52,270 >> ดังนั้นนี่คือจงใจ สิ่งที่ไม่ดีที่ฉัน 418 00:18:52,270 --> 00:18:55,060 ให้เขียนเกิน ขอบเขตของอาเรย์ของฉัน 419 00:18:55,060 --> 00:18:56,660 เกินขอบเขตของบัฟเฟอร์ของฉัน 420 00:18:56,660 --> 00:19:00,100 ฉันจะได้รับโชคดีและโปรแกรม จะเก็บไว้ในการทำงานและไม่สนใจ 421 00:19:00,100 --> 00:19:03,450 แต่โดยทั่วไปพูดนี้ ก็จะผิดพลาดโปรแกรมของฉัน 422 00:19:03,450 --> 00:19:06,440 และมันเป็นปัญหาที่เกิดของฉัน รหัสขณะที่ฉันก้าว 423 00:19:06,440 --> 00:19:08,576 เกินขอบเขต ของอาร์เรย์ที่เพราะผม 424 00:19:08,576 --> 00:19:10,450 ไม่ทราบว่าเป็น จำเป็นต้องไปผิดพลาด 425 00:19:10,450 --> 00:19:12,120 หรือถ้าฉันแค่จะได้รับโชคดี 426 00:19:12,120 --> 00:19:15,750 ดังนั้นนี่คือปัญหาเพราะใน กรณีนี้ก็ไม่ดูเหมือนจะทำงาน 427 00:19:15,750 --> 00:19:20,931 และขอลองเสี่ยงดวงที่นี่แม้ว่า IDE ที่ดูเหมือนว่าจะทนไม่น้อย 428 00:19:20,931 --> 00:19:21,430 of-- 429 00:19:21,430 --> 00:19:22,040 >> เราจะไปที่นั่น. 430 00:19:22,040 --> 00:19:23,240 ในที่สุด 431 00:19:23,240 --> 00:19:26,470 ดังนั้นฉันเพียงคนเดียวที่สามารถมองเห็นได้ 432 00:19:26,470 --> 00:19:29,630 ดังนั้นผมก็มีจำนวนมากสนุกพิมพ์ จากวลีที่เกิดขึ้นจริงนานจริงๆ 433 00:19:29,630 --> 00:19:32,800 ว่ามันเกินอย่างแน่นอน 16 ไบต์เพราะผม 434 00:19:32,800 --> 00:19:38,050 พิมพ์ลงในนี้บ้านานหลายสาย วลีและแจ้งให้ทราบแล้วว่าเกิดอะไรขึ้น 435 00:19:38,050 --> 00:19:41,110 โปรแกรมที่พยายามพิมพ์ และหลังจากนั้นก็แบ่งส่วนความผิด 436 00:19:41,110 --> 00:19:44,430 และความผิดพลาดของการแบ่งส่วนคือเมื่อ บางสิ่งบางอย่างเช่นนี้เกิดขึ้น 437 00:19:44,430 --> 00:19:47,650 และระบบปฏิบัติการกล่าวว่า ไม่มีไม่สามารถสัมผัสหน่วยความจำที่ 438 00:19:47,650 --> 00:19:49,570 เรากำลังจะไปฆ่า โปรแกรมทั้งหมด 439 00:19:49,570 --> 00:19:51,180 >> ดังนั้นปัญหานี้ดูเหมือนว่า 440 00:19:51,180 --> 00:19:54,540 ผมได้ปรับปรุงโปรแกรมโดย อย่างน้อยมีหน่วยความจำบางส่วน 441 00:19:54,540 --> 00:19:58,000 แต่ตอนนี้ดูเหมือนจะ จำกัด GetString ฟังก์ชั่นในการรับ 442 00:19:58,000 --> 00:20:00,780 บางสายมีความยาว 16 จำกัด 443 00:20:00,780 --> 00:20:04,200 ดังนั้นหากคุณต้องการให้การสนับสนุนอีกต่อไป ประโยคกว่า 16 ตัวอักษร 444 00:20:04,200 --> 00:20:04,880 คุณทำอะไร? 445 00:20:04,880 --> 00:20:07,970 ดีที่คุณสามารถเพิ่ม ขนาดของบัฟเฟอร์ 32 นี้ 446 00:20:07,970 --> 00:20:09,190 หรือที่ดูเหมือนว่าชนิดสั้น 447 00:20:09,190 --> 00:20:12,260 ทำไมเราไม่เพียงให้ มัน 1000 แต่ดันกลับ 448 00:20:12,260 --> 00:20:17,100 อะไรตอบสนองอย่างสังหรณ์ใจของ เพียงแค่หลีกเลี่ยงปัญหานี้โดยการทำ 449 00:20:17,100 --> 00:20:20,660 บัฟเฟอร์ของฉันที่ใหญ่กว่าเช่น 1,000 ตัวอักษร? 450 00:20:20,660 --> 00:20:23,470 โดยการดำเนินการ getString วิธีนี้ 451 00:20:23,470 --> 00:20:27,130 มีอะไรดีหรือไม่ดีอยู่ที่นี่? 452 00:20:27,130 --> 00:20:28,033 ใช่? 453 00:20:28,033 --> 00:20:30,574 ผู้ชม: ถ้าคุณผูกขึ้นมาก ของพื้นที่และคุณไม่ได้ใช้มัน 454 00:20:30,574 --> 00:20:33,500 แล้วคุณจะไม่สามารถจัดสรรพื้นที่นั้น 455 00:20:33,500 --> 00:20:34,500 DAVID ลัน: แน่นอน 456 00:20:34,500 --> 00:20:38,480 มันสิ้นเปลืองเท่าถ้าคุณทำไม่ได้ จริงต้อง 900 ไบต์เหล่านั้น 457 00:20:38,480 --> 00:20:41,057 และยังที่คุณขอ 1,000 รวมแล้ว 458 00:20:41,057 --> 00:20:44,140 คุณเพียงแค่การบริโภคหน่วยความจำเพิ่มเติมเกี่ยวกับ คอมพิวเตอร์ของผู้ใช้มากกว่าที่คุณต้องการไป 459 00:20:44,140 --> 00:20:45,740 และหลังจากทั้งหมดบางส่วนของ คุณพบแล้ว 460 00:20:45,740 --> 00:20:47,620 ในชีวิตที่เมื่อคุณอยู่ ทำงานจำนวนมากของโปรแกรม 461 00:20:47,620 --> 00:20:50,470 และพวกเขากำลังรับประทานจำนวนมากของหน่วยความจำ นี้จริงสามารถส่งผลกระทบต่อผลการดำเนินงาน 462 00:20:50,470 --> 00:20:52,220 และประสบการณ์ของผู้ใช้ บนคอมพิวเตอร์. 463 00:20:52,220 --> 00:20:56,090 เพื่อให้เป็นชนิดของการแก้ปัญหาขี้เกียจ สำหรับการตรวจสอบและตรงกันข้าม 464 00:20:56,090 --> 00:21:00,140 มันไม่เพียง แต่สิ้นเปลืองสิ่งที่เป็นปัญหา ยังคงอยู่แม้ว่าฉันจะทำให้บัฟเฟอร์ของฉัน 465 00:21:00,140 --> 00:21:02,100 1000? 466 00:21:02,100 --> 00:21:02,600 ใช่? 467 00:21:02,600 --> 00:21:04,475 >> ผู้ชม: สตริงคือความยาว 1,001 468 00:21:04,475 --> 00:21:05,350 DAVID ลัน: แน่นอน 469 00:21:05,350 --> 00:21:08,280 ถ้าสายของคุณคือความยาว 1,001, คุณมีปัญหาเดียวกันแน่นอน 470 00:21:08,280 --> 00:21:10,705 และข้อโต้แย้งของฉันฉันจะ เพียงแค่นั้นก็ทำให้มันเป็นปี 2000 471 00:21:10,705 --> 00:21:12,830 แต่คุณไม่ทราบ ความก้าวหน้าของวิธีการใหญ่มันควรจะเป็น 472 00:21:12,830 --> 00:21:16,890 และยังฉันจะมีการรวบรวมโปรแกรมของฉัน ก่อนที่จะให้คนใช้และดาวน์โหลด 473 00:21:16,890 --> 00:21:17,390 มัน 474 00:21:17,390 --> 00:21:21,490 ดังนั้นตรงนี้เป็นชนิดของ สิ่งที่ห้องสมุด CS50 พยายาม 475 00:21:21,490 --> 00:21:24,750 ที่จะช่วยให้เรามีและเราจะได้อย่างรวดเร็วเท่านั้น ที่บางส่วนของการดำเนินงานภายใต้ 476 00:21:24,750 --> 00:21:29,790 ที่นี่ แต่นี้เป็นจุด CS50 ซีนี้ ไฟล์ที่ได้รับใน CS50 IDE 477 00:21:29,790 --> 00:21:31,420 สัปดาห์ที่ผ่านมาทั้งหมดเหล่านี้ที่คุณได้ใช้ 478 00:21:31,420 --> 00:21:34,280 มันก่อนรวบรวมและคุณได้ ได้ใช้มันโดยอัตโนมัติ 479 00:21:34,280 --> 00:21:38,780 โดยธรรมชาติของการมี รีบธง L CS50 กับเสียงดังกราว, 480 00:21:38,780 --> 00:21:42,300 แต่ถ้าผมเลื่อนลงผ่านทุก ฟังก์ชั่นเหล่านี้ที่นี่ GetString, 481 00:21:42,300 --> 00:21:44,636 และเพียงแค่ให้คุณ รสชาติของสิ่งที่เกิดขึ้น 482 00:21:44,636 --> 00:21:46,760 ลองมาดูอย่างรวดเร็วที่ ความซับซ้อนญาติ 483 00:21:46,760 --> 00:21:48,870 มันไม่ได้เป็นซุปเปอร์ยาว ฟังก์ชั่น แต่เราไม่ได้ 484 00:21:48,870 --> 00:21:52,530 ต้องคิดหนักเกี่ยวกับทุก ว่าจะไปเกี่ยวกับการรับสาย 485 00:21:52,530 --> 00:21:55,660 >> ดังนั้นนี่คือบัฟเฟอร์ของฉันและฉัน เห็นได้ชัดว่ามันเริ่มต้นให้เป็นโมฆะ 486 00:21:55,660 --> 00:21:57,990 นี้แน่นอนคือ สิ่งเดียวกับดาวถ่าน, 487 00:21:57,990 --> 00:22:00,585 แต่ผมตัดสินใจ การใช้ห้องสมุด CS50 488 00:22:00,585 --> 00:22:02,460 ว่าถ้าเรากำลังจะไป เป็นแบบไดนามิกอย่างสมบูรณ์ 489 00:22:02,460 --> 00:22:05,770 ผมไม่ทราบล่วงหน้าว่าขนาดใหญ่ของ ผู้ใช้สตริงจะต้องการที่จะได้รับ 490 00:22:05,770 --> 00:22:08,140 ดังนั้นฉันจะเริ่มต้น มีเพียงสตริงที่ว่างเปล่า 491 00:22:08,140 --> 00:22:11,507 และฉันจะที่จะสร้างขึ้นเป็นอย่างมาก หน่วยความจำที่ฉันต้องการเพื่อให้เหมาะสมกับผู้ใช้สตริง 492 00:22:11,507 --> 00:22:13,340 และถ้าฉันไม่ได้มี พอฉันจะถาม 493 00:22:13,340 --> 00:22:15,010 ระบบปฏิบัติการสำหรับหน่วยความจำมากขึ้น 494 00:22:15,010 --> 00:22:17,510 ฉันจะย้ายสตริงของพวกเขา เป็นก้อนที่ใหญ่กว่าของหน่วยความจำ 495 00:22:17,510 --> 00:22:21,847 และฉันจะปล่อยหรือฟรี ก้อนขนาดใหญ่ของหน่วยความจำไม่เพียงพอ 496 00:22:21,847 --> 00:22:23,680 และเรากำลังจะ การทำเช่นนี้ซ้ำ 497 00:22:23,680 --> 00:22:25,570 >> ดังนั้นอย่างรวดเร็ว, นี่เป็นเพียงตัวแปร 498 00:22:25,570 --> 00:22:28,780 ที่ฉันจะติดตาม ของความจุของบัฟเฟอร์ของฉัน 499 00:22:28,780 --> 00:22:30,071 วิธีการหลายไบต์ฉันสามารถใส่? 500 00:22:30,071 --> 00:22:32,070 นี่เป็น n ตัวแปรที่มี ซึ่งผมจะให้ 501 00:22:32,070 --> 00:22:36,200 ติดตามจำนวนไบต์เป็นจริงใน บัฟเฟอร์หรือว่าผู้ใช้มีพิมพ์ 502 00:22:36,200 --> 00:22:39,900 หากคุณไม่เห็นนี้มาก่อนคุณ สามารถระบุว่าตัวแปรเช่น int ต์ 503 00:22:39,900 --> 00:22:46,370 คือไม่ได้ลงนามซึ่งเป็นชื่อที่แนะนำ หมายความว่ามันไม่เป็นลบและทำไมจะ 504 00:22:46,370 --> 00:22:50,590 ที่ฉันเคยต้องการรบกวนระบุ ที่ int ไม่ได้เป็นเพียง int, 505 00:22:50,590 --> 00:22:52,540 แต่มันเป็น int ไม่ได้ลงนาม? 506 00:22:52,540 --> 00:22:55,064 มันเป็น int ไม่ใช่เชิงลบ 507 00:22:55,064 --> 00:22:56,355 ไม่ว่าสิ่งที่ [ไม่ได้ยิน] หมายความว่าอย่างไร 508 00:22:56,355 --> 00:22:58,910 >> ผู้ชม: มันอธิบายจำนวนเงิน หน่วยความจำที่สามารถ [ไม่ได้ยิน] 509 00:22:58,910 --> 00:22:59,660 >> DAVID ลัน: ใช่ 510 00:22:59,660 --> 00:23:03,710 ดังนั้นถ้าผมพูดไม่ได้ลงนามนี้เป็นจริง ให้คุณหนึ่งบิตของหน่วยความจำเสริม 511 00:23:03,710 --> 00:23:07,440 และดูเหมือนว่าชนิดของโง่ แต่ถ้าคุณ มีหนึ่งบิตของหน่วยความจำเพิ่มเติมที่ 512 00:23:07,440 --> 00:23:09,940 หมายความว่าคุณมีสองครั้งเป็นจำนวนมาก ค่าที่คุณสามารถเป็นตัวแทน 513 00:23:09,940 --> 00:23:11,570 เพราะมันอาจจะเป็น 0 หรือ 1 514 00:23:11,570 --> 00:23:14,660 ดังนั้นโดยค่าเริ่มต้น int สามารถประมาณ เชิงลบ 2000000000 ตลอดทาง 515 00:23:14,660 --> 00:23:16,030 บวกถึง 2 พันล้าน 516 00:23:16,030 --> 00:23:18,540 ผู้ที่มีช่วงใหญ่ แต่ ก็ยังคงเป็นชนิดของการสิ้นเปลือง 517 00:23:18,540 --> 00:23:21,280 ถ้าคุณดูแลเกี่ยวกับ ขนาดที่เพิ่งสังหรณ์ใจ 518 00:23:21,280 --> 00:23:24,620 ควรจะไม่เป็นลบหรือ บวกหรือ 0, ดีนั้น 519 00:23:24,620 --> 00:23:28,884 ทำไมคุณเสีย 2 พันล้าน ค่าที่เป็นไปในเชิงลบสำหรับตัวเลข 520 00:23:28,884 --> 00:23:30,300 ถ้าคุณไม่เคยไปใช้พวกเขา? 521 00:23:30,300 --> 00:23:35,350 ดังนั้นโดยกล่าวว่าได้ลงนามตอนนี้ฉันสามารถ int อยู่ระหว่าง 0 ถึงประมาณ 4 พันล้าน 522 00:23:35,350 --> 00:23:39,280 >> ดังนั้นนี่เป็นเพียง C int สำหรับเหตุผลที่ เราจะไม่ได้เป็นเพียงแค่ตอนนี้เป็น 523 00:23:39,280 --> 00:23:42,280 ทำไมมัน int แทน ของถ่าน แต่ที่นี่คือ 524 00:23:42,280 --> 00:23:44,630 สรุปสาระสำคัญของสิ่งที่เกิดขึ้น บนและบางส่วนของคุณ 525 00:23:44,630 --> 00:23:48,340 อาจจะใช้สำหรับตัวอย่างเช่น ฟังก์ชั่น fgetc แม้ใน PSet สี่ 526 00:23:48,340 --> 00:23:51,580 หรือหลังจากนั้นเราจะเห็นมัน ปัญหาที่เกิดขึ้นอีกครั้งในการตั้งห้า 527 00:23:51,580 --> 00:23:55,410 fgetc เป็นสิ่งที่ดีเพราะเป็นชื่อที่ ชนิดของการเรียงลำดับของ arcanely แนะนำ 528 00:23:55,410 --> 00:23:57,940 มันเป็นฟังก์ชั่นที่ ได้รับตัวอักษรและเป็นเช่นนั้น 529 00:23:57,940 --> 00:24:00,690 สิ่งที่แตกต่างกัน เกี่ยวกับสิ่งที่เรากำลังทำอยู่ใน GetString 530 00:24:00,690 --> 00:24:03,110 คือเราไม่ได้ใช้ scanf ในทางเดียวกัน 531 00:24:03,110 --> 00:24:07,550 เราเป็นเพียงแค่คืบคลานไปตามขั้นตอนโดยขั้นตอน มากกว่าสิ่งที่ผู้ใช้มีการพิมพ์ใน 532 00:24:07,550 --> 00:24:10,970 เพราะเรามักจะสามารถจัดสรรหนึ่ง ถ่านและเพื่อให้เราสามารถเสมอได้อย่างปลอดภัย 533 00:24:10,970 --> 00:24:15,599 ดูถ่านหนึ่งที่เวลาและ มายากลเริ่มที่จะเกิดขึ้นที่นี่ 534 00:24:15,599 --> 00:24:17,890 ฉันจะเลื่อนลงไป ตรงกลางของฟังก์ชั่นนี้ 535 00:24:17,890 --> 00:24:20,360 เพียงเวลาสั้น ๆ ที่จะแนะนำฟังก์ชั่นนี้ 536 00:24:20,360 --> 00:24:22,670 เหมือนมี ฟังก์ชั่น malloc มี 537 00:24:22,670 --> 00:24:27,740 ฟังก์ชั่นที่ realloc realloc ช่วยให้คุณสามารถจัดสรรก้อนของหน่วยความจำ 538 00:24:27,740 --> 00:24:29,570 และทำให้มันมีขนาดใหญ่หรือเล็ก 539 00:24:29,570 --> 00:24:33,060 เรื่องยาวดังนั้นในระยะสั้นและมี คลื่นของมือของฉันสำหรับวันนี้ 540 00:24:33,060 --> 00:24:35,620 รู้ว่าสิ่งที่ GetString จะทำคือมันเรียงลำดับ 541 00:24:35,620 --> 00:24:39,720 อย่างน่าอัศจรรย์ของการเจริญเติบโตหรือ การหดตัวกันชนเป็นผู้ใช้ 542 00:24:39,720 --> 00:24:41,440 ประเภทในสายของเขาหรือเธอ 543 00:24:41,440 --> 00:24:43,962 >> ดังนั้นหากผู้ใช้ที่ สตริงสั้นรหัสนี้ 544 00:24:43,962 --> 00:24:45,920 จัดสรรพอเพียง หน่วยความจำเพื่อให้พอดีกับสตริง 545 00:24:45,920 --> 00:24:48,086 หากผู้ใช้ช่วยให้การพิมพ์ ตามที่ผมได้อีกครั้งและอีกครั้ง 546 00:24:48,086 --> 00:24:50,330 และอีกครั้งที่ดีถ้า บัฟเฟอร์ของครั้งแรกที่ยิ่งใหญ่นี้ 547 00:24:50,330 --> 00:24:53,310 และโปรแกรมการตระหนักในการ รอสักครู่ฉันออกจากพื้นที่ 548 00:24:53,310 --> 00:24:55,410 มันจะเป็นสองเท่า ขนาดของบัฟเฟอร์ 549 00:24:55,410 --> 00:24:59,110 แล้วสองเท่าของขนาดของบัฟเฟอร์ และรหัสที่ไม่เป็นสองเท่าที่ 550 00:24:59,110 --> 00:25:03,170 ถ้าเรามองไปที่มันที่นี่ก็ เพียงแค่นี้ฉลาดหนึ่งซับ 551 00:25:03,170 --> 00:25:06,830 คุณอาจไม่ได้เห็นรูปแบบนี้ ก่อน แต่ถ้าคุณบอกว่าดาวเท่ากับ 552 00:25:06,830 --> 00:25:10,470 นี่คือสิ่งเดียวกับ บอกว่ากำลังการผลิตครั้งที่ 2 553 00:25:10,470 --> 00:25:13,390 ดังนั้นมันก็ช่วยเป็นสองเท่า ความจุของบัฟเฟอร์ 554 00:25:13,390 --> 00:25:17,480 แล้วบอก realloc ที่จะให้ ตัวเองว่าหน่วยความจำมากขึ้น 555 00:25:17,480 --> 00:25:19,720 >> ตอนนี้เป็นกันมี มีฟังก์ชั่นอื่น ๆ ที่นี่ 556 00:25:19,720 --> 00:25:23,680 ว่าเราจะได้ดูในรายละเอียดใด ๆ อื่น ๆ นอกเหนือจากที่จะแสดงใน GetInt, 557 00:25:23,680 --> 00:25:26,150 ที่เราใช้ใน GetString GetInt 558 00:25:26,150 --> 00:25:28,192 เราตรวจสอบว่ามันเป็นไม่ได้ null ซึ่งการเรียกคืน 559 00:25:28,192 --> 00:25:30,400 เป็นค่าพิเศษที่ หมายถึงสิ่งที่ผิดพลาดไป 560 00:25:30,400 --> 00:25:31,233 เราจะออกจากหน่วยความจำ 561 00:25:31,233 --> 00:25:32,310 การตรวจสอบที่ดีกว่าสำหรับการที่ 562 00:25:32,310 --> 00:25:33,710 และเรากลับค่าแมวมอง 563 00:25:33,710 --> 00:25:37,850 แต่ฉันจะเลื่อนการแสดงความคิดเห็นเป็นไป แล้วทำไมเราจะใช้ญาติห่าง ๆ ของ scanf นี้ 564 00:25:37,850 --> 00:25:42,100 เรียกว่า sscanf และมันจะเปิดออก ที่ sscanf หรือ scanf สตริง 565 00:25:42,100 --> 00:25:45,310 ช่วยให้คุณดูที่บรรทัดที่ ผู้ใช้มีการพิมพ์ในและแจ้งให้คุณ 566 00:25:45,310 --> 00:25:49,610 วิเคราะห์เป็นหลักและสิ่งที่ฉัน ทำอะไรที่นี่เป็นที่ฉันบอก sscanf, 567 00:25:49,610 --> 00:25:54,440 วิเคราะห์สิ่งที่ผู้ใช้มี พิมพ์ในและให้แน่ใจว่า% i, 568 00:25:54,440 --> 00:25:59,250 มีจำนวนเต็มในนั้นและเราจะไม่ ได้รับในวันนี้ว่าทำไมยังมี 569 00:25:59,250 --> 00:26:03,760 % ที่คที่นี่ แต่ในที่สั้นช่วยให้ เราในการตรวจสอบหากผู้ใช้พิมพ์ 570 00:26:03,760 --> 00:26:06,050 ในบางสิ่งบางอย่างหลังจากที่ปลอมจำนวน 571 00:26:06,050 --> 00:26:11,766 ดังนั้นเหตุผลที่ GetInt และ GetString บอกให้คุณลอง, ลอง, ลองใหม่อีกครั้ง 572 00:26:11,766 --> 00:26:13,640 เป็นเพราะทั้งหมดของ รหัสที่เราได้เขียน 573 00:26:13,640 --> 00:26:17,900 เป็นประเภทของการมองที่การป้อนข้อมูลของผู้ใช้ ในการทำให้แน่ใจว่ามันเป็นตัวเลขทั้งหมด 574 00:26:17,900 --> 00:26:21,700 หรือมันเป็นลอยที่เกิดขึ้นจริง ค่าจุดหรือเหมือน 575 00:26:21,700 --> 00:26:24,233 ขึ้นอยู่กับสิ่งที่มีค่า ทำงานที่คุณกำลังใช้ 576 00:26:24,233 --> 00:26:25,060 >> ว๊าย 577 00:26:25,060 --> 00:26:25,710 ตกลง. 578 00:26:25,710 --> 00:26:27,592 นั่นคือคำหนึ่ง แต่จุดที่นี่คือ 579 00:26:27,592 --> 00:26:29,550 ว่าเหตุผลที่เรามี ผู้ที่ล้อการฝึกอบรมใน 580 00:26:29,550 --> 00:26:32,880 เป็นเพราะอยู่ในระดับต่ำสุด มีเพียงสิ่งหลายอย่างที่ 581 00:26:32,880 --> 00:26:35,674 สามารถไปผิดที่เราต้องการ ที่จะจัดการกับ preemptively 582 00:26:35,674 --> 00:26:38,090 สิ่งเหล่านั้นอย่างแน่นอนใน สัปดาห์แรกของการเรียน 583 00:26:38,090 --> 00:26:42,230 แต่ตอนนี้มี PSet สี่และห้า PSet เกินกว่าที่คุณจะเห็นว่ามันมากขึ้นแก่ 584 00:26:42,230 --> 00:26:45,570 คุณ แต่คุณกำลังความสามารถมากขึ้น ของการแก้ชนิดของปัญหา 585 00:26:45,570 --> 00:26:47,180 ด้วยตัวคุณเอง 586 00:26:47,180 --> 00:26:51,770 คำถามใด ๆ เกี่ยวกับ GetString GetInt หรือ? 587 00:26:51,770 --> 00:26:52,630 ใช่? 588 00:26:52,630 --> 00:26:55,130 >> ผู้ชม: ทำไมคุณจะเป็นสองเท่า ความจุของบัฟเฟอร์ 589 00:26:55,130 --> 00:26:57,630 แทนที่จะเป็นเพียงที่เพิ่มขึ้น ได้โดยจำนวนเงินที่แน่นอน? 590 00:26:57,630 --> 00:26:58,100 >> DAVID ลัน: เป็นคำถามที่ดี 591 00:26:58,100 --> 00:27:00,474 ทำไมเราจะเป็นคู่ความจุ ของบัฟเฟอร์ตรงข้าม 592 00:27:00,474 --> 00:27:02,800 เพียงแค่เพิ่มขึ้นนั้น โดยบางส่วนค่าคงที่? 593 00:27:02,800 --> 00:27:03,900 มันเป็นการตัดสินใจออกแบบ 594 00:27:03,900 --> 00:27:08,590 เราก็ตัดสินใจว่าเพราะมันมีแนวโน้มที่จะ จะเป็นเพียงเล็กน้อยเวลาที่ชาญฉลาดที่มีราคาแพงที่จะถาม 595 00:27:08,590 --> 00:27:10,440 ระบบปฏิบัติการ สำหรับหน่วยความจำเราไม่ได้ 596 00:27:10,440 --> 00:27:13,210 ต้องการที่จะจบลงด้วยการได้รับใน สถานการณ์สำหรับสตริงใหญ่ 597 00:27:13,210 --> 00:27:14,960 ที่เราถาม ระบบปฏิบัติการอีกครั้งและอีกครั้ง 598 00:27:14,960 --> 00:27:17,500 และอีกครั้งและอีกครั้งใน อย่างรวดเร็วสำหรับหน่วยความจำ 599 00:27:17,500 --> 00:27:20,387 ดังนั้นเราก็ตัดสินใจที่ค่อนข้าง โดยพลการ แต่เราหวังที่สมเหตุสมผล 600 00:27:20,387 --> 00:27:22,720 ที่คุณรู้ว่าสิ่งที่ขอ พยายามที่จะรับล่วงหน้าของตัวเอง 601 00:27:22,720 --> 00:27:25,520 และเพียงแค่ให้เป็นสองเท่าเพื่อให้ เราลดจำนวนครั้ง 602 00:27:25,520 --> 00:27:29,010 เราจะต้องเรียก malloc หรือ realloc แต่การตัดสินรวม 603 00:27:29,010 --> 00:27:31,820 โทรในกรณีที่ไม่มีการรู้ สิ่งที่ผู้ใช้อาจต้องการที่จะพิมพ์ใน 604 00:27:31,820 --> 00:27:33,600 ทั้งสองวิธีอาจจะพิสูจน์ได้ 605 00:27:33,600 --> 00:27:35,430 เนื้อหาที่ดี 606 00:27:35,430 --> 00:27:39,240 >> ดังนั้นลองมาดูที่คู่ ผลข้างเคียงอื่น ๆ ของหน่วยความจำ 607 00:27:39,240 --> 00:27:41,610 สิ่งที่สามารถไปอย่างผิดปกติ และเครื่องมือที่คุณสามารถ 608 00:27:41,610 --> 00:27:43,880 ใช้ในการจับเหล่านี้ชนิดของความผิดพลาด 609 00:27:43,880 --> 00:27:47,800 มันจะเปิดออกทั้งหมดของคุณแม้ว่า check50 ยังไม่ได้บอกว่าคุณเป็นมาก 610 00:27:47,800 --> 00:27:50,050 ได้รับการเขียนรถ รหัสตั้งแต่หนึ่งสัปดาห์ 611 00:27:50,050 --> 00:27:53,630 แม้ว่าการทดสอบ check50 ทั้งหมดที่มี ผ่านไปและแม้ว่าคุณและ TF ของคุณ 612 00:27:53,630 --> 00:27:56,010 มีความมั่นใจสุดที่ รหัสของคุณทำงานได้ตามที่ตั้งใจไว้ 613 00:27:56,010 --> 00:27:59,190 รหัสของคุณได้รับรถหรือ ข้อบกพร่องในการที่พวกคุณทุกคน 614 00:27:59,190 --> 00:28:02,540 ในการใช้ห้องสมุด CS50, ได้รับการรั่วไหลของหน่วยความจำ 615 00:28:02,540 --> 00:28:06,040 คุณได้รับการขอให้ระบบปฏิบัติการ สำหรับหน่วยความจำในส่วนของโปรแกรม 616 00:28:06,040 --> 00:28:08,850 ที่คุณเขียน แต่คุณได้ ไม่เคยได้รับจริงมันกลับมา 617 00:28:08,850 --> 00:28:12,110 คุณได้เรียกว่า GetString และ GetInt และ GetFloat, 618 00:28:12,110 --> 00:28:15,270 แต่มี GetString คุณได้ ไม่เคยเรียก unGetString หรือให้ 619 00:28:15,270 --> 00:28:19,890 String กลับหรือชอบ แต่ที่เราได้เห็น ที่ GetString ไม่จัดสรรหน่วยความจำ 620 00:28:19,890 --> 00:28:22,810 โดยวิธีการนี​​้หรือ malloc realloc ฟังก์ชั่นซึ่งเป็นเพียง 621 00:28:22,810 --> 00:28:25,670 คล้ายกันมากในจิตวิญญาณ และยังเราได้รับ 622 00:28:25,670 --> 00:28:28,629 ขอให้ระบบปฏิบัติการสำหรับ หน่วยความจำและหน่วยความจำอีกครั้งและอีกครั้ง 623 00:28:28,629 --> 00:28:29,670 แต่ไม่เคยให้มันกลับมา 624 00:28:29,670 --> 00:28:33,550 >> ขณะนี้เป็นกันปรากฎว่า เมื่อโปรแกรมจบการทำงานทั้งหมดของหน่วยความจำ 625 00:28:33,550 --> 00:28:34,870 เป็นอิสระโดยอัตโนมัติ 626 00:28:34,870 --> 00:28:36,150 ดังนั้นจึงไม่ได้รับการจัดการที่มีขนาดใหญ่ 627 00:28:36,150 --> 00:28:38,590 มันไม่ได้ไปทำลาย IDE หรือสิ่งที่ช้าลง 628 00:28:38,590 --> 00:28:40,670 แต่เมื่อโปรแกรมทำ โดยทั่วไปหน่วยความจำรั่ว 629 00:28:40,670 --> 00:28:42,170 และพวกเขากำลังทำงานเป็นเวลานาน 630 00:28:42,170 --> 00:28:45,640 ถ้าคุณเคยเห็นเล็ก ๆ น้อย ๆ ที่โง่ ลูกบอลชายหาดใน Mac OS หรือนาฬิกาทราย 631 00:28:45,640 --> 00:28:51,160 บน Windows ที่มันเป็นชนิดของ การชะลอตัวลงหรือความคิดหรือความคิด 632 00:28:51,160 --> 00:28:53,770 หรือเพียงแค่เริ่มต้นจริงๆ ที่จะชะลอตัวในการรวบรวมข้อมูล, 633 00:28:53,770 --> 00:28:56,960 มันมากอาจจะเป็น ผลของการรั่วไหลของหน่วยความจำ 634 00:28:56,960 --> 00:28:59,970 โปรแกรมเมอร์ที่เขียน ซอฟแวร์ที่คุณใช้ 635 00:28:59,970 --> 00:29:03,570 ขอให้ระบบปฏิบัติการสำหรับหน่วยความจำ ทุกไม่กี่นาทีทุกชั่วโมง 636 00:29:03,570 --> 00:29:05,570 แต่ถ้าคุณใช้ ซอฟแวร์ถึงแม้ว่ามันจะเป็น 637 00:29:05,570 --> 00:29:08,680 ลดลงในเครื่องคอมพิวเตอร์ของคุณ สำหรับชั่วโมงหรือวันที่สิ้นสุด 638 00:29:08,680 --> 00:29:11,980 คุณอาจจะขอเพิ่มเติมและอื่น ๆ หน่วยความจำและไม่เคยใช้มันจริง 639 00:29:11,980 --> 00:29:15,180 และเพื่อให้รหัสของคุณอาจจะมีหรือ โปรแกรมอาจจะมีหน่วยความจำรั่ว 640 00:29:15,180 --> 00:29:18,350 และถ้าคุณเริ่มที่จะรั่วไหลของหน่วยความจำ มีหน่วยความจำน้อยสำหรับโปรแกรมอื่น ๆ 641 00:29:18,350 --> 00:29:21,220 และผลกระทบที่จะ ทุกอย่างช้าลง 642 00:29:21,220 --> 00:29:23,600 >> ตอนนี้คือไกลโดยหนึ่ง โปรแกรมที่เลวร้ายที่สุด 643 00:29:23,600 --> 00:29:26,350 คุณจะมีโอกาส ที่จะทำงานใน CS50 ตราบเท่า 644 00:29:26,350 --> 00:29:31,650 เป็นผลผลิตของตนแม้จะลึกลับมากกว่า เสียงดังกราวหรือทำให้หรือใด ๆ ของคำสั่ง 645 00:29:31,650 --> 00:29:35,930 โปรแกรมบรรทัดที่เราเคยทำงานมาก่อน แต่ โชคดีที่ฝังตัวอยู่ในเอาท์พุท 646 00:29:35,930 --> 00:29:39,810 คือบางส่วนเคล็ดลับที่เป็นประโยชน์สุดที่ จะเป็นประโยชน์ทั้งสำหรับ PSet สี่ 647 00:29:39,810 --> 00:29:41,510 หรืออย่างแน่นอน PSet ห้า 648 00:29:41,510 --> 00:29:44,250 valgrind ดังนั้นเป็นเครื่องมือ ที่สามารถนำมาใช้ในการมอง 649 00:29:44,250 --> 00:29:46,930 การรั่วไหลของหน่วยความจำในโปรแกรมของคุณ 650 00:29:46,930 --> 00:29:48,570 มันค่อนข้างง่ายที่จะทำงาน 651 00:29:48,570 --> 00:29:51,420 คุณเรียกใช้ valgrind แล้วแม้ แม้ว่ามันจะเป็นความละเอียดเล็ก ๆ น้อย ๆ 652 00:29:51,420 --> 00:29:54,440 รีบตรวจสอบการรั่วไหลของประ เท่ากับเต็มแล้วจุด 653 00:29:54,440 --> 00:29:56,320 เฉือนและชื่อของโปรแกรมของคุณ 654 00:29:56,320 --> 00:30:00,010 ดังนั้น valgrind จะเรียกใช้โปรแกรมของคุณ และในท้ายสุดของโปรแกรมของคุณ 655 00:30:00,010 --> 00:30:02,240 ทำงานก่อนที่จะจบการทำงานและ จะช่วยให้คุณพร้อมรับคำอื่น 656 00:30:02,240 --> 00:30:04,980 มันจะวิเคราะห์ของคุณ โปรแกรมในขณะที่มันถูกใช้ 657 00:30:04,980 --> 00:30:07,740 และบอกคุณคุณไม่รั่วไหล หน่วยความจำใด ๆ และยังดีกว่า 658 00:30:07,740 --> 00:30:10,610 คุณไม่ได้สัมผัสหน่วยความจำที่ ไม่ได้อยู่กับคุณหรือไม่ 659 00:30:10,610 --> 00:30:13,700 มันไม่สามารถจับทุกอย่าง แต่ก็ สวยดีที่จับสิ่งที่มากที่สุด 660 00:30:13,700 --> 00:30:19,700 >> ดังนั้นนี่คือตัวอย่างของการทำงานที่มีของฉัน โปรแกรมนี้มีการทำงาน valgrind, 661 00:30:19,700 --> 00:30:21,470 ในโปรแกรมที่เรียกว่า หน่วยความจำและฉันจะ 662 00:30:21,470 --> 00:30:24,730 เพื่อเน้นเส้นที่มี ในที่สุดความสนใจของเรา 663 00:30:24,730 --> 00:30:27,690 เพื่อให้มีการรบกวนมากยิ่งขึ้น ที่ฉันได้ลบออกจากสไลด์ 664 00:30:27,690 --> 00:30:30,930 แต่ขอเพียงแค่เห็นสิ่งนี้ โปรแกรมมีความสามารถในการบอกเรา 665 00:30:30,930 --> 00:30:34,800 มันเป็นความสามารถในการบอกเล่าสิ่งที่ เช่นการเขียนที่ไม่ถูกต้องขนาด 4 666 00:30:34,800 --> 00:30:38,020 ในคำอื่น ๆ ถ้าคุณสัมผัสหน่วยความจำ โดยเฉพาะ 4 ไบต์หน่วยความจำ 667 00:30:38,020 --> 00:30:40,350 ที่คุณไม่ควรจะมี valgrind สามารถบอกคุณได้ว่า 668 00:30:40,350 --> 00:30:41,660 เขียนไม่ถูกต้องขนาด 4 669 00:30:41,660 --> 00:30:43,640 คุณสัมผัสสี่ไบต์ ที่คุณไม่ควรจะมี 670 00:30:43,640 --> 00:30:44,840 ในกรณีที่คุณไม่ทำเช่นนั้น? 671 00:30:44,840 --> 00:30:45,900 นี่คือความงาม 672 00:30:45,900 --> 00:30:50,000 หน่วยความจำจุดเส้นค 21 เป็นที่ที่คุณ เมาขึ้นและที่ว่าทำไมมันเป็นประโยชน์ 673 00:30:50,000 --> 00:30:53,410 เหมือน GDB ก็สามารถช่วยให้ ชี้ให้คุณที่เกิดขึ้นจริงข้อผิดพลาด 674 00:30:53,410 --> 00:30:57,170 >> ตอนนี้คนนี้เป็นน้อยมาก อย่างละเอียดหากไม่ได้ทำให้เกิดความสับสน 675 00:30:57,170 --> 00:31:01,307 40 ไบต์ใน 1 บล็อกเป็นมั่นเหมาะ หายไปในบันทึกการสูญเสีย 1 จากทั้งหมด 1 676 00:31:01,307 --> 00:31:02,140 นั่นหมายความว่าอย่างไร? 677 00:31:02,140 --> 00:31:05,920 ดีมันก็หมายความว่าคุณถามหา 40 ไบต์และคุณไม่เคยให้มันกลับมา 678 00:31:05,920 --> 00:31:08,930 คุณเรียก malloc หรือที่เรียกว่า GetString และระบบปฏิบัติการ 679 00:31:08,930 --> 00:31:12,450 ให้คุณ 40 ไบต์ แต่คุณไม่เคย หรือได้รับการปล่อยตัวเป็นอิสระที่หน่วยความจำ 680 00:31:12,450 --> 00:31:15,400 และเพื่อความเป็นธรรมที่เราไม่เคยแสดง วิธีการที่จะให้กลับไปหน่วยความจำ 681 00:31:15,400 --> 00:31:17,910 เปิดออกมีซุปเปอร์ ฟังก์ชั่นที่เรียบง่ายที่เรียกว่าฟรี 682 00:31:17,910 --> 00:31:21,170 ใช้เวลาหนึ่งอาร์กิวเมนต์สิ่ง คุณต้องการที่จะเป็นอิสระหรือให้กลับ 683 00:31:21,170 --> 00:31:23,430 แต่ 40 ไบต์เห็นได้ชัด ในโปรแกรมนี้ 684 00:31:23,430 --> 00:31:27,300 ได้รับการสูญเสียที่เส้น 20 ของหน่วยความจำจุดค 685 00:31:27,300 --> 00:31:28,650 >> ดังนั้นเรามาดูโปรแกรมนี้ 686 00:31:28,650 --> 00:31:31,020 มันไม่มีประโยชน์สุด 687 00:31:31,020 --> 00:31:33,980 มันแสดงให้เห็นถึง ข้อผิดพลาดนี้โดยเฉพาะอย่างยิ่ง 688 00:31:33,980 --> 00:31:34,920 ดังนั้นลองมาดู 689 00:31:34,920 --> 00:31:39,920 นี่คือหลักและหลักแจ้งให้ทราบล่วงหน้าโทร ฟังก์ชั่นที่เรียกว่าฉแล้วผลตอบแทน 690 00:31:39,920 --> 00:31:41,550 ดังนั้นไม่ได้ทั้งหมดที่น่าสนใจ 691 00:31:41,550 --> 00:31:42,664 ฉไม่ทำอะไร? 692 00:31:42,664 --> 00:31:44,330 แจ้งให้ทราบผมไม่ได้รำคาญกับต้นแบบ 693 00:31:44,330 --> 00:31:46,520 ผมอยากจะให้รหัส เป็นน้อยที่สุดเท่าที่จะทำได้ 694 00:31:46,520 --> 00:31:49,530 ดังนั้นผมจึงใส่ฉข้างต้นหลักและ ที่ดีอย่างแน่นอน 695 00:31:49,530 --> 00:31:51,500 สำหรับโปรแกรมสั้น ๆ เช่นนี้ 696 00:31:51,500 --> 00:31:56,910 ดังนั้นฉไม่กลับอะไรและไม่ ได้ใช้อะไร แต่มันก็ไม่ทำเช่นนี้ 697 00:31:56,910 --> 00:31:59,620 มันบอกเหมือน ในตัวอย่างบิงกี้ 698 00:31:59,620 --> 00:32:02,682 ตัวชี้ที่เรียกว่า x ที่จะ ในการจัดเก็บที่อยู่ของ int ที่ 699 00:32:02,682 --> 00:32:03,890 ดังนั้นที่ด้านซ้ายมือ 700 00:32:03,890 --> 00:32:07,230 ในภาษาอังกฤษสิ่งที่เป็น ด้านขวามือทำ? 701 00:32:07,230 --> 00:32:09,770 ใคร? 702 00:32:09,770 --> 00:32:13,665 นี้จะทำอะไรสำหรับเรา? 703 00:32:13,665 --> 00:32:14,651 ใช่? 704 00:32:14,651 --> 00:32:16,623 >> ผู้ชม: [ไม่ได้ยิน] เท่าของ int ที่ 705 00:32:16,623 --> 00:32:19,175 ซึ่งเป็นครั้งที่ 10 [ไม่ได้ยิน] 706 00:32:19,175 --> 00:32:20,800 DAVID ลัน: ดีและแจ้งให้เราสรุป 707 00:32:20,800 --> 00:32:25,480 ดังนั้นการจัดสรรพื้นที่มากพอสำหรับ 10 จำนวนเต็ม หรือ 10 สิ่งที่ขนาดของ int ที่, 708 00:32:25,480 --> 00:32:29,340 มันเป็นสี่ไบต์ดังนั้น 10 ครั้งที่ 4 40 เพื่อให้ด้านขวามือที่ฉันได้ 709 00:32:29,340 --> 00:32:33,930 ไฮไลต์คือการให้ฉัน 40 ไบต์และ เก็บที่อยู่ของไบต์แรก 710 00:32:33,930 --> 00:32:34,940 เข้า x 711 00:32:34,940 --> 00:32:38,380 และตอนสุดท้ายและนี่คือที่ โปรแกรมนี้เป็นรถอะไร 712 00:32:38,380 --> 00:32:41,540 ผิดกับสาย 21 บนพื้นฐานของตรรกะที่? 713 00:32:41,540 --> 00:32:45,197 714 00:32:45,197 --> 00:32:46,280 มีอะไรผิดปกติกับสาย 21? 715 00:32:46,280 --> 00:32:46,780 ใช่? 716 00:32:46,780 --> 00:32:49,550 ผู้ชม: คุณไม่สามารถ ดัชนีลงใน x [ไม่ได้ยิน] 717 00:32:49,550 --> 00:32:50,300 DAVID ลัน: ใช่ 718 00:32:50,300 --> 00:32:52,270 ฉันไม่ควรดัชนีลงใน x เช่นนั้น 719 00:32:52,270 --> 00:32:53,850 ดังนั้น syntactically ที่ตกลง 720 00:32:53,850 --> 00:32:56,990 มีอะไรที่ดีคือเหมือนคุณ สามารถรักษาชื่อของอาร์เรย์ 721 00:32:56,990 --> 00:33:01,080 ราวกับว่ามันเป็นตัวชี้ในทำนองเดียวกัน คุณสามารถรักษาตัวชี้ราวกับว่ามันเป็น 722 00:33:01,080 --> 00:33:06,425 อาร์เรย์และดังนั้นผมจึงสามารถ syntactically พูดอะไรบางอย่าง x วงเล็บวงเล็บ x i, 723 00:33:06,425 --> 00:33:07,800 แต่เป็นปัญหาที่ 10 724 00:33:07,800 --> 00:33:09,096 ทำไม? 725 00:33:09,096 --> 00:33:10,910 >> ผู้ชม: เพ​​ราะมันไม่ได้อยู่ใน 726 00:33:10,910 --> 00:33:12,390 >> DAVID ลัน: มันไม่ได้ ภายในก้อนของหน่วยความจำที่ 727 00:33:12,390 --> 00:33:15,306 มีอะไรค่าที่ใหญ่ที่สุดที่ฉันควรจะ จะใส่ในวงเล็บเหลี่ยมเหล่านั้นหรือไม่ 728 00:33:15,306 --> 00:33:16,870 9 0 ถึง 9 729 00:33:16,870 --> 00:33:18,160 เพราะเป็นศูนย์การจัดทำดัชนี 730 00:33:18,160 --> 00:33:20,190 ดังนั้น 0 ถึง 9 จะปรับ 731 00:33:20,190 --> 00:33:23,960 Bracket 10 ไม่ดีและ แต่จำได้ว่าทุกครั้งที่ 732 00:33:23,960 --> 00:33:27,017 ฉันดูเหมือนจะพยายามที่จะทำให้ CS50 IDE ความผิดพลาดโดยการพิมพ์ค่าปลอม 733 00:33:27,017 --> 00:33:29,100 ไม่เคยให้ความร่วมมือ และแน่นอนคุณมักจะ 734 00:33:29,100 --> 00:33:31,460 ได้รับโชคดีเพียงเพราะ ระบบปฏิบัติการที่ไม่ได้ 735 00:33:31,460 --> 00:33:35,467 สังเกตเห็นว่าคุณเคยดังนั้นเล็กน้อย ผ่านก้อนบางส่วนของหน่วยความจำ 736 00:33:35,467 --> 00:33:38,300 เพราะคุณอยู่ภายในในทางเทคนิค ส่วนของคุณ แต่เพิ่มเติมว่า 737 00:33:38,300 --> 00:33:40,940 ในชั้นเรียนระบบปฏิบัติการ และอื่น ๆ บางอย่างเช่นนี้ 738 00:33:40,940 --> 00:33:43,000 ได้อย่างง่ายดายมากสามารถไปตรวจไม่พบ 739 00:33:43,000 --> 00:33:48,120 โปรแกรมของคุณไม่เคยไปผิดพลาด อย่างต่อเนื่อง แต่อาจจะครั้งในชั่วขณะหนึ่ง 740 00:33:48,120 --> 00:33:50,610 >> ดังนั้นลอง valgrind เกี่ยวกับเรื่องนี้และนี่คือ 741 00:33:50,610 --> 00:33:52,870 ที่เราจะได้รับจม โดยการส่งออกไปชั่วขณะ 742 00:33:52,870 --> 00:34:00,810 เพื่อให้ตรวจสอบการรั่วไหลของหน่วยความจำ valgrind เท่ากับจุดเต็มหน่วยความจำเฉือน 743 00:34:00,810 --> 00:34:03,040 และนี่คือเหตุผลที่ผมสัญญาว่า นี้จะครอบงำ 744 00:34:03,040 --> 00:34:05,700 นี่คือสิ่งที่ valgrind นี่คือสิ่งที่ โปรแกรมเมอร์หลายปี ago- 745 00:34:05,700 --> 00:34:08,469 ตัดสินใจว่ามันจะเป็นความคิดที่ดี สำหรับการส่งออกให้มีลักษณะเหมือน 746 00:34:08,469 --> 00:34:09,750 ดังนั้นขอให้ความรู้สึกนี้ 747 00:34:09,750 --> 00:34:13,120 ดังนั้นทุกทางด้านซ้ายมือ ด้านไม่มีเหตุผลที่ดี 748 00:34:13,120 --> 00:34:16,620 เป็นกระบวนการ ID ของโปรแกรม เราเพียงแค่เรียกใช้ตัวบ่งชี้เฉพาะ 749 00:34:16,620 --> 00:34:18,030 สำหรับโปรแกรมที่เราเพิ่งวิ่ง 750 00:34:18,030 --> 00:34:19,738 เราลบจาก สไลด์ แต่มี 751 00:34:19,738 --> 00:34:22,190 เป็นข้อมูลที่เป็นประโยชน์ในที่นี่ 752 00:34:22,190 --> 00:34:24,684 >> ขอเลื่อนขึ้นไปด้านบนสุด 753 00:34:24,684 --> 00:34:25,600 นี่คือสิ่งที่เราเริ่ม 754 00:34:25,600 --> 00:34:27,040 ดังนั้นจึงไม่ได้ทั้งหมดที่ส่งออกมาก 755 00:34:27,040 --> 00:34:30,429 นี่เป็นเรื่องที่ไม่ถูกต้องในการเขียน ขนาด 4 ในบรรทัดที่ 21 756 00:34:30,429 --> 00:34:31,760 ดีสิ่งที่เป็นสาย 21? 757 00:34:31,760 --> 00:34:34,500 สาย 21 ตรง นี้และมันทำให้รู้สึก 758 00:34:34,500 --> 00:34:37,290 ที่ผมอยู่ในการสั่งจ่ายยา เขียน 4 ไบต์เพราะฉัน 759 00:34:37,290 --> 00:34:40,389 พยายามที่จะนำจำนวนเต็มนี้ ซึ่งอาจจะเป็นอะไร 760 00:34:40,389 --> 00:34:42,370 มันก็จะเกิดขึ้น ศูนย์ แต่ฉันพยายาม 761 00:34:42,370 --> 00:34:44,940 ที่จะนำมันที่สถานที่ ที่ไม่ได้อยู่กับผม 762 00:34:44,940 --> 00:34:50,900 นอกจากนี้ที่นี่ 40 ไบต์ในหนึ่ง บล็อกจะหายไปแน่นอนใน 1 รายการ 763 00:34:50,900 --> 00:34:56,500 นั่นเป็นเพราะเมื่อผมเรียก malloc ที่นี่ผมไม่เคยเป็นอิสระของหน่วยความจำ 764 00:34:56,500 --> 00:34:58,140 >> ดังนั้นวิธีที่เราสามารถแก้ไขปัญหานี้? 765 00:34:58,140 --> 00:35:02,970 ให้ฉันไปข้างหน้าและจะมีความปลอดภัยน้อย และจะมี 9 และแจ้งให้เราที่นี่ฟรี x 766 00:35:02,970 --> 00:35:04,820 นี้เป็นฟังก์ชั่นใหม่สำหรับวันนี้ 767 00:35:04,820 --> 00:35:11,520 ถ้าตอนนี้ผมเรียกให้หน่วยความจำเฉือนจุด ขอเรียก valgrind กับมันอีกครั้ง 768 00:35:11,520 --> 00:35:14,990 เพิ่มหน้าต่างของฉันและกด Enter 769 00:35:14,990 --> 00:35:16,900 ตอนนี้มันเป็นสิ่งที่ดี 770 00:35:16,900 --> 00:35:19,590 พวกเขาฝังข่าวดี ในทุกการแสดงผลนี้ 771 00:35:19,590 --> 00:35:20,810 บล็อกกองทุกคนฟรี 772 00:35:20,810 --> 00:35:23,604 เราจะกลับมากับสิ่งที่กอง แต่ไม่มีการรั่วไหลที่เป็นไปได้ 773 00:35:23,604 --> 00:35:25,520 ดังนั้นนี่เป็นเพียงอีกหนึ่ง เครื่องมือสำหรับชุดเครื่องมือของคุณ 774 00:35:25,520 --> 00:35:30,220 ที่คุณสามารถเริ่มต้นที่จะ หาข้อผิดพลาดในขณะนี้เช่นเดียวกับที่ 775 00:35:30,220 --> 00:35:34,532 >> แต่ขอดูสิ่งที่ อื่น ๆ อีกมากมายสามารถไปผิดที่นี่ 776 00:35:34,532 --> 00:35:38,890 การเปลี่ยนแปลงตอนนี้ขอไป จริงการแก้ปัญหา 777 00:35:38,890 --> 00:35:42,440 เช่นกันว่าจะบรรเทา นิด ๆ หน่อย ๆ ของความสับสนหรือความตึงเครียด 778 00:35:42,440 --> 00:35:43,430 นี้คือตอนนี้ตลก 779 00:35:43,430 --> 00:35:46,400 780 00:35:46,400 --> 00:35:46,900 ใช่ 781 00:35:46,900 --> 00:35:49,040 นั่นเป็นสิ่งที่ดีงาม 782 00:35:49,040 --> 00:35:50,890 เพราะเป็นตัวชี้ ที่อยู่และที่อยู่ 783 00:35:50,890 --> 00:35:53,098 โดยทั่วไปมักจะโดยการประชุม เขียนด้วยเลขฐานสิบหก 784 00:35:53,098 --> 00:35:54,650 ฮ่านี้เป็นเรื่องตลกในขณะนี้ 785 00:35:54,650 --> 00:35:58,390 ทั้งนี้เพื่อให้ในขณะนี้ จริงแก้ปัญหา 786 00:35:58,390 --> 00:36:00,840 นี้ได้รับสุด ซุปเปอร์ระดับต่ำป่านนี้ 787 00:36:00,840 --> 00:36:03,950 และเราสามารถทำได้จริงมีประโยชน์ สิ่งที่มีรายละเอียดเหล่านี้ในระดับต่ำ 788 00:36:03,950 --> 00:36:06,710 >> ดังนั้นเราจึงแนะนำเพียงไม่กี่สัปดาห์ ที่ผ่านมาความคิดของอาร์เรย์ 789 00:36:06,710 --> 00:36:09,177 อาร์เรย์เป็นดีเพราะ มันยากที่จะทำความสะอาดรหัสของเรา 790 00:36:09,177 --> 00:36:11,760 เพราะถ้าเราต้องการที่จะเขียน โปรแกรมที่มีนักเรียนหลาย 791 00:36:11,760 --> 00:36:15,270 หรือหลายชื่อและที่บ้าน หอพักและวิทยาลัยและทั้งหมดที่ 792 00:36:15,270 --> 00:36:19,430 เราจะเก็บทุกอย่างมากขึ้น เรียบร้อยภายในอาร์เรย์ 793 00:36:19,430 --> 00:36:23,039 แต่ข้อเสียเสนอหนึ่ง ของอาร์เรย์ป่านนี้ 794 00:36:23,039 --> 00:36:26,080 แม้ว่าคุณจะได้รับความเดือดร้อนไม่ได้ด้วยตัวคุณเอง ในโปรแกรมเพียงสัญชาตญาณ 795 00:36:26,080 --> 00:36:30,870 สิ่งที่เป็นสิ่งที่ไม่ดี เกี่ยวกับอาร์เรย์บางที? 796 00:36:30,870 --> 00:36:32,337 ฉันได้ยินเสียงพึมพำบางอย่าง 797 00:36:32,337 --> 00:36:34,170 ผู้ชม: มันยาก การเปลี่ยนขนาด 798 00:36:34,170 --> 00:36:36,128 DAVID ลัน: มันเป็นเรื่องยาก การเปลี่ยนขนาด 799 00:36:36,128 --> 00:36:38,660 คุณไม่สามารถเปลี่ยนขนาด ของอาร์เรย์ในความเป็นจริงต่อ 800 00:36:38,660 --> 00:36:43,040 ใน C. คุณสามารถจัดสรรอาร์เรย์อื่น ย้ายทุกอย่างจากคนเก่า 801 00:36:43,040 --> 00:36:45,380 เข้าไปใหม่และตอนนี้ มีพื้นที่พิเศษ 802 00:36:45,380 --> 00:36:47,469 แต่ก็ไม่ชอบ ภาษาเช่น Java หรืองูหลาม 803 00:36:47,469 --> 00:36:49,760 หรือจำนวนอื่น ๆ ภาษาที่บางส่วนของคุณ 804 00:36:49,760 --> 00:36:52,070 อาจจะคุ้นเคยที่คุณ ก็สามารถเก็บเพิ่มสิ่ง 805 00:36:52,070 --> 00:36:53,930 nauseam โฆษณาไปยังจุดสิ้นสุดของอาร์เรย์ 806 00:36:53,930 --> 00:36:57,880 เมื่อคุณมีอาร์เรย์ของ ขนาด 6 ซึ่งก็คือขนาดของมัน 807 00:36:57,880 --> 00:37:01,970 และอื่น ๆ อีกเช่นความคิดที่ก่อนหน้านี้ มีบัฟเฟอร์ที่มีขนาดบางอย่าง 808 00:37:01,970 --> 00:37:05,940 คุณมีที่จะคาดเดาออกจากประตู สิ่งที่ขนาดที่คุณอยากให้มันเป็นอย่างไร 809 00:37:05,940 --> 00:37:07,880 ถ้าคุณคิดว่าใหญ่เกินไป คุณกำลังสูญเสียพื้นที่ 810 00:37:07,880 --> 00:37:10,950 ถ้าคุณคิดว่าเล็กเกินไปคุณ ไม่สามารถเก็บข้อมูลได้ว่าอย่างน้อย 811 00:37:10,950 --> 00:37:12,940 โดยไม่ต้องทำงานมากขึ้น 812 00:37:12,940 --> 00:37:18,180 >> ดังนั้นวันนี้ต้องขอบคุณคำแนะนำเราสามารถ เริ่มต้นที่กำหนดเองเย็บเข้าด้วยกันของเราเอง 813 00:37:18,180 --> 00:37:20,989 โครงสร้างข้อมูลและใน ความเป็นจริงนี่คือสิ่งที่ 814 00:37:20,989 --> 00:37:23,030 ที่มีลักษณะเล็ก ๆ น้อย ๆ ความลับได้อย่างรวดเร็วก่อน 815 00:37:23,030 --> 00:37:26,440 แต่นี่คือสิ่งที่เราจะเรียกการเชื่อมโยง รายการและชื่อชนิดของการสรุป 816 00:37:26,440 --> 00:37:26,940 มัน 817 00:37:26,940 --> 00:37:29,550 มันเป็นรายการของตัวเลขหรือใน กรณีนี้รายการของตัวเลข 818 00:37:29,550 --> 00:37:33,480 แต่มันอาจจะเป็นรายการอะไร แต่ มันเชื่อมโยงกันโดยวิธีการของลูกศร 819 00:37:33,480 --> 00:37:36,380 และใช้เวลาเพียงแค่คาดเดา ด้วยเทคนิคสิ่งที่ 820 00:37:36,380 --> 00:37:38,310 เราจะสามารถ เพื่อตะเข็บด้วยกัน 821 00:37:38,310 --> 00:37:42,540 ประเภทเช่นข้าวโพดคั่วกับด้าย สี่เหลี่ยมรายการที่เชื่อมโยงที่นี่? 822 00:37:42,540 --> 00:37:43,936 ตัวเลขของตนหรือไม่ 823 00:37:43,936 --> 00:37:45,560 คุณลักษณะภาษาพื้นฐานคืออะไร? 824 00:37:45,560 --> 00:37:46,350 >> ผู้ชม: ตัวชี้ 825 00:37:46,350 --> 00:37:47,308 >> DAVID ลัน: ตัวชี้ 826 00:37:47,308 --> 00:37:51,700 ดังนั้นแต่ละลูกศรเหล่านี้แสดงให้เห็นถึงที่นี่ ตัวชี้หรือเพียงแค่ที่อยู่ 827 00:37:51,700 --> 00:37:54,590 ดังนั้นในคำอื่น ๆ ถ้าฉันต้องการ ในการจัดเก็บรายชื่อของตัวเลข 828 00:37:54,590 --> 00:37:59,040 ผมก็ไม่สามารถเก็บไว้ถ้าผมต้องการ ความสามารถในการเติบโตและหดตัว 829 00:37:59,040 --> 00:38:00,990 โครงสร้างข้อมูลของฉันในอาร์เรย์ 830 00:38:00,990 --> 00:38:03,000 ดังนั้นผมจึงจำเป็นต้องมีเล็ก ๆ น้อย ๆ ความซับซ้อนมากขึ้น 831 00:38:03,000 --> 00:38:05,720 แต่แจ้งให้ทราบว่า ภาพที่แสดงให้เห็นชนิดของ 832 00:38:05,720 --> 00:38:08,650 ว่าถ้าคุณได้เพียงแค่หัวข้อเล็ก ๆ น้อย ๆ เชื่อมต่อทุกอย่างเข้าด้วยกัน 833 00:38:08,650 --> 00:38:13,100 อาจจะไม่ยากที่จะทำให้พื้นที่ ในระหว่างสองสี่เหลี่ยมเหล่านั้น 834 00:38:13,100 --> 00:38:16,750 หรือสองของโหนดเหล่านั้นที่เราจะเริ่มต้น เรียกพวกเขาใส่ในโหนดใหม่ 835 00:38:16,750 --> 00:38:19,547 แล้วกับบางหัวข้อใหม่เพียง คลองสามโหนดด้วยกัน 836 00:38:19,547 --> 00:38:22,880 คนแรกคนสุดท้ายและคน ที่คุณเพิ่งแทรกเข้าไปตรงกลาง 837 00:38:22,880 --> 00:38:26,000 >> และแน่นอนรายการเชื่อมโยง ซึ่งแตกต่างจากอาร์เรย์เป็นแบบไดนามิก 838 00:38:26,000 --> 00:38:27,840 มันสามารถเติบโตและสามารถ หดตัวและคุณทำไม่ได้ 839 00:38:27,840 --> 00:38:32,434 ต้องรู้หรือการดูแลล่วงหน้าว่า ข้อมูลที่คุณกำลังจะได้รับการจัดเก็บ 840 00:38:32,434 --> 00:38:35,600 แต่ปรากฎว่าเราจะต้องมีเล็ก ๆ น้อย ๆ โปรดใช้ความระมัดระวังเกี่ยวกับวิธีการดำเนินการนี​​้ 841 00:38:35,600 --> 00:38:39,070 ดังนั้นก่อนให้พิจารณาวิธีการที่เราใช้ หนึ่งในรูปสี่เหลี่ยมเล็ก ๆ น้อย ๆ เหล่านี้ 842 00:38:39,070 --> 00:38:40,690 มันเป็นเรื่องง่ายที่จะใช้เป็น int 843 00:38:40,690 --> 00:38:44,000 คุณเพียงแค่บอกว่า int n แล้​​ว คุณจะได้รับ 4 ไบต์สำหรับ int ที่ 844 00:38:44,000 --> 00:38:49,089 แต่วิธีการที่ฉันจะได้รับ int ที่เรียกว่า n, แล้วชี้ขอเรียกมันต่อไป 845 00:38:49,089 --> 00:38:50,880 เราสามารถเรียกเหล่านี้ สิ่งที่เราต้องการอะไร 846 00:38:50,880 --> 00:38:53,590 แต่ผมจำเป็นต้องมีโครงสร้างข้อมูลที่กำหนดเอง 847 00:38:53,590 --> 00:38:54,257 ใช่? 848 00:38:54,257 --> 00:38:57,020 >> ผู้ชม: สัญลักษณ์ [ไม่ได้ยิน] 849 00:38:57,020 --> 00:39:00,940 >> DAVID ลัน: ดังนั้นเครื่องหมายที่เราจะใช้ในการ ได้รับที่อยู่ของโหนดที่อาจเกิดขึ้น 850 00:39:00,940 --> 00:39:02,740 แต่เราจำเป็นอีก คุณลักษณะของ C ในการสั่งซื้อ 851 00:39:02,740 --> 00:39:06,700 จะให้ฉันสามารถในการสร้าง สี่เหลี่ยมผืนผ้าที่กำหนดเองนี้นี้เอง 852 00:39:06,700 --> 00:39:08,919 ตัวแปรถ้าคุณจะในความทรงจำ 853 00:39:08,919 --> 00:39:09,710 ผู้ชม: struct 854 00:39:09,710 --> 00:39:10,626 DAVID ลัน: struct 855 00:39:10,626 --> 00:39:14,310 จำจากสัปดาห์ที่แล้วเราได้แนะนำ struct นี้คำหลักที่ค่อนข้างง่าย 856 00:39:14,310 --> 00:39:16,254 ที่ช่วยให้เราทำสิ่งนี้ 857 00:39:16,254 --> 00:39:18,420 C ไม่ได้มาพร้อมกับข้อมูลที่ โครงสร้างที่เรียกว่านักเรียน 858 00:39:18,420 --> 00:39:22,190 มันมาพร้อมกับ int และลอยและถ่านและ ดังกล่าว แต่ก็ไม่ได้มาพร้อมกับนักเรียน 859 00:39:22,190 --> 00:39:26,750 แต่เราสามารถสร้างชนิดข้อมูลนักเรียน โครงสร้างของนักเรียนที่มีรูปแบบนี้ 860 00:39:26,750 --> 00:39:27,250 ที่นี่ 861 00:39:27,250 --> 00:39:28,350 และคุณจะเห็นนี้อีกครั้งและอีกครั้ง 862 00:39:28,350 --> 00:39:30,426 จึงไม่ต้องกังวลเกี่ยวกับ จำคำหลัก 863 00:39:30,426 --> 00:39:33,300 แต่คำหลักที่สำคัญคือ เพียงแค่ความจริงที่ว่าเรากล่าวว่าที่ struct 864 00:39:33,300 --> 00:39:37,590 และจากนั้นเราเรียกมันว่านักเรียนและภายใน ของนักเรียนเป็นชื่อและที่บ้าน 865 00:39:37,590 --> 00:39:39,390 หรือหอพักหรือชอบ 866 00:39:39,390 --> 00:39:41,980 >> และตอนนี้ดังนั้นวันนี้ขอนำเสนอนี้ 867 00:39:41,980 --> 00:39:45,240 ฉันได้เพิ่มคำไม่กี่คำ แต่ถ้าฉันต้องการ ที่จะใช้รูปสี่เหลี่ยมผืนผ้านี้ที่ 868 00:39:45,240 --> 00:39:48,440 มีทั้ง int และ ตัวชี้คุณรู้ว่าสิ่งที่ฉัน 869 00:39:48,440 --> 00:39:51,540 จะประกาศโครงสร้างที่เรียกว่าโหนด 870 00:39:51,540 --> 00:39:55,630 ฉันยังภายในของมันจะบอกว่า ที่โหนดสี่เหลี่ยมนี้มีอยู่ int 871 00:39:55,630 --> 00:39:59,730 และเราจะเรียกมันว่า n และ มีตัวชี้ต่อไป 872 00:39:59,730 --> 00:40:02,540 และนี่เป็นเพียงเล็กน้อยอย่างละเอียด, แต่ถ้าคุณคิดเกี่ยวกับมัน 873 00:40:02,540 --> 00:40:07,300 ลูกศรที่อยู่ในภาพ ช่วงเวลาที่ผ่านมาเป็นสิ่งที่ประเภทข้อมูล? 874 00:40:07,300 --> 00:40:12,330 ที่แต่ละของลูกศรชี้เหล่านั้น เพื่อสิ่งที่ประเภทของโครงสร้างข้อมูล? 875 00:40:12,330 --> 00:40:14,332 มันไม่ได้เป็นเพียงแค่ชี้ไป int ต่อ 876 00:40:14,332 --> 00:40:16,165 มันชี้ไปที่ ทั้งสิ่งที่เป็นรูปสี่เหลี่ยมผืนผ้า 877 00:40:16,165 --> 00:40:18,720 และสิ่งที่เป็นรูปสี่เหลี่ยมผืนผ้า เรากล่าวว่าจะเรียกว่าโหนด 878 00:40:18,720 --> 00:40:21,720 และเพื่อให้เราชนิดของต้อง ซ้ำกำหนดเช่นนี้ 879 00:40:21,720 --> 00:40:26,270 โหนดที่เราจะพูดว่า จะมี int เรียกว่า n 880 00:40:26,270 --> 00:40:31,070 และตัวชี้ที่เรียกว่าต่อไปและ ชนิดของโครงสร้างข้อมูลที่ 881 00:40:31,070 --> 00:40:35,770 ชี้จุดที่เห็นได้ชัดคือ จะเป็นโหนด struct 882 00:40:35,770 --> 00:40:41,550 >> ดังนั้นนี่คือ verbose annoyingly และก็จะอวดความรู้ 883 00:40:41,550 --> 00:40:44,100 เหตุผลที่ว่าทำไมเราไม่สามารถ เพียงแค่พูดว่านี้ซึ่งตรงไปตรงมา 884 00:40:44,100 --> 00:40:46,860 ดูมากอ่านได้มากขึ้น เป็นเพราะการเรียกคืนที่ C อ่าน 885 00:40:46,860 --> 00:40:48,710 สิ่งบนลงล่างซ้ายไปขวา 886 00:40:48,710 --> 00:40:54,120 มันไม่ได้จนกว่าเราจะได้รับอัฒภาค ที่โหนดคำที่มีอยู่จริง 887 00:40:54,120 --> 00:40:57,980 ดังนั้นหากเราต้องการที่จะมีการจัดเรียงของนี้ อ้างอิงวัฏจักรภายในของข้อมูล 888 00:40:57,980 --> 00:41:02,120 โครงสร้างเราจะต้องทำเช่นนี้ที่ เราบอกว่าโหนด struct ที่ด้านบนที่ 889 00:41:02,120 --> 00:41:06,770 ทำให้เรามีวิธีการอธิบายอีกต่อไปนี้ สิ่งที่แล้วเราบอกว่าภายในโหนด struct, 890 00:41:06,770 --> 00:41:09,560 แล้วที่บรรทัดสุดท้าย เราพูดสิ่งที่ถูกต้อง, C, โดยวิธีการที่ 891 00:41:09,560 --> 00:41:12,060 เพียงโทรนี้แช่งทั้ง สิ่งโหนดและหยุด 892 00:41:12,060 --> 00:41:14,360 โดยใช้โครงสร้างคำหลักทั้งหมด 893 00:41:14,360 --> 00:41:18,030 ดังนั้นนี้เป็นเพียงการเรียงลำดับของประโยค เคล็ดลับที่ว่าในท้ายที่สุดจะช่วยให้เราสร้าง 894 00:41:18,030 --> 00:41:21,370 บางสิ่งบางอย่างที่มีลักษณะเช่นนี้ว่า 895 00:41:21,370 --> 00:41:25,010 >> ดังนั้นถ้าเราคิดที่เราสามารถทำได้ในขณะนี้ ใช้สิ่งนี้ในซี 896 00:41:25,010 --> 00:41:28,040 ทำอย่างไรเราจริง เริ่มต้นภายในนี้หรือไม่? 897 00:41:28,040 --> 00:41:32,360 ดีในความเป็นจริงทั้งหมดที่เราต้องทำคือ ย้ำจากซ้ายไปขวาและเพียงแค่ 898 00:41:32,360 --> 00:41:35,960 ชนิดของการแทรกโหนดหรือลบโหนด หรือค้นหาสิ่งใดก็ตามที่เราต้องการ 899 00:41:35,960 --> 00:41:39,560 แต่การทำเช่นนี้ให้เป็นไปข้างหน้าและทำให้ สิ่งเล็ก ๆ น้อย ๆ จริงมากขึ้นเพราะ 900 00:41:39,560 --> 00:41:42,560 ได้รับซุปเปอร์ระดับต่ำป่านนี้ 901 00:41:42,560 --> 00:41:45,700 ทุกคนจะชอบอย่างแท้จริงเป็นครั้งแรก? 902 00:41:45,700 --> 00:41:46,200 ตกลง. 903 00:41:46,200 --> 00:41:47,092 มาขึ้น 904 00:41:47,092 --> 00:41:47,800 คุณชื่ออะไร? 905 00:41:47,800 --> 00:41:48,499 >> เดวิด: เดวิด 906 00:41:48,499 --> 00:41:49,290 DAVID ลัน: เดวิด 907 00:41:49,290 --> 00:41:49,998 ยินดีที่ได้พบคุณ. 908 00:41:49,998 --> 00:41:50,960 ฉันด้วย. 909 00:41:50,960 --> 00:41:52,450 ทั้งหมดขวา 910 00:41:52,450 --> 00:41:53,990 และเราต้องมีหมายเลข 9 911 00:41:53,990 --> 00:41:55,240 ไม่ดีเท่าครั้งแรกอาจจะ 912 00:41:55,240 --> 00:41:56,430 ตกลงจำนวน 9 913 00:41:56,430 --> 00:41:59,667 จำนวน 17 โปรด 914 00:41:59,667 --> 00:42:01,000 ผมขอกลับไปไกลออกไปเล็กน้อย 915 00:42:01,000 --> 00:42:03,980 จำนวน 22 โปรดและ วิธีการเกี่ยวกับไกลออกไปกลับ 916 00:42:03,980 --> 00:42:06,344 ถ้าฉันสามารถดูมือใด ๆ กับแสงหรือไม่มีเลย 917 00:42:06,344 --> 00:42:08,010 ใครบางคนที่ถูกอาสาสมัครที่นั่น 918 00:42:08,010 --> 00:42:08,968 คุณต้องการที่จะเกิดขึ้น? 919 00:42:08,968 --> 00:42:10,450 แขนของคุณจะถูกบังคับให้ไปขึ้น 920 00:42:10,450 --> 00:42:12,340 ตกลง 17 921 00:42:12,340 --> 00:42:13,690 22 922 00:42:13,690 --> 00:42:15,120 26 ลงมา 923 00:42:15,120 --> 00:42:18,450 คนอื่นต้องการที่จะ forcefully-- มาขึ้น 924 00:42:18,450 --> 00:42:21,030 อาสาสมัครที่เกิดขึ้นจริง 925 00:42:21,030 --> 00:42:23,330 >> ดังนั้นอย่างรวดเร็วถ้า พวกคุณสามารถจัด 926 00:42:23,330 --> 00:42:26,550 เช่นเดียวกับตัวเอง โหนดบนหน้าจอ 927 00:42:26,550 --> 00:42:27,510 ขอขอบคุณ. 928 00:42:27,510 --> 00:42:29,234 และคุณจะได้ 26 929 00:42:29,234 --> 00:42:30,650 สิ่งที่ถูกต้องและการแนะนำอย่างรวดเร็ว 930 00:42:30,650 --> 00:42:32,139 ดังนั้นฉันเดวิดและคุณยัง? 931 00:42:32,139 --> 00:42:32,680 เดวิด: เดวิด 932 00:42:32,680 --> 00:42:33,721 DAVID ลัน: และคุณคืออะไร? 933 00:42:33,721 --> 00:42:34,229 JAKE: เจค 934 00:42:34,229 --> 00:42:34,729 ซู: บางซื่อ 935 00:42:34,729 --> 00:42:35,229 อเล็กซ์: อเล็กซ์ 936 00:42:35,229 --> 00:42:36,475 ราฟาเอล: ราฟาเอล 937 00:42:36,475 --> 00:42:37,100 TAYLOR: เทย์เลอร์ 938 00:42:37,100 --> 00:42:37,466 DAVID ลัน: เทย์เลอร์ 939 00:42:37,466 --> 00:42:37,590 ที่ดีเยี่ยม 940 00:42:37,590 --> 00:42:39,810 ดังนั้นเหล่านี้เป็นอาสาสมัครของเรา สำหรับวันนี้และไปข้างหน้า 941 00:42:39,810 --> 00:42:43,090 และเปลี่ยนเล็ก ๆ น้อย ๆ วิธีการที่ และเพียงแค่ไปข้างหน้าและให้ 942 00:42:43,090 --> 00:42:47,024 ถือหมายเลขของคุณในขณะที่คุณอยู่หรือ สัญญาณแรกและการใช้มือซ้ายของคุณ 943 00:42:47,024 --> 00:42:48,940 ไปข้างหน้าและใช้เพียง ลูกศรเหล่านี้เพียง 944 00:42:48,940 --> 00:42:51,360 เพื่อให้มือซ้ายของคุณเป็นตัวอักษร ชี้ไปที่สิ่งที่คุณควรจะชี้ 945 00:42:51,360 --> 00:42:54,610 ที่และให้ตัวเองเพื่อให้ห้องพักบางส่วน เราสายตาสามารถมองเห็นแขนของคุณจริง 946 00:42:54,610 --> 00:42:58,120 ชี้และคุณก็สามารถชี้ การจัดเรียงของที่พื้นจะปรับ 947 00:42:58,120 --> 00:43:03,040 >> ดังนั้นที่นี่เรามีรายการที่เชื่อมโยงหนึ่ง สองสามสี่ห้าโหนดแรก 948 00:43:03,040 --> 00:43:05,860 และแจ้งให้ทราบว่าเรามีพิเศษนี้ ชี้ที่จุดเริ่มต้นที่เป็น 949 00:43:05,860 --> 00:43:09,770 ที่สำคัญเพราะเรามีการติดตาม ของรายการตลอดความยาวอย่างใด 950 00:43:09,770 --> 00:43:13,590 พวกเหล่านี้ถึงแม้ว่าพวกเขาจะเหลือ ไปขวากลับไปกลับในหน่วยความจำ 951 00:43:13,590 --> 00:43:15,950 พวกเขาเป็นจริงได้ทุกที่ ในหน่วยความจำของคอมพิวเตอร์ 952 00:43:15,950 --> 00:43:18,240 ดังนั้นคนเหล่านี้อาจจะเป็น ยืนอยู่ที่ใดก็ได้บนเวที 953 00:43:18,240 --> 00:43:20,960 และที่ดีตราบใดที่พวกเขากำลัง จริงชี้ไปที่อีกคนหนึ่ง 954 00:43:20,960 --> 00:43:22,770 แต่เพื่อให้สิ่งที่ สะอาดและเรียบง่ายเราจะ 955 00:43:22,770 --> 00:43:25,728 พวกเขาเพียงแค่วาดจากซ้ายไปขวาเช่น นี้ แต่อาจจะมีช่องว่างขนาดใหญ่ 956 00:43:25,728 --> 00:43:26,790 ในระหว่างโหนดเหล่านั้น 957 00:43:26,790 --> 00:43:30,710 >> ตอนนี้ถ้าผมต้องการที่จะใส่จริงบางอย่าง ค่าใหม่ให้เป็นไปข้างหน้าและทำเช่นนี้ 958 00:43:30,710 --> 00:43:33,720 เรามีโอกาสที่ในขณะนี้ การเลือกโหนดอื่น 959 00:43:33,720 --> 00:43:39,820 กล่าวว่าขอเริ่มต้นด้วย mallocing 55 960 00:43:39,820 --> 00:43:41,320 คนจะคิดเป็น malloc? 961 00:43:41,320 --> 00:43:42,280 ตกลงมาขึ้น 962 00:43:42,280 --> 00:43:42,992 คุณชื่ออะไร? 963 00:43:42,992 --> 00:43:43,700 RAINBOW: สายรุ้ง 964 00:43:43,700 --> 00:43:44,050 DAVID ลัน: เรนโบว์? 965 00:43:44,050 --> 00:43:44,810 ทั้งหมดขวา 966 00:43:44,810 --> 00:43:46,600 malloc สายรุ้ง 967 00:43:46,600 --> 00:43:47,450 มาขึ้น 968 00:43:47,450 --> 00:43:51,610 ดังนั้นตอนนี้เราต้องถามตัวเอง อัลกอริทึมที่เราสามารถใส่ 55 969 00:43:51,610 --> 00:43:53,610 ดังนั้นพวกเราทุกคนรู้ว่า เห็นได้ชัดว่าที่เธออาจ 970 00:43:53,610 --> 00:43:55,401 ถ้าเป็นของที่เรากำลังพยายาม เพื่อให้นี้แยก 971 00:43:55,401 --> 00:43:58,299 และถ้าพวกคุณอาจจะใช้อย่างใดอย่างหนึ่ง ย้อนกลับไปเพื่อให้เราไม่ตกออก 972 00:43:58,299 --> 00:43:59,590 เวทีว่าจะดี 973 00:43:59,590 --> 00:44:01,420 ดังนั้นจริงสายรุ้ง เริ่มต้นที่นี่กับฉัน 974 00:44:01,420 --> 00:44:04,200 เพราะเราเป็นคอมพิวเตอร์ในขณะนี้สามารถ เห็นเพียงตัวแปรหนึ่งที่เวลา 975 00:44:04,200 --> 00:44:05,190 ดังนั้นถ้าเป็นโหนดแรก 976 00:44:05,190 --> 00:44:07,160 ขอให้สังเกตว่าเขาไม่โหนด เขาเป็นเพียงตัวชี้ 977 00:44:07,160 --> 00:44:10,270 และที่ว่าทำไมเขาดึงไปเป็น เพียง แต่ขนาดของตัวชี้ไม่ 978 00:44:10,270 --> 00:44:11,780 หนึ่งในผู้ที่เต็มรูปสี่เหลี่ยม 979 00:44:11,780 --> 00:44:16,650 ดังนั้นเราจะไปตรวจสอบในแต่ละ ย้ำ 55 น้อยกว่า 9? 980 00:44:16,650 --> 00:44:17,150 เลขที่ 981 00:44:17,150 --> 00:44:19,060 55 น้อยกว่า 17 982 00:44:19,060 --> 00:44:19,720 เลขที่ 983 00:44:19,720 --> 00:44:20,800 น้อยกว่า 22? 984 00:44:20,800 --> 00:44:22,020 น้อยกว่า 26? 985 00:44:22,020 --> 00:44:23,390 น้อยกว่า 34? 986 00:44:23,390 --> 00:44:25,890 และดังนั้นตอนนี้เห็นได้ชัด รุ้งเป็นที่สิ้นสุด 987 00:44:25,890 --> 00:44:27,270 ดังนั้นเพื่อให้มีความชัดเจนและสิ่งที่ เป็นชื่อของเทย์เลอร์? 988 00:44:27,270 --> 00:44:27,895 >> TAYLOR: เทย์เลอร์ 989 00:44:27,895 --> 00:44:32,510 DAVID ลัน: ดังนั้นในหมู่เทย์เลอร์ มือซ้ายและมือของสายรุ้งที่นี่ 990 00:44:32,510 --> 00:44:38,324 ที่มีความต้องการที่จะใช้มือชี้ไปที่สิ่งที่อยู่ใน สั่งซื้อที่จะแทรกเข้าไปใน 55 รายการนี​​้ 991 00:44:38,324 --> 00:44:39,240 เราต้องทำอย่างไร? 992 00:44:39,240 --> 00:44:39,700 ใช่? 993 00:44:39,700 --> 00:44:41,140 >> ผู้ชม: เทย์เลอร์มือ ความต้องการที่จะชี้ซ้าย 994 00:44:41,140 --> 00:44:41,680 >> DAVID ลัน: แน่นอน 995 00:44:41,680 --> 00:44:43,800 ดังนั้นการแทรกโหนด เป็นจุดสิ้นสุดของรายการ 996 00:44:43,800 --> 00:44:47,140 สวยเรียบง่ายเพราะเพียงแค่เทย์เลอร์ มีการจุดแทนการที่พื้น 997 00:44:47,140 --> 00:44:49,640 หรือเราจะเรียกมันว่าเป็นโมฆะ null เป็นประเภทของการขาด 998 00:44:49,640 --> 00:44:51,640 ของตัวชี้หรือพิเศษ ศูนย์ชี้คุณ 999 00:44:51,640 --> 00:44:53,740 ไปชี้ซ้ายของคุณ มือที่เรนโบว์แล้วสายรุ้ง 1000 00:44:53,740 --> 00:44:55,910 ที่ควรซ้ายของคุณ มืออาจชี้? 1001 00:44:55,910 --> 00:44:56,570 ลงมา 1002 00:44:56,570 --> 00:45:00,140 มันไม่ดีถ้ามือของเธอคือการจัดเรียง ชี้ลงที่นี่หรือประเภทใด ๆ 1003 00:45:00,140 --> 00:45:00,640 ทางไหน. 1004 00:45:00,640 --> 00:45:02,407 ที่จะได้รับการพิจารณา ค่าขยะ 1005 00:45:02,407 --> 00:45:04,240 แต่ถ้าเธอชี้ไปที่ บางค่าที่รู้จักกันเราจะ 1006 00:45:04,240 --> 00:45:07,360 เรียกว่าเป็นศูนย์หรือ null ที่ตกลง เพราะเรามีในระยะนี้ 1007 00:45:07,360 --> 00:45:09,390 และเรารู้ว่ารายการเสร็จสมบูรณ์แล้ว 1008 00:45:09,390 --> 00:45:11,550 >> ดังนั้นสิ่งที่เป็นอีก กรณีที่ค่อนข้างง่าย? 1009 00:45:11,550 --> 00:45:13,125 เราสามารถ malloc 5? 1010 00:45:13,125 --> 00:45:14,010 มาขึ้น 1011 00:45:14,010 --> 00:45:14,782 คุณชื่ออะไร? 1012 00:45:14,782 --> 00:45:15,490 TIFFANY: ทิฟฟานี่ 1013 00:45:15,490 --> 00:45:16,000 DAVID ลัน: ฉันขอโทษ? 1014 00:45:16,000 --> 00:45:16,470 TIFFANY: ทิฟฟานี่ 1015 00:45:16,470 --> 00:45:16,880 DAVID ลัน: ทิฟฟานี่ 1016 00:45:16,880 --> 00:45:17,110 ทั้งหมดขวา 1017 00:45:17,110 --> 00:45:19,071 ทิฟฟานี่ได้รับการ malloced ที่มีมูลค่า 5 1018 00:45:19,071 --> 00:45:19,570 มาขึ้น 1019 00:45:19,570 --> 00:45:23,820 หนึ่งนี้ค่อนข้างง่ายเกินไป แต่ ขอพิจารณาเพื่อการดำเนินงานในขณะนี้ของ 1020 00:45:23,820 --> 00:45:25,820 มันเป็นเรื่องง่ายสวย กับเทย์เลอร์ในตอนท้าย 1021 00:45:25,820 --> 00:45:30,302 หมายเลข 5 เป็นหลักสูตรที่น้อยกว่า 9 และเพื่อให้เรามีเดวิดเรามีทิฟฟานี่ 1022 00:45:30,302 --> 00:45:31,260 และสิ่งที่เป็นชื่อของคุณ? 1023 00:45:31,260 --> 00:45:31,680 >> JAKE: เจค 1024 00:45:31,680 --> 00:45:32,470 >> DAVID ลัน: เจค 1025 00:45:32,470 --> 00:45:34,300 ทิฟฟานี่, เจคและเดวิด 1026 00:45:34,300 --> 00:45:36,580 มือควรจะปรับปรุงครั้งแรก? 1027 00:45:36,580 --> 00:45:39,260 1028 00:45:39,260 --> 00:45:40,590 อะไรที่คุณต้องการจะทำที่นี่? 1029 00:45:40,590 --> 00:45:45,244 มีวิธีที่เป็นไปคู่ของ แต่ นอกจากนี้ยังมีหนึ่งหรือมากกว่าหนึ่งวิธีที่ไม่ถูกต้อง 1030 00:45:45,244 --> 00:45:46,620 >> ผู้ชม: เริ่มต้นด้วยซ้าย 1031 00:45:46,620 --> 00:45:47,800 >> DAVID ลัน: เริ่มต้นด้วยซ้ายสุด 1032 00:45:47,800 --> 00:45:49,008 ใครเป็นซ้ายที่นี่แล้ว? 1033 00:45:49,008 --> 00:45:49,700 ผู้ชม: ครั้งแรก 1034 00:45:49,700 --> 00:45:50,366 >> DAVID ลัน: OK 1035 00:45:50,366 --> 00:45:53,781 ดังนั้นเริ่มต้นด้วยการเป็นครั้งแรกและที่คุณทำ ต้องการปรับปรุงมือของดาวิดจะเป็น? 1036 00:45:53,781 --> 00:45:54,780 ผู้ชม: ต่อ 5 1037 00:45:54,780 --> 00:45:55,446 DAVID ลัน: OK 1038 00:45:55,446 --> 00:45:59,026 ดาวิดจุดที่ห้า หรือทิฟฟานี่ที่นี่และตอนนี้หรือไม่ 1039 00:45:59,026 --> 00:46:01,072 >> ผู้ชม: ทิฟฟานี่ชี้ไปที่ 9 1040 00:46:01,072 --> 00:46:04,030 DAVID ลัน: เหมาะยกเว้นของบิงกี้ หัวเพียงแค่ชนิดของหล่นลงไปใช่มั้ย? 1041 00:46:04,030 --> 00:46:06,820 เพราะสิ่งที่ผิดปกติกับ ภาพที่แท้จริงนี้หรือไม่? 1042 00:46:06,820 --> 00:46:08,070 ผู้ชม: ไม่มีอะไรจะชี้ 1043 00:46:08,070 --> 00:46:09,945 DAVID ลัน: ไม่มีอะไร ชี้ไปที่เจคนี้ 1044 00:46:09,945 --> 00:46:13,360 เราได้กำพร้าอักษร 9 และ 17 และเราได้อย่างแท้จริง 1045 00:46:13,360 --> 00:46:18,450 การรั่วไหลของหน่วยความจำทั้งหมดนี้เพราะโดย ปรับปรุงมือเดวิดเป็นครั้งแรกที่ 1046 00:46:18,450 --> 00:46:21,660 ปรับตราบเท่าที่มันถูกต้อง ชี้ไปที่ทิฟฟานี่ตอนนี้ 1047 00:46:21,660 --> 00:46:25,410 แต่ถ้าไม่มีใครมี มองการณ์ไกลที่จะชี้ไปที่เจค 1048 00:46:25,410 --> 00:46:27,490 แล้วเราได้หายไป ครบถ้วนของรายการว่า 1049 00:46:27,490 --> 00:46:28,200 ดังนั้นขอยกเลิก 1050 00:46:28,200 --> 00:46:30,950 เพื่อให้เป็นสิ่งที่ดีที่ การเดินทางมากกว่า แต่ขอแก้ไขในขณะนี้ 1051 00:46:30,950 --> 00:46:33,624 สิ่งที่เราควรทำก่อนแทน? 1052 00:46:33,624 --> 00:46:34,124 ใช่? 1053 00:46:34,124 --> 00:46:35,791 >> ผู้ชม: ทิฟฟานี่ควรจะชี้ที่ 9 1054 00:46:35,791 --> 00:46:37,582 DAVID ลัน: ฉันไม่สามารถ ได้รับที่ใกล้ชิดกับคุณ 1055 00:46:37,582 --> 00:46:38,720 ใครควรจะชี้ที่ 9 1056 00:46:38,720 --> 00:46:39,220 >> ผู้ชม: ทิฟฟานี่ 1057 00:46:39,220 --> 00:46:39,390 >> DAVID ลัน: สิทธิทั้งหมด 1058 00:46:39,390 --> 00:46:41,200 ทิฟฟานี่ดังนั้นควรจุดแรกที่ 9 1059 00:46:41,200 --> 00:46:43,550 ดังนั้นควรใช้ทิฟฟานี่ ในค่าเหมือนกัน 1060 00:46:43,550 --> 00:46:45,820 ดาวิดซึ่งดูเหมือนว่า ซ้ำซ้อนสักครู่ 1061 00:46:45,820 --> 00:46:48,820 แต่ที่ดีเพราะตอนที่สอง ขั้นตอนที่เราสามารถปรับปรุงมือของดาวิด 1062 00:46:48,820 --> 00:46:52,680 ที่จะชี้ไปที่ทิฟฟานี่และจากนั้นถ้า เราเพียงแค่ชนิดของสิ่งที่ทำความสะอาด 1063 00:46:52,680 --> 00:46:55,740 ราวกับว่านี้เป็นชนิดของฤดูใบไม้ผลิเหมือน ตอนนี้ที่แทรกที่ถูกต้อง 1064 00:46:55,740 --> 00:46:56,700 ดังนั้นที่ดีเยี่ยม 1065 00:46:56,700 --> 00:46:57,970 ดังนั้นตอนนี้เราเกือบจะมี 1066 00:46:57,970 --> 00:47:01,075 ลองใส่ครั้งสุดท้าย ค่าเช่นค่า 20 1067 00:47:01,075 --> 00:47:03,010 ถ้าเราสามารถ malloc หนึ่งในอาสาสมัครสุดท้าย? 1068 00:47:03,010 --> 00:47:04,140 มาขึ้น 1069 00:47:04,140 --> 00:47:06,224 ดังนั้นนี้เป็นเพียงเล็กน้อยยุ่งยากมากขึ้น 1070 00:47:06,224 --> 00:47:08,390 แต่จริงๆรหัสเรา เขียนแม้จะด้วยวาจา 1071 00:47:08,390 --> 00:47:10,610 เป็นเพียงเหมือนมีพวง ถ้าเงื่อนไขตอนนี้ใช่มั้ย? 1072 00:47:10,610 --> 00:47:12,318 เรามีเงื่อนไข ตรวจสอบว่ามันเป็น 1073 00:47:12,318 --> 00:47:13,840 ในตอนท้ายอาจจะเริ่มต้น 1074 00:47:13,840 --> 00:47:15,940 เราจำเป็นต้องมีชนิดของวงไปบางส่วน หาจุดที่อยู่ตรงกลาง 1075 00:47:15,940 --> 00:47:17,400 ดังนั้นขอให้ทำอย่างนั้นกับสิ่งที่เป็นชื่อของคุณ? 1076 00:47:17,400 --> 00:47:17,700 >> ERIC: เอริค 1077 00:47:17,700 --> 00:47:18,340 >> DAVID ลัน: เอริค? 1078 00:47:18,340 --> 00:47:18,660 เอริค 1079 00:47:18,660 --> 00:47:19,368 ยินดีที่ได้พบคุณ. 1080 00:47:19,368 --> 00:47:20,490 ดังนั้นเราจึงมี 20 1081 00:47:20,490 --> 00:47:21,220 น้อยกว่าห้า? 1082 00:47:21,220 --> 00:47:21,530 เลขที่ 1083 00:47:21,530 --> 00:47:22,160 น้อยกว่าเก้า? 1084 00:47:22,160 --> 00:47:22,410 เลขที่ 1085 00:47:22,410 --> 00:47:23,050 น้อยกว่า 17 1086 00:47:23,050 --> 00:47:23,550 เลขที่ 1087 00:47:23,550 --> 00:47:23,740 ตกลง. 1088 00:47:23,740 --> 00:47:25,701 เขาเป็นคนที่นี่และ ชื่อของคุณอีกครั้งหรือไม่ 1089 00:47:25,701 --> 00:47:26,200 ซู: บางซื่อ 1090 00:47:26,200 --> 00:47:26,880 DAVID ลัน: บางซื่อ 1091 00:47:26,880 --> 00:47:27,379 อเล็กซ์: อเล็กซ์ 1092 00:47:27,379 --> 00:47:28,790 DAVID ลัน: ซูอเล็กซ์และ? 1093 00:47:28,790 --> 00:47:29,290 ERIC: เอริค 1094 00:47:29,290 --> 00:47:30,120 DAVID ลัน: เอริค 1095 00:47:30,120 --> 00:47:32,140 มือต้องได้รับการปรับปรุงครั้งแรก? 1096 00:47:32,140 --> 00:47:32,930 >> ผู้ชม: เอริค 1097 00:47:32,930 --> 00:47:33,429 ตกลง. 1098 00:47:33,429 --> 00:47:35,200 ดังนั้นเอริคที่ควรจะชี้ที่ไหน 1099 00:47:35,200 --> 00:47:35,930 วันที่ 22 1100 00:47:35,930 --> 00:47:36,430 ดี 1101 00:47:36,430 --> 00:47:38,180 และตอนนี้ทำอะไรต่อไป 1102 00:47:38,180 --> 00:47:40,800 ซูก็จะสามารถชี้ไปที่เอริค และตอนนี้ถ้าพวกคุณเพียง 1103 00:47:40,800 --> 00:47:44,077 ทำให้ห้องพักบางส่วนซึ่งเป็นเรื่องปกติ สายตาตอนนี้เราได้ทำแทรก 1104 00:47:44,077 --> 00:47:47,160 ดังนั้นตอนนี้ขอพิจารณาคำถาม แต่ ขอบคุณมากสำหรับอาสาสมัครของเรา 1105 00:47:47,160 --> 00:47:48,090 ทำได้ดีมาก 1106 00:47:48,090 --> 00:47:50,831 คุณสามารถเก็บเหล่านั้นหากคุณต้องการ 1107 00:47:50,831 --> 00:47:54,140 และเรามีของที่ระลึกน่ารักถ้าพรากจากกัน คุณต้องการแต่ละต้องการที่จะใช้ลูกความเครียด 1108 00:47:54,140 --> 00:47:56,030 ผมขอเพียงแค่ผ่านการลงนี้ 1109 00:47:56,030 --> 00:47:58,430 ดังนั้นสิ่งที่เป็นประเด็นของเรื่องนี้? 1110 00:47:58,430 --> 00:48:02,430 นี้น่าจะเป็นที่น่าตื่นตาตื่นใจ ตราบเท่าที่เรามีตอนนี้ 1111 00:48:02,430 --> 00:48:06,360 แนะนำทางเลือกไปยัง อาเรย์ที่ไม่ได้ จำกัด อยู่ดังนั้น 1112 00:48:06,360 --> 00:48:07,780 ไปยังอาร์เรย์ของขนาดคงที่บาง 1113 00:48:07,780 --> 00:48:09,380 พวกเขาสามารถเติบโตแบบไดนามิก 1114 00:48:09,380 --> 00:48:13,220 >> แต่เหมือนเราได้เห็นในสัปดาห์ที่ผ่านมา ที่ผ่านมาเราไม่เคยได้รับอะไรฟรี 1115 00:48:13,220 --> 00:48:15,740 เหมือนก็มีการออกนี่ 1116 00:48:15,740 --> 00:48:18,890 ดังนั้นมี upside ที่เชื่อมโยง รายการเป็นพลวัตนี้หรือไม่? 1117 00:48:18,890 --> 00:48:21,590 ความสามารถในการเติบโตและตรงไปตรงมา เราจะได้ทำลบ 1118 00:48:21,590 --> 00:48:23,570 และเราอาจจะหดตัวตามความจำเป็น 1119 00:48:23,570 --> 00:48:24,710 อะไรราคาที่เราจ่ายเงิน? 1120 00:48:24,710 --> 00:48:28,510 1121 00:48:28,510 --> 00:48:30,340 ครั้งที่สองเป็นพื้นที่มากครั้งแรกของทั้งหมด 1122 00:48:30,340 --> 00:48:34,010 ถ้าคุณดูที่ภาพไม่ได้ ฉันเก็บรายชื่อของจำนวนเต็ม 1123 00:48:34,010 --> 00:48:36,740 ฉันเก็บรายชื่อของ จำนวนเต็มบวกชี้ 1124 00:48:36,740 --> 00:48:38,240 ดังนั้นฉันเป็นสองเท่าของจำนวนเงินที่ของพื้นที่ 1125 00:48:38,240 --> 00:48:40,740 ตอนนี้บางทีที่ไม่ได้เช่น เป็นเรื่องใหญ่ 4 ไบต์, 8 ไบต​​์ 1126 00:48:40,740 --> 00:48:43,160 แต่แน่นอนสามารถเพิ่ม สำหรับชุดข้อมูลขนาดใหญ่ 1127 00:48:43,160 --> 00:48:45,570 ข้อเสียมีอะไรอื่นได้หรือไม่ 1128 00:48:45,570 --> 00:48:46,070 ใช่? 1129 00:48:46,070 --> 00:48:48,010 >> ผู้ชม: เราต้อง สำรวจพวกเขาหนึ่งโดยหนึ่ง 1130 00:48:48,010 --> 00:48:48,760 DAVID ลัน: ใช่ 1131 00:48:48,760 --> 00:48:50,260 เรามีการสำรวจพวกเขาหนึ่งโดยหนึ่ง 1132 00:48:50,260 --> 00:48:53,860 คุณจะรู้ว่าสิ่งที่เราให้ขึ้นสุด คุณลักษณะที่สะดวกในวงเล็บเหลี่ยม 1133 00:48:53,860 --> 00:48:57,240 สัญกรณ์มากขึ้นอย่างถูกต้อง ที่รู้จักกันในการเข้าถึงแบบสุ่ม 1134 00:48:57,240 --> 00:48:59,280 ซึ่งเราก็สามารถกระโดด จะเป็นองค์ประกอบของแต่ละบุคคล 1135 00:48:59,280 --> 00:49:01,470 แต่ตอนนี้ถ้าผมยังคงมี อาสาสมัครของฉันที่นี่ 1136 00:49:01,470 --> 00:49:04,660 ถ้าผมต้องการที่จะหา จำนวน 22 ฉันไม่สามารถเพียงแค่ 1137 00:49:04,660 --> 00:49:06,620 ข้ามไปยังยึดบางสิ่งบางอย่างบางสิ่งบางอย่าง 1138 00:49:06,620 --> 00:49:10,530 ผมต้องมองผ่านรายการมาก ตัวอย่างเช่นการค้นหาของเราเป็นเส้นตรง 1139 00:49:10,530 --> 00:49:12,260 เพื่อหาจำนวน 22 1140 00:49:12,260 --> 00:49:14,340 ดังนั้นเราจึงดูเหมือนจะมีการจ่ายราคามี 1141 00:49:14,340 --> 00:49:16,430 แต่กระนั้นเราสามารถทำได้ แก้ปัญหาอื่น ๆ 1142 00:49:16,430 --> 00:49:18,587 >> ในความเป็นจริงให้ฉันแนะนำ เพียงไม่กี่ภาพ 1143 00:49:18,587 --> 00:49:20,920 ดังนั้นถ้าคุณได้รับการลงไป ท้องของฮอลล์เมื่อเร็ว ๆ นี้การรับประทานอาหาร 1144 00:49:20,920 --> 00:49:23,320 คุณจะจำได้ว่าพวกเขา สแต็คของถาดเช่นนี้ 1145 00:49:23,320 --> 00:49:26,300 เรายืมมาจาก Annenberg ก่อนที่ชั้น 1146 00:49:26,300 --> 00:49:28,930 ดังนั้นสแต็คของถาดนี้แม้ว่า เป็นตัวแทนจริง 1147 00:49:28,930 --> 00:49:30,860 โครงสร้างข้อมูลของวิทยาการคอมพิวเตอร์ 1148 00:49:30,860 --> 00:49:32,910 มีโครงสร้างข้อมูลเป็น วิทยาการคอมพิวเตอร์ 1149 00:49:32,910 --> 00:49:38,010 ที่รู้จักกันเป็นกองที่อย่างมาก ยืมตัวเองไปว่าภาพนี้ 1150 00:49:38,010 --> 00:49:41,380 ดังนั้นถ้าแต่ละถาดเหล่านี้ไม่ได้เป็น ถาด แต่ชอบเป็นจำนวนมากและฉันต้องการ 1151 00:49:41,380 --> 00:49:45,010 ในการจัดเก็บตัวเลขฉัน สามารถใส่อย่างใดอย่างหนึ่งลงที่นี่ 1152 00:49:45,010 --> 00:49:48,320 และฉันสามารถใส่อีกลงที่นี่ และยังคงตัวเลขซ้อน 1153 00:49:48,320 --> 00:49:53,180 ด้านบนของอีกคนหนึ่งและสิ่งที่ ที่อาจเกิดขึ้นที่เป็นประโยชน์เกี่ยวกับเรื่องนี้ 1154 00:49:53,180 --> 00:49:55,450 นั่นคือสิ่งที่หมาย ของโครงสร้างข้อมูลนี้หรือไม่? 1155 00:49:55,450 --> 00:49:58,045 ซึ่งจำนวนที่ฉันสามารถดึงออก สะดวกที่สุดครั้งแรก? 1156 00:49:58,045 --> 00:50:00,640 1157 00:50:00,640 --> 00:50:03,030 ล่าสุดหนึ่งสวมมี 1158 00:50:03,030 --> 00:50:06,430 >> ดังนั้นนี่คือสิ่งที่เราจะเรียก วิทยาการคอมพิวเตอร์ LIFO โครงสร้างข้อมูล 1159 00:50:06,430 --> 00:50:08,070 สุดท้ายในครั้งแรกออกมา 1160 00:50:08,070 --> 00:50:10,800 และเราจะเห็นว่าทำไมก่อนที่จะยาว ที่อาจจะมีประโยชน์ แต่สำหรับตอนนี้ 1161 00:50:10,800 --> 00:50:12,200 เพียงแค่พิจารณาทรัพย์สิน 1162 00:50:12,200 --> 00:50:15,158 และมันเป็นชนิดของโง่ถ้าคุณคิด เกี่ยวกับวิธีการโรงอาหารไม่ได้ 1163 00:50:15,158 --> 00:50:17,910 ทุกครั้งที่พวกเขาถาดที่สะอาดและ ใส่คนที่สดใหม่อยู่ด้านบน 1164 00:50:17,910 --> 00:50:22,160 คุณอาจจะมีการทำความสะอาดก่อนหน้านี้ แต่ในที่สุดก็มากสกปรกและเต็มไปด้วยฝุ่น 1165 00:50:22,160 --> 00:50:24,360 ถาดที่ด้านล่างสุด ถ้าคุณไม่จริง 1166 00:50:24,360 --> 00:50:26,820 ได้ที่ด้านล่างว่า กองเพราะคุณเพียงแค่ 1167 00:50:26,820 --> 00:50:29,380 ให้วางใหม่และ คนทำความสะอาดด้านบนของมัน 1168 00:50:29,380 --> 00:50:31,840 สิ่งเดียวที่อาจจะเกิดขึ้น ในซูเปอร์มาร์เก็ตเกินไป 1169 00:50:31,840 --> 00:50:35,450 หากคุณมีกรณีการแสดงผล ของนมและ CVS ทุกเวลา 1170 00:50:35,450 --> 00:50:37,610 หรือใครก็ตามที่ได้รับนมมากขึ้น คุณเพียงแค่ซุกนม 1171 00:50:37,610 --> 00:50:39,880 คุณมีอยู่แล้วที่จะกลับมาและ คุณใส่ใหม่ขึ้นด้านหน้า 1172 00:50:39,880 --> 00:50:43,088 คุณกำลังจะมีบางอย่างที่น่ารังเกียจสวย นมในตอนท้ายของโครงสร้างข้อมูลที่ 1173 00:50:43,088 --> 00:50:46,390 เพราะมันเป็นเสมอที่ด้านล่างหรือ เท่ามันเสมอที่ด้านหลัง 1174 00:50:46,390 --> 00:50:50,407 >> แต่มีวิธีการที่จะคิดเกี่ยวกับการอื่น แถวข้อมูลและเช่นนี้ 1175 00:50:50,407 --> 00:50:53,490 หากคุณเป็นหนึ่งในคนเหล่านั้นที่ชอบ เข้าแถวด้านนอกของร้านค้าแอปเปิ้ล 1176 00:50:53,490 --> 00:50:55,610 เมื่อผลิตภัณฑ์ใหม่มา ออกคุณอาจ 1177 00:50:55,610 --> 00:50:58,780 ไม่ได้ใช้ข้อมูลที่กอง โครงสร้างเพราะคุณ 1178 00:50:58,780 --> 00:51:03,070 จะกลายเป็นคนอื่นที่เป็น แถวที่จะซื้อของเล่นใหม่บางส่วน 1179 00:51:03,070 --> 00:51:06,610 แต่คุณอาจใช้ สิ่งที่ชนิดของโครงสร้างข้อมูล 1180 00:51:06,610 --> 00:51:10,050 หรือสิ่งที่ชนิดของระบบ ในโลกจริงหรือไม่ 1181 00:51:10,050 --> 00:51:13,493 หวังว่ามันเป็นเส้นหรือมากกว่า ถูกต้องหรือมากกว่าอังกฤษเหมือนคิว 1182 00:51:13,493 --> 00:51:17,700 และปรากฎคิวนอกจากนี้ยังเป็น โครงสร้างข้อมูลในวิทยาการคอมพิวเตอร์ 1183 00:51:17,700 --> 00:51:19,700 แต่คิวมีมาก สถานที่ให้บริการที่แตกต่างกัน 1184 00:51:19,700 --> 00:51:20,820 มันไม่ได้ LIFO 1185 00:51:20,820 --> 00:51:21,990 สุดท้ายในครั้งแรกออกมา 1186 00:51:21,990 --> 00:51:22,800 พระเจ้าห้าม 1187 00:51:22,800 --> 00:51:24,280 มันแทน FIFO 1188 00:51:24,280 --> 00:51:26,110 ครั้งแรกในครั้งแรกออกมา 1189 00:51:26,110 --> 00:51:27,970 และนั่นเป็นสิ่งที่ดี เพื่อความเป็นธรรม 'ประโยชน์ 1190 00:51:27,970 --> 00:51:30,428 แน่นอนเมื่อคุณกำลังเข้าแถว ขึ้นต้นสุดในตอนเช้า 1191 00:51:30,428 --> 00:51:33,400 ถ้าคุณได้รับมีครั้งแรกคุณ ต้องการที่จะได้รับออกมาเป็นครั้งแรกเช่นกัน 1192 00:51:33,400 --> 00:51:35,880 >> และเพื่อให้ข้อมูลทั้งหมดของเหล่านี้ โครงสร้างคิวและสแต็ค 1193 00:51:35,880 --> 00:51:39,220 และอัดแน่นของคนอื่น ๆ ที่คุณจะเปิดออก สามารถคิดว่านี้เป็นเพียงอาร์เรย์ 1194 00:51:39,220 --> 00:51:41,820 นี่คืออาร์เรย์อาจจะ ขนาดคงที่ 4 แต่มันต้องการ 1195 00:51:41,820 --> 00:51:44,990 เป็นชนิดของดีถ้าเราเพียงแค่กอง ถาดสูงเกือบอนันต์ถ้าเรา 1196 00:51:44,990 --> 00:51:46,780 ที่มีหลายถาดหรือตัวเลข 1197 00:51:46,780 --> 00:51:48,840 ดังนั้นบางทีเราต้องการที่จะ ใช้รายการที่เชื่อมโยงที่นี่ 1198 00:51:48,840 --> 00:51:51,800 แต่การปิดเป็นไปได้ ที่อาจเกิดขึ้นที่เราต้องการหน่วยความจำมากขึ้น 1199 00:51:51,800 --> 00:51:55,930 ใช้เวลาน้อยมาก แต่เรา ไม่ จำกัด ความสูงของสแต็ค, 1200 00:51:55,930 --> 00:51:59,550 เหมือนกรณีแสดงท้องของ อาจ จำกัด ขนาดของกอง 1201 00:51:59,550 --> 00:52:03,117 และอื่น ๆ เหล่านี้จะตัดสินใจในการออกแบบหรือ ตัวเลือกที่มีให้กับเราในที่สุด 1202 00:52:03,117 --> 00:52:04,950 ดังนั้นด้วยข้อมูลเหล่านี้ โครงสร้างที่เราได้เริ่มต้น 1203 00:52:04,950 --> 00:52:09,360 เห็นขอบเขตบนใหม่ที่อาจเกิดขึ้น ในสิ่งที่ก่อนหน้านี้เป็นที่เร็วสุด 1204 00:52:09,360 --> 00:52:11,260 และที่เราจะออกจาก ปิดในวันนี้และที่ 1205 00:52:11,260 --> 00:52:13,200 เราจะหวังว่าจะได้รับ คือในวันพุธที่เราจะ 1206 00:52:13,200 --> 00:52:15,740 เริ่มที่จะดูข้อมูลที่ โครงสร้างที่ช่วยให้เราค้นหา 1207 00:52:15,740 --> 00:52:18,260 ผ่านข้อมูลในเวลาสิ้นสุดการเข้าสู่ระบบอีกครั้ง 1208 00:52:18,260 --> 00:52:21,470 และเราเห็นว่าจำในสัปดาห์ที่ศูนย์ และเป็นหนึ่งเดียวกับการค้นหาแบบไบนารีหรือแบ่ง 1209 00:52:21,470 --> 00:52:22,180 และพิชิต 1210 00:52:22,180 --> 00:52:26,240 มันกลับมาและยังดีกว่า จอกศักดิ์สิทธิ์วันพุธนี้ 1211 00:52:26,240 --> 00:52:29,510 จะเกิดขึ้นกับ โครงสร้างข้อมูลที่ทำงานอย่างแท้จริง 1212 00:52:29,510 --> 00:52:32,070 หรือในทางทฤษฎี เวลาคงด้วยเหตุนี้ 1213 00:52:32,070 --> 00:52:34,760 มันไม่สำคัญว่าหลาย ล้านหรือพันล้านสิ่ง 1214 00:52:34,760 --> 00:52:38,470 เรามีอยู่ในโครงสร้างข้อมูลก็จะ พาเราเวลาคงอาจจะขั้นตอนเดียว 1215 00:52:38,470 --> 00:52:41,387 หรือสองขั้นตอนหรือ 10 ขั้นตอน แต่ตัวเลขคงที่ของขั้นตอน 1216 00:52:41,387 --> 00:52:42,970 การค้นหาผ่านโครงสร้างข้อมูลว่า 1217 00:52:42,970 --> 00:52:46,300 นั่นก็จะเป็นจอกศักดิ์สิทธิ์ แต่เพิ่มเติมว่าในวันพุธที่ 1218 00:52:46,300 --> 00:52:49,045 ดูยาแล้ว 1219 00:52:49,045 --> 00:52:53,704 >> [เล่นเพลง] 1220 00:52:53,704 --> 00:56:08,448