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