1 00:00:00,000 --> 00:00:10,970 >> [Chơi nhạc] 2 00:00:10,970 --> 00:00:12,536 >> DAVID J. Malan: Được rồi. 3 00:00:12,536 --> 00:00:13,392 >> [Cười] 4 00:00:13,392 --> 00:00:14,240 >> Chào mừng trở lại. 5 00:00:14,240 --> 00:00:14,990 Đây là CS50. 6 00:00:14,990 --> 00:00:16,890 Và điều này cuối tuần năm. 7 00:00:16,890 --> 00:00:20,020 Và cho đến bây giờ, chúng tôi đã khá nhiều được dùng cho các cấp có 8 00:00:20,020 --> 00:00:23,480 tồn tại trình biên dịch này, kêu vang, mà bạn đã được gọi bằng cách này 9 00:00:23,480 --> 00:00:27,100 công cụ khác được gọi là làm cách nào đó kỳ diệu chuyển đổi mã nguồn của bạn 10 00:00:27,100 --> 00:00:31,350 vào mã đối tượng, các số không và những người thân rằng các máy tính CPU của bạn, trung tâm 11 00:00:31,350 --> 00:00:33,410 đơn vị chế biến, thực sự hiểu được. 12 00:00:33,410 --> 00:00:36,770 Nhưng hóa ra đó là một con số đó là đang diễn ra bên dưới mui xe trong 13 00:00:36,770 --> 00:00:38,690 giữa đầu vào và đầu ra. 14 00:00:38,690 --> 00:00:41,800 >> Và tôi muốn đề nghị chúng ta thịt mà trong một ít chi tiết hơn vào 15 00:00:41,800 --> 00:00:45,130 bốn bước, có một cái gì đó gọi là tiền xử lý, một cái gì đó 16 00:00:45,130 --> 00:00:48,300 được gọi là biên dịch, mà chúng ta đã thấy, một cái gì đó gọi là lắp ráp, và 17 00:00:48,300 --> 00:00:49,420 một cái gì đó gọi là liên kết. 18 00:00:49,420 --> 00:00:53,270 Vì vậy, cho đến bây giờ, trong một số của chúng tôi các chương trình, chúng tôi đã mạnh bao gồm. 19 00:00:53,270 --> 00:00:56,650 Gần đây chúng tôi đã có một số sắc nét định nghĩa cho các hằng số. 20 00:00:56,650 --> 00:01:00,660 Vì vậy, nó chỉ ra rằng những điều mà được bắt đầu với biểu tượng băm hoặc 21 00:01:00,660 --> 00:01:04,150 biểu tượng bảng là tiền xử lý chỉ thị. 22 00:01:04,150 --> 00:01:07,960 Đó chỉ là một cách nói đó là một dòng mã thực sự 23 00:01:07,960 --> 00:01:12,280 chuyển đổi thành một cái gì đó khác trước khi máy tính thậm chí cố gắng để chuyển đổi của bạn 24 00:01:12,280 --> 00:01:13,800 chương trình thành số không và những người thân. 25 00:01:13,800 --> 00:01:19,000 >> Ví dụ, sắc nét bao gồm các tiêu chuẩn I / O. H, khá nhiều chỉ có nghĩa là đi 26 00:01:19,000 --> 00:01:24,010 phía trước, lấy nội dung của các tập tin stdio.h và dán chúng ngay tại đó. 27 00:01:24,010 --> 00:01:25,880 Vì vậy, không có số không và những người thân tại thời điểm đó được nêu ra. 28 00:01:25,880 --> 00:01:27,470 Nó thực sự chỉ là một thay thế. 29 00:01:27,470 --> 00:01:30,790 Và đó là thực hiện trong cái gọi là giai đoạn tiền xử lý, khi bạn 30 00:01:30,790 --> 00:01:34,230 thực sự chạy kêu vang hoặc cụ thể Thực hiện trong hầu hết các trường hợp. 31 00:01:34,230 --> 00:01:36,950 Vì vậy, tất cả điều này đã xảy ra đầu tiên tự động cho đến nay. 32 00:01:36,950 --> 00:01:38,800 >> Sau đó đến các bước biên dịch. 33 00:01:38,800 --> 00:01:40,920 Nhưng chúng tôi đã được đơn giản hóa quá biên dịch. 34 00:01:40,920 --> 00:01:45,060 Biên soạn một chương trình thực sự có nghĩa là mang nó từ một cái gì đó như C, 35 00:01:45,060 --> 00:01:48,430 mã nguồn, chúng tôi đã viết, giảm một cái gì đó gọi là lắp ráp. 36 00:01:48,430 --> 00:01:52,900 Ngôn ngữ lắp ráp là một mức độ thấp hơn ngôn ngữ đó, may mắn thay, chúng tôi sẽ không 37 00:01:52,900 --> 00:01:55,480 có nhiều cơ hội để viết trong học kỳ này. 38 00:01:55,480 --> 00:01:59,100 Nhưng nó ở mức thấp nhất trong nghĩa là bạn có nghĩa là bắt đầu viết 39 00:01:59,100 --> 00:02:04,270 thêm và trừ và nhân và tải từ bộ nhớ và lưu vào bộ nhớ, 40 00:02:04,270 --> 00:02:08,259 hướng dẫn rất cơ bản mà một máy tính, bên dưới mui xe, 41 00:02:08,259 --> 00:02:09,639 thực sự hiểu được. 42 00:02:09,639 --> 00:02:14,930 >> Cuối cùng, lắp ráp mất ngôn ngữ đến số không và những người mà chúng tôi đã được 43 00:02:14,930 --> 00:02:16,190 mô tả cho đến nay. 44 00:02:16,190 --> 00:02:19,270 Và thực sự cuối cùng, có cái gọi là liên kết giai đoạn, trong đó chúng tôi sẽ 45 00:02:19,270 --> 00:02:22,360 thấy chỉ trong một thời điểm, trong đó kết hợp số không và những người thân với số không và bạn 46 00:02:22,360 --> 00:02:24,870 những người khác trước khi bạn đã tạo ra. 47 00:02:24,870 --> 00:02:26,660 >> Vì vậy, xem xét chương trình này rất dễ. 48 00:02:26,660 --> 00:02:27,560 Đó là từ Tuần 1. 49 00:02:27,560 --> 00:02:29,610 Nó chỉ nói, Xin chào thế giới, trên màn hình. 50 00:02:29,610 --> 00:02:30,920 Chúng tôi chạy này thông qua kêu vang. 51 00:02:30,920 --> 00:02:33,200 Hoặc chúng ta chạy nó thông qua Hãy mà chạy kêu vang. 52 00:02:33,200 --> 00:02:36,170 Và xuất ra vào thời điểm mà một số không và những người thân. 53 00:02:36,170 --> 00:02:38,100 Nhưng hóa ra có một bước trung gian. 54 00:02:38,100 --> 00:02:40,460 Nếu tôi đi qua đây - tiếc, đã không muốn nhìn thấy anh ấy chưa. 55 00:02:40,460 --> 00:02:44,800 Nếu tôi đi qua đây vào thiết bị của tôi và tôi mở ra hello.c, đây 56 00:02:44,800 --> 00:02:46,160 là cùng một chương trình. 57 00:02:46,160 --> 00:02:48,600 Và những gì tôi sẽ làm trong thiết bị đầu cuối của tôi cửa sổ ở đây là tôi sẽ 58 00:02:48,600 --> 00:02:51,430 chạy kêu vang hơn là làm, mà tự động hóa tất cả bốn 59 00:02:51,430 --> 00:02:52,870 những bước cho chúng tôi. 60 00:02:52,870 --> 00:02:58,620 Và tôi sẽ làm kêu vang-S và sau đó hello.c và sau đó nhập. 61 00:02:58,620 --> 00:03:00,590 >> Và tôi nhận được một dấu nhắc nhấp nháy một lần nữa, đó là tốt. 62 00:03:00,590 --> 00:03:05,280 Và bây giờ trong một cửa sổ lớn hơn một chút, Tôi sẽ mở gedit ở đây. 63 00:03:05,280 --> 00:03:09,610 Và tôi sẽ mở ra một tập tin đó, Hóa ra, được gọi là hello.s này 64 00:03:09,610 --> 00:03:11,870 chứa ngôn ngữ lắp ráp Tôi đề cập trước đó. 65 00:03:11,870 --> 00:03:15,060 Và đây là những gì được gọi là lắp ráp ngôn ngữ, mức khá thấp 66 00:03:15,060 --> 00:03:18,470 hướng dẫn CPU Intel của bạn hoặc bất cứ điều gì đó là bên trong 67 00:03:18,470 --> 00:03:19,350 hiểu được. 68 00:03:19,350 --> 00:03:24,480 Và mov là cho di chuyển. gọi là cho gọi điện thoại, một chức năng rất thấp. 69 00:03:24,480 --> 00:03:26,380 phụ là trừ. 70 00:03:26,380 --> 00:03:30,370 >> Vì vậy, khi bạn có một CPU cụ thể bên trong máy tính của bạn, những gì làm cho nó 71 00:03:30,370 --> 00:03:34,300 khác biệt, so với các CPU trên thị trường, được hướng dẫn mà nó 72 00:03:34,300 --> 00:03:39,460 hiểu và thường xuyên như thế nào hiệu quả nó là, nhanh như thế nào là thực hiện một số 73 00:03:39,460 --> 00:03:40,380 của những người hướng dẫn. 74 00:03:40,380 --> 00:03:45,150 Bây giờ để biết thêm về điều này, bạn có thể CS61 mùa thu tiếp theo tại các trường đại học. 75 00:03:45,150 --> 00:03:48,170 Nhưng ở đây chúng tôi có, ví dụ, một vài định danh có thể trông quen thuộc. 76 00:03:48,170 --> 00:03:50,150 hello.c là tên của chương trình. 77 00:03:50,150 --> 00:03:51,070 >> Văn bản -. 78 00:03:51,070 --> 00:03:54,190 không có nhiều quan tâm có chỉ bây giờ, nhớ lại rằng các văn bản 79 00:03:54,190 --> 00:03:59,190 phân khúc, như của Thứ hai, là nơi mà trong bộ nhớ chương trình của bạn thực sự kết thúc. 80 00:03:59,190 --> 00:04:01,330 Vì vậy, đó là ít nhất một cách mơ hồ quen thuộc đó. 81 00:04:01,330 --> 00:04:03,730 Ở đây, tất nhiên, là một đề cập đến chức năng chính của chúng tôi. 82 00:04:03,730 --> 00:04:07,220 Di chuyển xuống, những tham khảo điều gọi là đăng ký, khối rất nhỏ của 83 00:04:07,220 --> 00:04:09,190 bộ nhớ bên trong CPU thực tế của bạn. 84 00:04:09,190 --> 00:04:12,930 Và nếu tôi di chuyển xuống thậm chí hơn nữa, tôi thấy một số loại 85 00:04:12,930 --> 00:04:14,240 đề cập gián tiếp của ASCII. 86 00:04:14,240 --> 00:04:17,120 Và ở đó, thực sự, là chuỗi, xin chào, dấu phẩy, thế giới. 87 00:04:17,120 --> 00:04:20,079 >> Vì vậy, câu chuyện dài ngắn, điều này đã được xảy ra cho bạn, tự động, 88 00:04:20,079 --> 00:04:22,140 bên dưới mui xe của tất cả các thời gian này. 89 00:04:22,140 --> 00:04:26,450 Và những gì đã xảy ra thực sự là một lần bạn đã chạy kêu vang, hoặc bằng cách 90 00:04:26,450 --> 00:04:29,150 Thực hiện, bạn đang nhận được đầu tiên, từ mã nguồn, 91 00:04:29,150 --> 00:04:30,700 cái gọi là ngôn ngữ lắp ráp. 92 00:04:30,700 --> 00:04:35,210 Sau đó kêu vang là chuyển đổi lắp ráp này ngôn ngữ xuống đến số không và những người thân. 93 00:04:35,210 --> 00:04:38,340 Và đây là hoạt động mà chúng tôi bắt đầu thảo luận của chúng tôi trong tuần 0 trên - 94 00:04:38,340 --> 00:04:39,840 và sau đó 1 tuần trên. 95 00:04:39,840 --> 00:04:44,030 Và cuối cùng, những số không và những người thân được kết hợp với các số không và những người thân 96 00:04:44,030 --> 00:04:47,190 từ các thư viện chúng tôi đã được tham gia cho các cấp như tiêu chuẩn I / O hoặc 97 00:04:47,190 --> 00:04:50,010 Chuỗi Thư viện hoặc thậm chí thư viện CS50. 98 00:04:50,010 --> 00:04:54,200 >> Vì vậy, để vẽ hình ảnh này hơn trực quan, chúng ta có hello.c. 99 00:04:54,200 --> 00:04:57,220 Và, tất nhiên, sử dụng printf chức năng để nói, xin chào thế giới. 100 00:04:57,220 --> 00:05:01,810 Các bước biên dịch mất nó xuống tập tin đó, chúng tôi chỉ thấy hello.s, thậm chí 101 00:05:01,810 --> 00:05:04,290 mặc dù đó là thường bị xóa tự động cho bạn. 102 00:05:04,290 --> 00:05:06,050 Nhưng đó là mã lắp ráp trong các bước trung gian. 103 00:05:06,050 --> 00:05:09,750 Và sau đó khi chúng tôi lắp ráp lắp ráp ngôn ngữ, có thể nói, đó là khi bạn 104 00:05:09,750 --> 00:05:10,830 có được những số không và những người thân. 105 00:05:10,830 --> 00:05:13,920 Vì vậy, chúng tôi đã thu nhỏ trong hiệu quả ngày hôm nay trên những gì chúng ta đã được dùng cho các cấp, 106 00:05:13,920 --> 00:05:16,430 có nghĩa là đi mã nguồn phản đối mã. 107 00:05:16,430 --> 00:05:18,850 >> Nhưng cuối cùng, bây giờ mà cùng một hình ảnh - chúng ta hãy đẩy nó qua 108 00:05:18,850 --> 00:05:20,020 phía bên tay trái. 109 00:05:20,020 --> 00:05:22,880 Và lưu ý rằng trong đầu có Tôi đã đề cập stdio.h. 110 00:05:22,880 --> 00:05:25,030 Đó là một tập tin mà chúng tôi đã bao gồm trong gần như tất cả các 111 00:05:25,030 --> 00:05:26,250 chương trình chúng tôi đã viết. 112 00:05:26,250 --> 00:05:28,830 Và đó là tập tin có nội dung được sao chép dán, 113 00:05:28,830 --> 00:05:30,350 hiệu quả trên mã của bạn. 114 00:05:30,350 --> 00:05:34,170 Nhưng nó chỉ ra rằng, trên một máy tính hệ thống nơi nào đó, có lẽ là một 115 00:05:34,170 --> 00:05:39,150 tập tin stdio.c rằng ai đó đã viết năm trước mà thực hiện tất cả các 116 00:05:39,150 --> 00:05:41,870 chức năng đã được tuyên bố trong stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Bây giờ trong thực tế nó có thể là không trên Mac của bạn hoặc máy tính của bạn hoặc thậm chí trong 118 00:05:45,465 --> 00:05:47,660 CS50 thiết bị là một mã C thô. 119 00:05:47,660 --> 00:05:52,710 Ai đó đã biên dịch nó và bao gồm O. Tập tin cho mã đối tượng hay. Một 120 00:05:52,710 --> 00:05:56,020 tập tin, trong đó đề cập đến một thư viện chia sẻ đó là được cài đặt sẵn và 121 00:05:56,020 --> 00:05:57,240 biên dịch trước cho bạn. 122 00:05:57,240 --> 00:06:01,950 Nhưng giả sử rằng có thực sự tồn tại stdio.c trên máy tính của chúng tôi song song 123 00:06:01,950 --> 00:06:02,650 với Clang. 124 00:06:02,650 --> 00:06:04,960 Mã của bạn đang được biên soạn và lắp ráp. 125 00:06:04,960 --> 00:06:09,200 đang stdio.c 's đang được biên soạn và lắp ráp, để điều này cuối cùng 126 00:06:09,200 --> 00:06:13,730 bước, xuống đây, chúng ta phải bằng cách nào đó liên kết, có thể nói, số không và những người thân của bạn 127 00:06:13,730 --> 00:06:18,430 với số không và những người thân của mình vào một trong chương trình đơn giản mà cuối cùng là 128 00:06:18,430 --> 00:06:20,540 được gọi là chỉ Xin chào. 129 00:06:20,540 --> 00:06:23,340 >> Vì vậy, đó là tất cả sự kỳ diệu đó là đã xảy ra cho đến nay. 130 00:06:23,340 --> 00:06:26,430 Và sẽ tiếp tục sử dụng quá trình cho các cấp, nhưng nhận ra 131 00:06:26,430 --> 00:06:28,750 có rất nhiều chi tiết ngon ngọt đang diễn ra bên dưới đó. 132 00:06:28,750 --> 00:06:31,920 Và đây là những gì làm cho bạn máy tính với Intel bên trong 133 00:06:31,920 --> 00:06:33,940 đặc biệt là khác biệt. 134 00:06:33,940 --> 00:06:37,020 >> Vì vậy, trên lưu ý rằng, nếu bạn muốn tham gia với chúng tôi để ăn trưa thứ sáu này, làm đi 135 00:06:37,020 --> 00:06:41,570 đến nơi cs50.net/rsvp bình thường, 13:15 thứ sáu này. 136 00:06:41,570 --> 00:06:43,400 Và bây giờ là một vài thông báo. 137 00:06:43,400 --> 00:06:44,670 Vì vậy, chúng tôi có một số tin tốt. 138 00:06:44,670 --> 00:06:45,970 Và chúng tôi có một số tin xấu. 139 00:06:45,970 --> 00:06:47,260 Bắt đầu với một số tin tốt đây. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [Rên rỉ] 142 00:06:54,510 --> 00:06:54,710 >> Được rồi. 143 00:06:54,710 --> 00:06:56,670 Vâng, đó là kỹ thuật một kỳ nghỉ, vì vậy nó không phải là quá nhiều một món quà từ chúng tôi. 144 00:06:56,670 --> 00:06:58,030 Nhưng sau đó những tin tức xấu của khóa học. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [Rên rỉ] 147 00:07:01,880 --> 00:07:03,530 >> Tôi đã dành rất nhiều thời gian trên những hình ảnh động. 148 00:07:03,530 --> 00:07:04,690 >> [Cười] 149 00:07:04,690 --> 00:07:07,000 >> Sẽ có một phiên xét này đến thứ hai. 150 00:07:07,000 --> 00:07:08,340 Nó sẽ là lúc 5:30 AM. 151 00:07:08,340 --> 00:07:11,210 Chúng tôi sẽ nhắc nhở bạn về tất cả những chi tiết này qua email trên của khóa học 152 00:07:11,210 --> 00:07:13,470 trang web chỉ trong một vài ngày thời gian. 153 00:07:13,470 --> 00:07:16,610 Nó sẽ được quay và làm sẵn có ngay sau đó. 154 00:07:16,610 --> 00:07:19,200 Vì vậy, nếu bạn không thể làm cho rằng thứ hai khe cắm đêm, đừng lo lắng. 155 00:07:19,200 --> 00:07:22,270 Phần tuần này cũng sẽ tập trung vào việc xem xét cho các bài kiểm tra. 156 00:07:22,270 --> 00:07:25,670 Nếu phần của bạn là vào thứ hai, đó là trường đại học thực sự kỳ nghỉ, chúng tôi sẽ 157 00:07:25,670 --> 00:07:26,920 vẫn đáp ứng trong phần. 158 00:07:26,920 --> 00:07:28,890 Nếu bạn chỉ đơn giản là không thể làm cho rằng phần bởi vì bạn sẽ 159 00:07:28,890 --> 00:07:29,860 xa, đó là tốt. 160 00:07:29,860 --> 00:07:33,710 Tham dự một ngày chủ nhật hoặc phần thứ ba hay điều chỉnh trong mục Jason, đó là 161 00:07:33,710 --> 00:07:35,110 có sẵn trực tuyến. 162 00:07:35,110 --> 00:07:37,490 >> Vì vậy, thông tin xấu. 163 00:07:37,490 --> 00:07:41,960 Vì vậy, theo các giáo trình, chúng tôi có bài giảng vào thứ sáu tới. 164 00:07:41,960 --> 00:07:43,690 Nhưng những tin tức tốt - 165 00:07:43,690 --> 00:07:44,860 rõ ràng, tôi đã dành quá nhiều thời gian về điều này. 166 00:07:44,860 --> 00:07:45,280 >> [Cười] 167 00:07:45,280 --> 00:07:47,140 >> Chúng tôi sẽ hủy bỏ sau bài giảng hôm thứ Sáu. 168 00:07:47,140 --> 00:07:50,590 Vì vậy, đó sẽ là một món quà cho chúng tôi, vì vậy bạn thực sự có thể có một thời gian nghỉ ngơi ngơi thoải mái tại 169 00:07:50,590 --> 00:07:52,990 giữa tuần này và do đó hai tuần. 170 00:07:52,990 --> 00:07:57,460 Vì vậy, không có bài giảng vào tuần tới, chỉ là một nhỏ ít bài kiểm tra, trong đó bạn sẽ có 171 00:07:57,460 --> 00:07:59,030 việc ngày càng phấn khích. 172 00:07:59,030 --> 00:08:03,870 >> Vì vậy, bây giờ chúng ta chuyển sự chú ý của chúng tôi để một cái gì đó thực sự là trực quan hơn 173 00:08:03,870 --> 00:08:06,990 và thú vị hơn và thiết lập các giai đoạn cho những gì sẽ là trên đường chân trời 174 00:08:06,990 --> 00:08:08,420 chỉ trong một vài tuần thời gian. 175 00:08:08,420 --> 00:08:12,160 Sau khi các bài kiểm tra đầu tiên, chúng tôi sẽ biến tập trung của bộ vấn đề của chúng tôi khác 176 00:08:12,160 --> 00:08:16,710 vấn đề tên miền cụ thể, đó là pháp y, an ninh nói chung. 177 00:08:16,710 --> 00:08:19,550 >> Trong thực tế, truyền thống với vấn đề này thiết lập là cho tôi một trong những 178 00:08:19,550 --> 00:08:24,850 giảng dạy đồng hoặc CA để đi bộ qua khuôn viên trường tham gia một số hình ảnh của 179 00:08:24,850 --> 00:08:29,450 mang tính chất nhưng không người rõ ràng, địa điểm, hoặc điều gì đó, sau đó mỗi năm tôi 180 00:08:29,450 --> 00:08:34,520 bằng cách nào đó quản lý để vô tình xóa hoặc làm hỏng thẻ phương tiện truyền thông kỹ thuật số 181 00:08:34,520 --> 00:08:35,720 đó là bên trong của máy ảnh của chúng tôi. 182 00:08:35,720 --> 00:08:36,860 Nhưng không có việc lớn. 183 00:08:36,860 --> 00:08:39,200 Tôi có thể đi trước và cắm đó vào máy tính của tôi. 184 00:08:39,200 --> 00:08:43,010 Tôi có thể làm cho một hình ảnh pháp y của nó, vì vậy để nói chuyện, bằng cách sao chép các số không và 185 00:08:43,010 --> 00:08:46,830 những người ra điều đó thẻ nhớ, cho dù một thẻ SD hoặc thẻ flash nhỏ gọn hoặc 186 00:08:46,830 --> 00:08:48,100 bất cứ điều gì bạn đang quen thuộc với. 187 00:08:48,100 --> 00:08:49,300 Và sau đó chúng ta có thể đưa ra ngoài. 188 00:08:49,300 --> 00:08:53,190 >> Và do đó, thách thức phía trước, trong số khác việc cho bạn, sẽ được để viết 189 00:08:53,190 --> 00:08:58,630 C mã phục hồi một bó toàn bộ JPEG cho tôi và tiết lộ sẽ 190 00:08:58,630 --> 00:09:00,190 những người, địa điểm, hoặc những thứ. 191 00:09:00,190 --> 00:09:03,340 Và chúng tôi cũng sẽ nói, trong vấn đề này thiết lập và trong những ngày tới, về 192 00:09:03,340 --> 00:09:04,440 đồ họa nói chung. 193 00:09:04,440 --> 00:09:06,140 Chúng tôi đã sử dụng chúng, một khóa học, cho thoát ra khỏi. 194 00:09:06,140 --> 00:09:09,080 Nhưng bạn đã loại dùng cho các cấp có tồn tại những khái niệm cao cấp 195 00:09:09,080 --> 00:09:10,680 của hình chữ nhật và hình bầu dục. 196 00:09:10,680 --> 00:09:12,450 Nhưng bên dưới mui xe có pixel. 197 00:09:12,450 --> 00:09:14,370 Và bạn đã có để bắt đầu suy nghĩ về những người. 198 00:09:14,370 --> 00:09:18,800 Hoặc bạn sẽ cho p-bộ 4 phải suy nghĩ về khoảng cách giữa các viên gạch của bạn, làm thế nào 199 00:09:18,800 --> 00:09:21,990 nhanh chóng, bạn đang bóng di chuyển trên màn hình để thoát ra khỏi. 200 00:09:21,990 --> 00:09:24,830 Do đó, khái niệm này của chấm trên màn hình của bạn đó là 201 00:09:24,830 --> 00:09:26,290 đi vào chơi đã. 202 00:09:26,290 --> 00:09:29,430 >> Bây giờ những gì bạn thấy, mặc dù, là những gì bạn nhận được trên một màn hình máy tính. 203 00:09:29,430 --> 00:09:33,680 Nếu bạn đã từng xem một số tốt hay TV xấu, tỷ lệ cược là họ khá nhiều 204 00:09:33,680 --> 00:09:36,280 xử lý các đối tượng như technophobes người không thực sự 205 00:09:36,280 --> 00:09:37,630 biết nhiều về máy tính. 206 00:09:37,630 --> 00:09:40,840 Và vì vậy nó rất dễ dàng cho cảnh sát thám tử nói, có thể bạn 207 00:09:40,840 --> 00:09:41,710 làm sạch mà lên cho tôi? 208 00:09:41,710 --> 00:09:42,710 Hoặc nâng cao, phải không? 209 00:09:42,710 --> 00:09:45,550 Nâng cao giống như từ dư luận trong hầu hết bất kỳ chương trình liên quan đến tội phạm. 210 00:09:45,550 --> 00:09:49,240 Và thực tế là nếu bạn có một rất hình mờ của một nghi can làm 211 00:09:49,240 --> 00:09:51,620 một cái gì đó xấu, bạn có thể không chỉ nâng cao nó. 212 00:09:51,620 --> 00:09:53,080 Bạn không thể phóng to vô hạn. 213 00:09:53,080 --> 00:09:56,350 Bạn không thể nhìn thấy trong ánh mắt của một ai đó mắt người cam kết 214 00:09:56,350 --> 00:09:59,860 tội phạm đặc biệt, mặc dù Tỷ lệ này trên truyền hình. 215 00:09:59,860 --> 00:10:04,110 >> Và như vậy với chúng ta hãy động viên rằng vấn đề sắp tới thiết lập với một cái nhìn 216 00:10:04,110 --> 00:10:05,765 một số chương trình mà bạn có thể là quen thuộc. 217 00:10:05,765 --> 00:10:06,500 >> [VIDEO xem lại] 218 00:10:06,500 --> 00:10:07,835 >> -OK. 219 00:10:07,835 --> 00:10:09,956 Bây giờ, chúng ta có được một cái nhìn tốt ở bạn. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> -Giữ nó. 222 00:10:17,766 --> 00:10:18,658 Chạy trở lại đó. 223 00:10:18,658 --> 00:10:19,550 >> -Đợi một chút. 224 00:10:19,550 --> 00:10:21,580 Đi ngay. 225 00:10:21,580 --> 00:10:21,800 >> -Có. 226 00:10:21,800 --> 00:10:22,690 Đóng băng đó. 227 00:10:22,690 --> 00:10:23,692 >> -Toàn màn hình. 228 00:10:23,692 --> 00:10:23,846 >> -OK. 229 00:10:23,846 --> 00:10:24,154 Đóng băng đó. 230 00:10:24,154 --> 00:10:25,140 >> -Thắt chặt trên đó, sẽ ya? 231 00:10:25,140 --> 00:10:27,090 >> -Vector trong trên anh chàng đó bởi các bánh xe lại. 232 00:10:27,090 --> 00:10:29,730 >> -Phóng to ngay tại chỗ này. 233 00:10:29,730 --> 00:10:33,700 >> -Với các thiết bị bên phải, chụp ảnh có thể được mở rộng và sắc nét. 234 00:10:33,700 --> 00:10:34,490 >> -Cái gì thế? 235 00:10:34,490 --> 00:10:35,870 >> -Đây là một chương trình nâng cao. 236 00:10:35,870 --> 00:10:36,793 >> -Anh có thể rõ ràng rằng bất kỳ? 237 00:10:36,793 --> 00:10:38,560 >> -Tôi không biết. 238 00:10:38,560 --> 00:10:39,090 Chúng ta hãy nâng cao nó. 239 00:10:39,090 --> 00:10:41,690 >> -Tăng cường phần A-6. 240 00:10:41,690 --> 00:10:43,510 >> -Tôi tăng cường chi tiết và - 241 00:10:43,510 --> 00:10:44,456 >> -Tôi nghĩ rằng có đủ để nâng cao. 242 00:10:44,456 --> 00:10:45,402 Phát hành nó để màn hình của tôi. 243 00:10:45,402 --> 00:10:47,300 >> -Tăng cường sự phản chiếu trong mắt cô. 244 00:10:47,300 --> 00:10:49,330 >> -Hãy chạy qua này Video nâng cao. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, bạn có thể nâng cao này? 246 00:10:50,340 --> 00:10:52,320 >> -Chờ một chút. 247 00:10:52,320 --> 00:10:54,290 >> -Tôi đã làm việc trên phản ánh điều này. 248 00:10:54,290 --> 00:10:55,560 >> -Có người phản ánh của. 249 00:10:55,560 --> 00:10:56,440 >> Phản chiếu. 250 00:10:56,440 --> 00:10:57,940 >> -Có một sự phản ánh khuôn mặt của người đàn ông. 251 00:10:57,940 --> 00:10:58,860 >> -Những phản ánh. 252 00:10:58,860 --> 00:10:59,710 >> -Có một sự phản ánh. 253 00:10:59,710 --> 00:11:00,900 >> -Phóng to trên gương. 254 00:11:00,900 --> 00:11:03,500 >> -Bạn có thể thấy một sự phản ánh. 255 00:11:03,500 --> 00:11:04,700 >> -Anh có thể nâng cao hình ảnh từ đây? 256 00:11:04,700 --> 00:11:05,700 >> -Anh có thể nâng cao anh phải ở đây? 257 00:11:05,700 --> 00:11:06,500 >> -Anh có thể nâng cao nó? 258 00:11:06,500 --> 00:11:07,380 >> -Anh có thể nâng cao nó? 259 00:11:07,380 --> 00:11:08,190 >> -Chúng ta có thể nâng cao này? 260 00:11:08,190 --> 00:11:08,940 >> -Anh có thể nâng cao nó? 261 00:11:08,940 --> 00:11:10,280 >> -Giữ trên một giây, tôi sẽ nâng cao. 262 00:11:10,280 --> 00:11:11,570 >> -Phóng to cửa. 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 >> [Cười] 266 00:11:13,197 --> 00:11:14,360 >> -Di chuyển in 267 00:11:14,360 --> 00:11:15,100 >> -Khoan đã, dừng lại. 268 00:11:15,100 --> 00:11:15,740 >> -Stop. 269 00:11:15,740 --> 00:11:16,290 >> -Tạm dừng nó. 270 00:11:16,290 --> 00:11:19,390 >> Xoay 75 độ xung quanh dọc xin. 271 00:11:19,390 --> 00:11:19,886 >> [Cười] 272 00:11:19,886 --> 00:11:24,350 >> -Stop, và trở lại một phần về cửa. 273 00:11:24,350 --> 00:11:26,330 >> -Có một tăng cường hình ảnh mà có thể bitmap? 274 00:11:26,330 --> 00:11:28,990 >> -Có lẽ chúng ta có thể sử dụng Pradeep Sen phương pháp để xem vào cửa sổ. 275 00:11:28,990 --> 00:11:30,680 >> -Phần mềm này là nhà nước của nghệ thuật. 276 00:11:30,680 --> 00:11:31,676 >> -Giá trị biểu tượng tắt. 277 00:11:31,676 --> 00:11:34,166 >> -Với sự kết hợp các thuật toán. 278 00:11:34,166 --> 00:11:38,399 >> -Ông ta đưa các thuật toán chiếu sáng để cấp độ tiếp theo và tôi có thể sử dụng chúng để 279 00:11:38,399 --> 00:11:38,648 nâng cao bức ảnh này. 280 00:11:38,648 --> 00:11:42,050 >> -Lock và mở rộng các trục z. 281 00:11:42,050 --> 00:11:42,760 >> -Tăng cường. 282 00:11:42,760 --> 00:11:43,060 >> -Tăng cường. 283 00:11:43,060 --> 00:11:43,760 >> -Tăng cường. 284 00:11:43,760 --> 00:11:45,010 >> -Freeze và nâng cao. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [END xem video] 287 00:11:47,910 --> 00:11:51,470 >> DAVID J. Malan: Vì vậy, vấn đề Set 5 là những gì ở phía trước đó. 288 00:11:51,470 --> 00:11:55,260 Vì vậy, chúng tôi sẽ sớm có được một sự hiểu biết tốt hơn khi nào và tại sao bạn có thể 289 00:11:55,260 --> 00:11:57,300 và chúng tôi không thể nâng cao theo cách đó. 290 00:11:57,300 --> 00:12:00,090 Nhưng trước tiên, chúng ta hãy trở lại sự chú ý của chúng tôi với một số các khối xây dựng, chúng tôi sẽ 291 00:12:00,090 --> 00:12:02,250 cần để có thể kể câu chuyện đó. 292 00:12:02,250 --> 00:12:05,580 >> Vì vậy, nhớ lại rằng chúng tôi đã thu hút hình ảnh này trên Thứ hai và một chút vào tuần trước. 293 00:12:05,580 --> 00:12:09,970 Và điều này mô tả cách bố trí của điều trong bộ nhớ máy tính của bạn khi 294 00:12:09,970 --> 00:12:11,000 chạy một số chương trình. 295 00:12:11,000 --> 00:12:14,310 Phân khúc công nghệ lên hàng đầu, thu hồi, đề cập đến số không và những người thực tế 296 00:12:14,310 --> 00:12:16,000 mà soạn chương trình của bạn. 297 00:12:16,000 --> 00:12:19,340 Có, dưới đây, một số khởi tạo hoặc dữ liệu chưa được khởi tạo, mà thường 298 00:12:19,340 --> 00:12:22,910 quan tới nhiều thứ như các hằng số hoặc dây hoặc các biến toàn cầu có 299 00:12:22,910 --> 00:12:24,200 được khai báo trước. 300 00:12:24,200 --> 00:12:26,500 Có đống, nhưng chúng tôi sẽ trở lại cho rằng trong một chút. 301 00:12:26,500 --> 00:12:27,410 >> Và sau đó có các ngăn xếp. 302 00:12:27,410 --> 00:12:30,660 Giống như một chồng khay trong quán cà phê, đây là nơi mà bộ nhớ được 303 00:12:30,660 --> 00:12:33,610 lớp và lớp bất cứ khi nào bạn làm những gì trong một chương trình? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Việc sử dụng ngăn xếp là gì? 306 00:12:37,730 --> 00:12:39,320 >> Yeah? 307 00:12:39,320 --> 00:12:40,000 >> Gọi chức năng. 308 00:12:40,000 --> 00:12:42,890 Bất cứ lúc nào bạn gọi một chức năng, đó là cho mảnh bộ nhớ cho nó 309 00:12:42,890 --> 00:12:45,020 biến địa phương hoặc tham số của nó. 310 00:12:45,020 --> 00:12:48,810 Và những bức tranh, chúng ta thấy rằng với mỗi chức năng liên tiếp được gọi là, khi A 311 00:12:48,810 --> 00:12:52,520 cuộc gọi B gọi C gọi D, họ được xếp lớp vào ngăn xếp. 312 00:12:52,520 --> 00:12:55,630 Và trong mỗi của những lát bộ nhớ cơ bản là một phạm vi độc đáo 313 00:12:55,630 --> 00:12:58,590 cho chức năng đó, trong đó, tất nhiên, là vấn đề nếu bạn muốn bàn tay 314 00:12:58,590 --> 00:13:01,850 từ một chức năng khác Một mảnh dữ liệu mà bạn muốn nó 315 00:13:01,850 --> 00:13:03,500 để biến đổi hoặc thay đổi. 316 00:13:03,500 --> 00:13:08,060 >> Vì vậy, những gì đã được giải pháp của chúng tôi để cho phép Một chức năng đại diện bởi một chồng 317 00:13:08,060 --> 00:13:11,390 khung để thay đổi bộ nhớ trong của một khung stack? 318 00:13:11,390 --> 00:13:14,590 Làm thế nào để hai nói chuyện với nhau? 319 00:13:14,590 --> 00:13:18,510 Vì vậy, bằng cách của con trỏ hoặc địa chỉ, trong đó, một lần nữa, chỉ cần mô tả nơi trong 320 00:13:18,510 --> 00:13:22,280 bộ nhớ, bằng cách của một cụ thể số cắn, đặc biệt là các 321 00:13:22,280 --> 00:13:23,830 giá trị có thể được tìm thấy. 322 00:13:23,830 --> 00:13:26,860 Vì vậy, nhớ lại lần cuối cùng chúng ta cũng tiếp tục những câu chuyện và nhìn vào một 323 00:13:26,860 --> 00:13:28,280 khá lỗi chương trình. 324 00:13:28,280 --> 00:13:32,900 Và chương trình này là lỗi cho một vài lý do, nhưng một trong những điều đáng lo ngại nhất là 325 00:13:32,900 --> 00:13:34,620 bởi vì nó không kiểm tra những gì? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Vâng, nó không kiểm tra đầu vào. 328 00:13:40,450 --> 00:13:41,870 Xin lỗi? 329 00:13:41,870 --> 00:13:43,880 >> Nếu đó là hơn 12 ký tự. 330 00:13:43,880 --> 00:13:47,260 Vì vậy, rất thông minh, khi gọi memcopy, trong đó, như tên cho thấy, chỉ 331 00:13:47,260 --> 00:13:50,630 bản sao bộ nhớ từ số thứ hai của mình vào số đầu tiên của nó. 332 00:13:50,630 --> 00:13:54,730 Đối số thứ ba, rất thông minh, là kiểm tra để chắc chắn rằng bạn làm không 333 00:13:54,730 --> 00:13:59,400 sao chép nhiều hơn, trong trường hợp này, độ dài của thanh, số ký tự, 334 00:13:59,400 --> 00:14:03,810 vào các điểm đến, đó chính là mảng C. Nhưng vấn đề là những gì 335 00:14:03,810 --> 00:14:07,230 nếu C tự nó không đủ lớn để xử lý đó? 336 00:14:07,230 --> 00:14:09,900 Bạn sẽ sao chép các số byte mà bạn đã được đưa ra. 337 00:14:09,900 --> 00:14:13,040 Nhưng những gì bạn thực sự có nhiều byte hơn bạn có chỗ cho? 338 00:14:13,040 --> 00:14:16,770 >> Vâng, chương trình này rất ngu ngốc chỉ một cách mù quáng tiến hành để có bất cứ điều gì nó 339 00:14:16,770 --> 00:14:20,650 cho, xin chào dấu chéo ngược là 0 tuyệt vời nếu chuỗi ngắn 340 00:14:20,650 --> 00:14:22,040 đủ, như năm ký tự. 341 00:14:22,040 --> 00:14:26,470 Nhưng nếu nó thực sự là 12 ký tự hoặc 1.200 ký tự, chúng ta đã thấy lần cuối cùng 342 00:14:26,470 --> 00:14:29,380 mà bạn chỉ cần đi để hoàn toàn ghi đè lên bộ nhớ 343 00:14:29,380 --> 00:14:30,470 không thuộc về bạn. 344 00:14:30,470 --> 00:14:34,390 Và trường hợp xấu nhất, nếu bạn ghi đè lên phần màu đỏ có mà chúng ta gọi là 345 00:14:34,390 --> 00:14:35,380 địa chỉ trở lại - 346 00:14:35,380 --> 00:14:38,370 đây chỉ là nơi mà máy tính tự động, cho bạn, đằng sau 347 00:14:38,370 --> 00:14:43,130 hậu trường, thâu nhỏ đi một giá trị 32-bit nhắc nhở nó những gì nó cần địa chỉ 348 00:14:43,130 --> 00:14:47,080 trở lại khi foo, chức năng này khác, được thực hiện thực hiện. 349 00:14:47,080 --> 00:14:49,320 Đó là một bánh cốm của các loại mà nó trả về. 350 00:14:49,320 --> 00:14:52,490 Nếu bạn ghi đè lên, có khả năng, nếu bạn là người xấu, có thể có thể 351 00:14:52,490 --> 00:14:54,750 có khả năng đảm nhận máy tính của ai đó. 352 00:14:54,750 --> 00:14:58,020 Và bạn sẽ chắc chắn nhất sụp đổ nó trong nhiều trường hợp. 353 00:14:58,020 --> 00:15:01,690 >> Bây giờ vấn đề này chỉ làm trầm trọng thêm như chúng tôi bắt đầu nói về bộ nhớ 354 00:15:01,690 --> 00:15:03,010 quản lý nói chung. 355 00:15:03,010 --> 00:15:07,150 Và malloc, cấp phát bộ nhớ, là một chức năng mà chúng ta có thể sử dụng để phân bổ 356 00:15:07,150 --> 00:15:11,260 bộ nhớ khi chúng ta không biết trước chúng ta có thể cần một số. 357 00:15:11,260 --> 00:15:13,960 Vì vậy, ví dụ, nếu tôi quay trở lại để thiết bị ở đây. 358 00:15:13,960 --> 00:15:21,010 Và tôi mở ra từ lần cuối cùng hello2.c, nhớ lại chương trình này ở đây, mà nhìn 359 00:15:21,010 --> 00:15:23,500 một chút gì đó như thế này, chỉ ba đường - 360 00:15:23,500 --> 00:15:27,940 nêu tên của bạn, sau đó tên chuỗi, bên trái, bằng getString. 361 00:15:27,940 --> 00:15:29,690 Và sau đó chúng tôi in ra, tên của người dùng. 362 00:15:29,690 --> 00:15:31,170 >> Vì vậy, đây là một chương trình rất dễ. 363 00:15:31,170 --> 00:15:34,870 Để được rõ ràng, hãy để tôi đi trước và làm cho hello-2. 364 00:15:34,870 --> 00:15:36,680 Tôi sẽ làm chấm dấu gạch chéo hello-2. 365 00:15:36,680 --> 00:15:37,750 Xưng danh của mình - 366 00:15:37,750 --> 00:15:38,140 David. 367 00:15:38,140 --> 00:15:38,840 Nhập. 368 00:15:38,840 --> 00:15:39,540 Xin chào David. 369 00:15:39,540 --> 00:15:41,060 Có vẻ như làm việc OK. 370 00:15:41,060 --> 00:15:43,140 Nhưng những gì đang thực sự xảy ra bên dưới mui xe đây? 371 00:15:43,140 --> 00:15:44,670 Đầu tiên, hãy bóc một số lớp. 372 00:15:44,670 --> 00:15:48,380 Chuỗi chỉ là một từ đồng nghĩa chúng tôi đã nhận ra để làm gì? 373 00:15:48,380 --> 00:15:49,110 Sao char. 374 00:15:49,110 --> 00:15:52,740 Vì vậy, hãy làm cho nó nhiều hơn một chút phức tạp nhưng hơn về mặt kỹ thuật chính xác mà này 375 00:15:52,740 --> 00:15:55,570 là một ngôi sao char, có nghĩa là tên, có, là một biến. 376 00:15:55,570 --> 00:15:59,920 Nhưng những gì các cửa hàng tên là địa chỉ của một char, mà cảm thấy một chút lạ 377 00:15:59,920 --> 00:16:01,050 bởi vì tôi nhận được trở lại một chuỗi. 378 00:16:01,050 --> 00:16:03,580 Tôi nhận được trở lại nhiều ký tự không phải là một char. 379 00:16:03,580 --> 00:16:07,400 >> Nhưng tất nhiên, bạn chỉ cần là người đầu tiên địa chỉ của char để nhớ nơi 380 00:16:07,400 --> 00:16:08,870 toàn bộ chuỗi là vì lý do tại sao? 381 00:16:08,870 --> 00:16:12,700 Làm thế nào để bạn tìm ra nơi kết thúc chuỗi là biết ngay từ đầu? 382 00:16:12,700 --> 00:16:13,630 Các dấu gạch chéo ngược không. 383 00:16:13,630 --> 00:16:17,260 Vì vậy, với hai đầu mối bạn tìm ra trước khi bắt đầu và kết thúc 384 00:16:17,260 --> 00:16:20,280 bất kỳ chuỗi là, miễn là họ hình thành đúng với null mà 385 00:16:20,280 --> 00:16:22,110 terminator, mà dấu gạch chéo ngược không. 386 00:16:22,110 --> 00:16:24,520 >> Nhưng điều này được gọi getString. 387 00:16:24,520 --> 00:16:28,020 Và nó quay ra rằng getString tất cả các thời gian này đã được loại 388 00:16:28,020 --> 00:16:28,820 gian lận đối với chúng tôi. 389 00:16:28,820 --> 00:16:32,460 Nó được làm công việc này, để đảm bảo, nhận được một chuỗi từ người sử dụng. 390 00:16:32,460 --> 00:16:34,580 Nhưng mà là bộ nhớ được đến từ đâu? 391 00:16:34,580 --> 00:16:38,440 Nếu chúng ta quay trở lại với hình ảnh ở đây và áp dụng định nghĩa từ một 392 00:16:38,440 --> 00:16:42,610 thời điểm trước đây, rằng ngăn xếp là nơi bộ nhớ đi khi chức năng này được gọi là, 393 00:16:42,610 --> 00:16:45,370 theo logic đó, khi bạn gọi getString, và sau đó tôi gõ 394 00:16:45,370 --> 00:16:50,900 D-A-V-I-D Nhập, mà là D-A-V-I-D dấu gạch chéo ngược không được lưu trữ trên cơ sở 395 00:16:50,900 --> 00:16:53,480 câu chuyện chúng tôi đã nói với chúng tôi cho đến nay? 396 00:16:53,480 --> 00:16:55,190 >> Nó có vẻ như là trong ngăn xếp, phải không? 397 00:16:55,190 --> 00:16:58,120 Khi bạn gọi nhận được chuỗi bạn nhận được một phần nhỏ của bộ nhớ trên stack. 398 00:16:58,120 --> 00:17:01,630 Vì vậy, nó đứng vào lý do mà D-A-V-I-D dấu gạch chéo ngược không được lưu trữ 399 00:17:01,630 --> 00:17:02,770 có trong stack. 400 00:17:02,770 --> 00:17:07,680 Nhưng chờ một phút, GetString lợi nhuận chuỗi, có thể nói, có nghĩa là 401 00:17:07,680 --> 00:17:11,700 đó là khay từ quán cà phê được lấy ra khỏi ngăn xếp. 402 00:17:11,700 --> 00:17:14,560 Và chúng tôi đã nói lần cuối cùng ngay sau khi một trở về chức năng, và bạn mất rằng 403 00:17:14,560 --> 00:17:20,109 khay, có thể nói, ra khỏi ngăn xếp, những gì bạn có thể giả định về những tàn tích của 404 00:17:20,109 --> 00:17:21,819 bộ nhớ? 405 00:17:21,819 --> 00:17:25,160 Tôi loại redrew họ như dấu hỏi bởi vì họ có hiệu quả trở thành 406 00:17:25,160 --> 00:17:26,250 giá trị không rõ. 407 00:17:26,250 --> 00:17:29,500 Họ có thể được tái sử dụng khi một số chức năng tiếp theo được gọi là. 408 00:17:29,500 --> 00:17:31,870 >> Nói cách khác, nếu chúng ta xảy ra được lưu trữ - 409 00:17:31,870 --> 00:17:34,350 Tôi sẽ vẽ một hình ảnh nhanh chóng đây của ngăn xếp. 410 00:17:34,350 --> 00:17:38,690 Nếu chúng ta tình cờ được vẽ phía dưới của phân đoạn bộ nhớ của tôi, và chúng tôi sẽ nói 411 00:17:38,690 --> 00:17:42,230 rằng đây là nơi bộ nhớ chiếm đóng bởi chính và có thể arg c và 412 00:17:42,230 --> 00:17:46,790 arg v và bất cứ điều gì khác trong chương trình, khi getString được gọi là, 413 00:17:46,790 --> 00:17:51,120 có lẽ getString được một đoạn bộ nhớ ở đây. 414 00:17:51,120 --> 00:17:53,940 Và sau đó D-A-V-I-D bằng cách nào đó kết thúc trong chức năng này. 415 00:17:53,940 --> 00:17:55,320 Và tôi sẽ đơn giản hóa. 416 00:17:55,320 --> 00:18:00,050 Nhưng hãy giả định rằng nó D-A-V-I-D dấu gạch chéo ngược không. 417 00:18:00,050 --> 00:18:03,500 Vì vậy, số byte này được sử dụng trong khung cho getString. 418 00:18:03,500 --> 00:18:08,270 >> Nhưng ngay sau khi trở về getString, chúng tôi cho biết lần cuối cùng mà bộ nhớ này trên 419 00:18:08,270 --> 00:18:11,340 đây tất cả sẽ trở thành - woops - 420 00:18:11,340 --> 00:18:14,270 tất cả trở nên bị xóa một cách hiệu quả. 421 00:18:14,270 --> 00:18:17,220 Và chúng ta có thể nghĩ về điều này bây giờ là câu hỏi đánh dấu bởi vì những người biết 422 00:18:17,220 --> 00:18:18,720 những gì sẽ trở thành bộ nhớ. 423 00:18:18,720 --> 00:18:22,130 Thật vậy, tôi rất thường xuyên gọi chức năng khác hơn getString. 424 00:18:22,130 --> 00:18:24,750 Và ngay sau khi tôi gọi một số khác chức năng hơn getString, có thể không trong 425 00:18:24,750 --> 00:18:28,860 chương trình đặc biệt này, chúng tôi chỉ nhìn tại nhưng một số khác, chắc chắn một số khác 426 00:18:28,860 --> 00:18:34,180 chức năng có thể sẽ được đưa ra vị trí tiếp theo trong stack. 427 00:18:34,180 --> 00:18:39,410 >> Vì vậy, nó không thể là các cửa hàng getString D-A-V-I-D trên ngăn xếp bởi vì tôi sẽ 428 00:18:39,410 --> 00:18:41,040 ngay lập tức mất quyền truy cập vào nó. 429 00:18:41,040 --> 00:18:43,720 Nhưng chúng tôi biết họ GetString chỉ trả về những gì? 430 00:18:43,720 --> 00:18:47,220 Nó không trở lại tôi sáu ký tự. 431 00:18:47,220 --> 00:18:51,090 Những gì là nó thực sự trở về không chúng tôi kết luận thời gian qua không? 432 00:18:51,090 --> 00:18:52,480 Địa chỉ của người đầu tiên. 433 00:18:52,480 --> 00:18:56,650 Vì vậy, bằng cách nào đó, khi bạn gọi là getString, nó phân bổ một đoạn bộ nhớ cho 434 00:18:56,650 --> 00:18:59,620 chuỗi rằng các loại và người sử dụng sau đó trở về địa chỉ của nó. 435 00:18:59,620 --> 00:19:02,930 Và nó chỉ ra rằng khi bạn muốn hoạt động cấp phát bộ nhớ trong này 436 00:19:02,930 --> 00:19:08,390 cách, hoàn trả cho người được gọi là có chức năng, địa chỉ của 437 00:19:08,390 --> 00:19:11,870 rằng đoạn bộ nhớ, bạn hoàn toàn không thể đặt nó trong ngăn xếp ở 438 00:19:11,870 --> 00:19:14,750 phía dưới, bởi vì chức năng nó chỉ sẽ không trở thành của bạn rất 439 00:19:14,750 --> 00:19:17,800 một cách nhanh chóng, vì vậy bạn có thể đoán nơi có lẽ chúng ta sẽ quăng nó 440 00:19:17,800 --> 00:19:20,130 thay vào đó, cái gọi là đống. 441 00:19:20,130 --> 00:19:25,290 >> Vì vậy, giữa dưới cùng của bộ nhớ của bạn bố trí và trên bộ nhớ của bạn 442 00:19:25,290 --> 00:19:26,820 bố trí là một bó toàn bộ các phân đoạn. 443 00:19:26,820 --> 00:19:29,270 Là một trong những ngăn xếp, và ngay ở trên nó là đống. 444 00:19:29,270 --> 00:19:33,680 Và đống chỉ là một đoạn khác nhau bộ nhớ đó là không được sử dụng cho các chức năng 445 00:19:33,680 --> 00:19:34,770 khi chúng được gọi. 446 00:19:34,770 --> 00:19:38,100 Nó được sử dụng cho bộ nhớ lâu dài, khi bạn muốn một chức năng để lấy một số 447 00:19:38,100 --> 00:19:42,700 bộ nhớ và có thể treo trên để nó mà không bị mất kiểm soát nó. 448 00:19:42,700 --> 00:19:45,550 >> Bây giờ bạn có thể có ngay lập tức thấy rằng đây không phải là 449 00:19:45,550 --> 00:19:48,060 nhất thiết phải là một thiết kế hoàn hảo. 450 00:19:48,060 --> 00:19:51,350 Như chương trình của bạn cấp phát bộ nhớ trên ngăn xếp, hoặc khi bạn gọi hơn và 451 00:19:51,350 --> 00:19:55,540 nhiều chức năng hơn, hoặc khi bạn phân bổ bộ nhớ trên heap với malloc ra như 452 00:19:55,540 --> 00:20:00,690 getString đang làm, những gì rõ ràng có vẻ là vấn đề không thể tránh khỏi? 453 00:20:00,690 --> 00:20:00,860 >> Đúng. 454 00:20:00,860 --> 00:20:03,150 Như thực tế là các mũi tên chỉ vào nhau 455 00:20:03,150 --> 00:20:04,380 không phải là điềm tốt. 456 00:20:04,380 --> 00:20:08,630 Và thực sự, chúng tôi rất nhanh chóng có thể sụp đổ một chương trình trong nhiều cách. 457 00:20:08,630 --> 00:20:12,050 Trong thực tế, tôi nghĩ rằng chúng tôi có thể có thực hiện điều này vô tình một lần. 458 00:20:12,050 --> 00:20:14,020 Hoặc nếu không, chúng ta hãy làm điều đó cố ý bây giờ. 459 00:20:14,020 --> 00:20:21,330 Hãy để tôi đi về phía trước và ghi siêu nhanh một chương trình gọi là dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 Và bây giờ tôi sẽ đi vào đây và làm sắc nét bao gồm stdio.h. 461 00:20:26,730 --> 00:20:32,620 Hãy khai báo hàm foo có không có đối số, đó là 462 00:20:32,620 --> 00:20:34,040 ký hiệu là tốt bởi khoảng trống. 463 00:20:34,040 --> 00:20:37,830 >> Và điều duy nhất foo sẽ làm là cuộc gọi foo, mà có lẽ không phải là 464 00:20:37,830 --> 00:20:39,100 ý tưởng thông minh nhất, nhưng như vậy đi. 465 00:20:39,100 --> 00:20:40,490 Ent void main. 466 00:20:40,490 --> 00:20:45,270 Bây giờ điều duy nhất chính là có làm là gọi foo là tốt. 467 00:20:45,270 --> 00:20:51,050 Và chỉ cần cho đá, tôi sẽ đi trước đây và nói printf "Xin chào từ 468 00:20:51,050 --> 00:20:52,340 foo. " 469 00:20:52,340 --> 00:20:52,890 >> OK. 470 00:20:52,890 --> 00:21:00,160 Vì vậy, nếu tôi đã không thực hiện bất kỳ sai lầm, Làm dontdothis chấm dấu gạch chéo. 471 00:21:00,160 --> 00:21:01,960 Và chúng ta hãy làm điều đó trong một cửa sổ lớn hơn - 472 00:21:01,960 --> 00:21:03,210 dấu chấm dấu gạch chéo, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Thôi nào. 475 00:21:08,840 --> 00:21:10,940 476 00:21:10,940 --> 00:21:11,890 Uh oh. 477 00:21:11,890 --> 00:21:13,100 Rõ ràng, bạn có thể làm điều này. 478 00:21:13,100 --> 00:21:15,190 Chết tiệt. 479 00:21:15,190 --> 00:21:16,190 OK. 480 00:21:16,190 --> 00:21:16,580 Chờ đợi. 481 00:21:16,580 --> 00:21:17,370 Đứng. 482 00:21:17,370 --> 00:21:18,270 Đã làm chúng tôi - 483 00:21:18,270 --> 00:21:20,110 Chúng tôi đã sử dụng nó với làm. 484 00:21:20,110 --> 00:21:22,050 >> [SIGHS] 485 00:21:22,050 --> 00:21:25,110 >> Tôi biết nhưng tôi nghĩ chúng tôi chỉ cần xóa đó. 486 00:21:25,110 --> 00:21:28,410 Uh, yeah. 487 00:21:28,410 --> 00:21:30,660 Chết tiệt. 488 00:21:30,660 --> 00:21:32,640 Giải quyết Rob này. 489 00:21:32,640 --> 00:21:34,678 Những gì? 490 00:21:34,678 --> 00:21:35,928 Nó rất đơn giản. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Vâng, chúng tôi quay tối ưu hóa off. 493 00:21:47,360 --> 00:21:48,970 OK, đứng chào tạm biệt. 494 00:21:48,970 --> 00:21:49,950 Bây giờ tôi cảm thấy tốt hơn. 495 00:21:49,950 --> 00:21:51,390 OK. 496 00:21:51,390 --> 00:21:51,780 Được rồi. 497 00:21:51,780 --> 00:21:53,430 >> Vì vậy, hãy biên dịch lại này - 498 00:21:53,430 --> 00:21:55,880 Làm cho bạn dontdothis. 499 00:21:55,880 --> 00:22:00,090 Bạn có thể phải đổi tên này để dothis.c chỉ trong một thời điểm. 500 00:22:00,090 --> 00:22:00,710 Có chúng tôi đi. 501 00:22:00,710 --> 00:22:01,240 Cảm ơn bạn. 502 00:22:01,240 --> 00:22:02,050 OK. 503 00:22:02,050 --> 00:22:05,480 Vì vậy, thực tế là tôi đã được in một cái gì đó thực sự chỉ 504 00:22:05,480 --> 00:22:08,150 làm chậm lại quá trình mà chúng tôi sẽ đạt đến điểm đó. 505 00:22:08,150 --> 00:22:08,510 OK. 506 00:22:08,510 --> 00:22:08,870 Chao ôi! 507 00:22:08,870 --> 00:22:11,180 >> Vì vậy, những gì đang thực sự xảy ra? 508 00:22:11,180 --> 00:22:14,440 Lý do đó, chỉ cần như một sang một bên, là làm bất cứ điều gì về đầu vào và 509 00:22:14,440 --> 00:22:17,270 sản lượng có xu hướng chậm bởi vì bạn phải viết ký tự đến 510 00:22:17,270 --> 00:22:18,600 màn hình, nó phải di chuyển. 511 00:22:18,600 --> 00:22:21,720 Vì vậy, câu chuyện dài ngắn, có tôi thực sự xảy ra quá thiếu kiên nhẫn, chúng ta sẽ có 512 00:22:21,720 --> 00:22:23,260 nhìn thấy kết quả cuối cùng này là tốt. 513 00:22:23,260 --> 00:22:26,220 Bây giờ tôi đã đi xe của in-up, chúng ta thấy nó ngay lập tức. 514 00:22:26,220 --> 00:22:28,410 Vì vậy, tại sao điều này lại xảy ra. 515 00:22:28,410 --> 00:22:31,300 Vâng, lời giải thích đơn giản, tất nhiên, là foo có lẽ không nên 516 00:22:31,300 --> 00:22:32,500 được gọi chính nó. 517 00:22:32,500 --> 00:22:34,470 >> Bây giờ một cách chung chung, đây là đệ quy. 518 00:22:34,470 --> 00:22:36,970 Và chúng tôi nghĩ một vài tuần trước đệ quy là tốt. 519 00:22:36,970 --> 00:22:40,330 Đệ quy là cách này huyền diệu của thể hiện bản thân siêu ngắn gọn. 520 00:22:40,330 --> 00:22:41,400 Và nó chỉ hoạt động. 521 00:22:41,400 --> 00:22:45,060 Nhưng có một tính năng quan trọng của tất cả các các chương trình đệ quy, chúng tôi đã nói chuyện 522 00:22:45,060 --> 00:22:48,260 về và nhìn vậy, đến nay, trong đó là họ đã có những gì? 523 00:22:48,260 --> 00:22:52,610 Một trường hợp cơ bản, đó là một số khó khăn mã trường hợp đó cho biết trong một số trường hợp 524 00:22:52,610 --> 00:22:56,210 không gọi foo, mà rõ ràng là không phải là trường hợp ở đây. 525 00:22:56,210 --> 00:22:58,920 >> Vì vậy, những gì đang thực sự xảy ra về hình ảnh này? 526 00:22:58,920 --> 00:23:01,790 Vâng, khi chính gọi foo, nó được một phần của bộ nhớ. 527 00:23:01,790 --> 00:23:04,150 Khi gọi foo foo, nó được một phần của bộ nhớ. 528 00:23:04,150 --> 00:23:06,430 Khi gọi foo foo, nó được một lát. 529 00:23:06,430 --> 00:23:07,080 Nó được một lát. 530 00:23:07,080 --> 00:23:08,120 Nó được một lát. 531 00:23:08,120 --> 00:23:09,460 Vì foo là không bao giờ quay trở lại. 532 00:23:09,460 --> 00:23:12,160 Chúng tôi sẽ không bao giờ xóa bỏ một trong những khung hình từ ngăn xếp. 533 00:23:12,160 --> 00:23:15,930 Vì vậy, chúng tôi đang thổi qua đống, không đề cập đến nhiều thứ khác nữa, và 534 00:23:15,930 --> 00:23:19,600 chúng tôi đang overstepping giới hạn của chúng tôi cái gọi là phân đoạn của bộ nhớ. 535 00:23:19,600 --> 00:23:21,790 Lỗi đi sai phân khúc. 536 00:23:21,790 --> 00:23:24,110 >> Vì vậy, các giải pháp có rõ ràng không làm điều này. 537 00:23:24,110 --> 00:23:28,830 Nhưng ý nghĩa lớn hơn là, có, có hoàn toàn là một số giới hạn, 538 00:23:28,830 --> 00:23:32,470 ngay cả khi nó không được xác định rõ, như thế nào nhiều chức năng mà bạn có thể gọi trong một 539 00:23:32,470 --> 00:23:34,970 chương trình, bao nhiêu lần một chức năng có thể gọi chính nó. 540 00:23:34,970 --> 00:23:38,430 Vì vậy, mặc dù chúng tôi đã rao giảng đệ quy như điều này có khả năng kỳ diệu một 541 00:23:38,430 --> 00:23:41,870 vài tuần trước đây cho sigma chức năng, và khi chúng tôi nhận được dữ liệu 542 00:23:41,870 --> 00:23:45,270 cấu trúc và CS50, bạn sẽ thấy khác ứng dụng cho nó, nó không 543 00:23:45,270 --> 00:23:46,500 nhất thiết phải là điều tốt nhất. 544 00:23:46,500 --> 00:23:50,070 Bởi vì nếu một hàm gọi chính nó, tự gọi mình, ngay cả khi có một cơ sở 545 00:23:50,070 --> 00:23:54,860 trường hợp, nếu bạn không đánh mà trường hợp cơ sở 1.000 cuộc gọi hoặc 10.000 cuộc gọi, bởi 546 00:23:54,860 --> 00:23:58,800 thời gian đó bạn có thể chạy ra khỏi phòng trên cái gọi là ngăn xếp và nhấn 547 00:23:58,800 --> 00:24:00,400 một số bộ phận khác của bộ nhớ. 548 00:24:00,400 --> 00:24:03,950 Vì vậy, nó cũng là một thiết kế thương mại-off giữa sang trọng và giữa 549 00:24:03,950 --> 00:24:06,920 vững mạnh của riêng của bạn thực hiện. 550 00:24:06,920 --> 00:24:10,780 >> Do đó, có một nhược điểm hay Ghi chú khác với những gì chúng tôi đã 551 00:24:10,780 --> 00:24:11,720 được thực hiện cho đến nay. 552 00:24:11,720 --> 00:24:12,980 Khi tôi gọi là getString - 553 00:24:12,980 --> 00:24:15,120 hãy để tôi quay trở lại vào hello-2. 554 00:24:15,120 --> 00:24:18,170 Nhận thấy rằng tôi gọi getString, mà là trả lại một địa chỉ. 555 00:24:18,170 --> 00:24:20,730 Và chúng ta nói ngày hôm nay rằng địa chỉ là từ đống. 556 00:24:20,730 --> 00:24:24,480 Và bây giờ tôi in ra chuỗi tại địa chỉ đó. 557 00:24:24,480 --> 00:24:27,000 Nhưng chúng tôi đã không bao giờ được gọi là đối diện của getString. 558 00:24:27,000 --> 00:24:30,850 Chúng tôi chưa bao giờ phải calll một chức năng như ungetstring, nơi bạn có tay trở lại 559 00:24:30,850 --> 00:24:31,610 bộ nhớ. 560 00:24:31,610 --> 00:24:33,250 Nhưng thẳng thắn mà nói, chúng tôi có thể cần phải có được. 561 00:24:33,250 --> 00:24:37,390 Bởi vì nếu chúng ta tiếp tục yêu cầu máy tính cho bộ nhớ, bằng cách của một người nào đó như 562 00:24:37,390 --> 00:24:40,830 getString nhưng không bao giờ cho nó trở lại, chắc chắn đó cũng là ràng buộc để dẫn đến 563 00:24:40,830 --> 00:24:42,970 vấn đề đó chúng tôi chạy ra khỏi bộ nhớ. 564 00:24:42,970 --> 00:24:46,140 >> Và trong thực tế, chúng ta có thể tìm kiếm những vấn đề với các công cụ mới mà sử dụng 565 00:24:46,140 --> 00:24:47,640 là một chút khó hiểu để loại. 566 00:24:47,640 --> 00:24:50,960 Nhưng hãy để tôi đi trước và nó giật gân lên trên màn hình chỉ trong một thời điểm. 567 00:24:50,960 --> 00:24:56,940 Tôi sẽ đi trước và chạy Valgrind với tham số có lệnh đầu tiên 568 00:24:56,940 --> 00:25:00,260 đối số dòng là tên của chương trình hello-2. 569 00:25:00,260 --> 00:25:02,650 Và thật không may nó đầu ra là atrociously 570 00:25:02,650 --> 00:25:04,290 phức tạp không có lý do tốt. 571 00:25:04,290 --> 00:25:06,280 Vì vậy, chúng ta thấy tất cả những mớ hỗn độn. 572 00:25:06,280 --> 00:25:07,530 David là nêu tên của tôi. 573 00:25:07,530 --> 00:25:09,760 Vì vậy, đó là chương trình thực sự chạy. 574 00:25:09,760 --> 00:25:11,180 Và bây giờ chúng tôi nhận được kết quả này. 575 00:25:11,180 --> 00:25:13,400 >> Vì vậy, Valgrind là tương tự trong tinh thần GDB. 576 00:25:13,400 --> 00:25:14,950 Nó không phải là một chương trình gỡ rối cho mỗi gia nhập. 577 00:25:14,950 --> 00:25:16,270 Nhưng đó là một kiểm tra bộ nhớ. 578 00:25:16,270 --> 00:25:20,140 Đó là một chương trình mà sẽ chạy của bạn chương trình và cho bạn biết nếu bạn hỏi một 579 00:25:20,140 --> 00:25:23,860 máy tính cho bộ nhớ và không bao giờ đưa nó trở lại, do đó có nghĩa là bạn có 580 00:25:23,860 --> 00:25:24,570 một rò rỉ bộ nhớ. 581 00:25:24,570 --> 00:25:26,240 Và rò rỉ bộ nhớ có xu hướng xấu. 582 00:25:26,240 --> 00:25:29,120 Và bạn là người dùng máy tính có có thể cảm thấy điều này, cho dù bạn có một 583 00:25:29,120 --> 00:25:30,300 Máy Mac hoặc PC. 584 00:25:30,300 --> 00:25:33,730 Bạn đã bao giờ sử dụng máy tính của bạn trong khi và không khởi động lại trong một vài 585 00:25:33,730 --> 00:25:36,820 ngày, hoặc bạn đã chỉ cần có rất nhiều chương trình đang chạy, và điều chết tiệt 586 00:25:36,820 --> 00:25:42,360 chậm ngừng hẳn lại, hoặc ít nhất là đó là siêu gây phiền nhiễu để sử dụng, bởi vì 587 00:25:42,360 --> 00:25:44,350 tất cả mọi thứ chỉ có siêu chậm. 588 00:25:44,350 --> 00:25:46,260 >> Bây giờ mà có thể là bất kỳ số lý do. 589 00:25:46,260 --> 00:25:49,600 Nó có thể là một vòng lặp vô hạn, một lỗi trong Mở một ai đó, hay đơn giản hơn, nó 590 00:25:49,600 --> 00:25:53,250 có nghĩa là bạn đang sử dụng hơn bộ nhớ, hoặc cố gắng, hơn bạn 591 00:25:53,250 --> 00:25:54,920 máy tính thực sự có. 592 00:25:54,920 --> 00:25:57,770 Và có thể có một lỗi trong một số chương trình mà tiếp tục yêu cầu cho bộ nhớ. 593 00:25:57,770 --> 00:26:02,480 Trình duyệt trong nhiều năm qua đã nổi tiếng với này, yêu cầu bộ nhớ nhiều hơn và nhiều hơn nữa 594 00:26:02,480 --> 00:26:03,870 nhưng không bao giờ đưa nó trở lại. 595 00:26:03,870 --> 00:26:07,220 Chắc chắn, nếu bạn chỉ có một hữu hạn số lượng bộ nhớ, bạn không thể yêu cầu 596 00:26:07,220 --> 00:26:09,990 vô hạn nhiều lần cho một số bộ nhớ. 597 00:26:09,990 --> 00:26:13,070 >> Và vì vậy những gì bạn thấy ở đây, mặc dù một lần nữa sản lượng Valgrind là 598 00:26:13,070 --> 00:26:17,490 không cần thiết phức tạp nhìn lướt qua đầu tiên, đây là một phần thú vị. 599 00:26:17,490 --> 00:26:18,890 Heap - 600 00:26:18,890 --> 00:26:20,060 trong sử dụng ở lối ra. 601 00:26:20,060 --> 00:26:22,810 Vì vậy, đây là bao nhiêu bộ nhớ là được sử dụng trong các đống tại 602 00:26:22,810 --> 00:26:24,300 Hiện chương trình của tôi đã thoát - 603 00:26:24,300 --> 00:26:27,280 rõ ràng sáu byte trong một khối. 604 00:26:27,280 --> 00:26:28,710 Vì vậy, tôi sẽ vẫy tay của tôi vào những gì là một khối. 605 00:26:28,710 --> 00:26:31,270 Hãy suy nghĩ của nó chỉ là một đoạn, một hơn từ kỹ thuật cho đoạn. 606 00:26:31,270 --> 00:26:33,140 Nhưng sáu byte - 607 00:26:33,140 --> 00:26:36,870 sáu byte là gì vẫn còn sử dụng không? 608 00:26:36,870 --> 00:26:37,390 >> Chính xác. 609 00:26:37,390 --> 00:26:41,520 D-A-V-I-D không dấu chéo ngược, năm thư tên cộng với các terminator null. 610 00:26:41,520 --> 00:26:46,350 Vì vậy, chương trình này valgrind nhận thấy rằng tôi yêu cầu sáu byte, rõ ràng, bởi 611 00:26:46,350 --> 00:26:48,950 cách getString, nhưng không bao giờ đưa chúng trở lại. 612 00:26:48,950 --> 00:26:52,030 Và trong thực tế, điều này không thể được như vậy rõ ràng nếu chương trình của tôi không phải là ba 613 00:26:52,030 --> 00:26:53,590 dòng, nhưng nó là 300 dòng. 614 00:26:53,590 --> 00:26:56,920 Vì vậy, chúng tôi thực sự có thể cung cấp cho một lệnh khác đối số dòng để Valgrind để 615 00:26:56,920 --> 00:26:58,290 làm cho nó chi tiết hơn. 616 00:26:58,290 --> 00:26:59,760 Đó là một chút khó chịu để nhớ. 617 00:26:59,760 --> 00:27:01,580 Nhưng nếu tôi làm - 618 00:27:01,580 --> 00:27:01,930 chúng ta hãy xem. 619 00:27:01,930 --> 00:27:03,540 Bị rò rỉ - 620 00:27:03,540 --> 00:27:05,030 Được nó bị rò rỉ - 621 00:27:05,030 --> 00:27:07,580 thậm chí tôi không nhớ được ra tay. 622 00:27:07,580 --> 00:27:08,550 >> - Bị rò rỉ-kiểm tra bằng đầy đủ. 623 00:27:08,550 --> 00:27:10,180 Vâng, cảm ơn bạn. 624 00:27:10,180 --> 00:27:12,520 - Bị rò rỉ-kiểm tra bằng đầy đủ. 625 00:27:12,520 --> 00:27:13,800 Nhập. 626 00:27:13,800 --> 00:27:14,940 Cùng một chương trình đang chạy. 627 00:27:14,940 --> 00:27:16,180 Gõ David một lần nữa. 628 00:27:16,180 --> 00:27:17,660 Bây giờ tôi thấy chi tiết hơn một chút. 629 00:27:17,660 --> 00:27:20,890 Nhưng dưới đây tóm tắt đống, mà là giống hệt nhau đến bốn - ah, 630 00:27:20,890 --> 00:27:22,120 đây là loại tốt đẹp. 631 00:27:22,120 --> 00:27:25,460 Bây giờ Valgrind được thực sự tìm kiếm một chút khó khăn hơn trong mã của tôi. 632 00:27:25,460 --> 00:27:29,580 Và nó nói rằng, rõ ràng, malloc tại dòng - 633 00:27:29,580 --> 00:27:30,580 chúng tôi thu nhỏ. 634 00:27:30,580 --> 00:27:31,980 Tại dòng - 635 00:27:31,980 --> 00:27:32,930 chúng tôi không nhìn thấy nó là những gì dòng. 636 00:27:32,930 --> 00:27:35,110 Nhưng malloc là thủ phạm đầu tiên. 637 00:27:35,110 --> 00:27:38,630 Có một blog trong malloc. 638 00:27:38,630 --> 00:27:39,810 >> Tất cả phải không? 639 00:27:39,810 --> 00:27:40,450 OK, không. 640 00:27:40,450 --> 00:27:40,940 Phải không? 641 00:27:40,940 --> 00:27:42,520 Tôi gọi GetString. 642 00:27:42,520 --> 00:27:44,460 getString rõ ràng gọi malloc. 643 00:27:44,460 --> 00:27:47,800 Vì vậy, những gì dòng mã là rõ ràng có lỗi vì đã 644 00:27:47,800 --> 00:27:49,050 cấp phát bộ nhớ này? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Giả sử rằng bất cứ ai đã viết malloc đã được khoảng đủ lâu rằng nó là 647 00:27:55,540 --> 00:27:56,390 không phải là lỗi của họ. 648 00:27:56,390 --> 00:27:57,520 Vì vậy, nó có thể là tôi. 649 00:27:57,520 --> 00:28:02,000 GetString trong cs50.c - vì vậy đó là một nộp ở đâu đó trên máy tính - 650 00:28:02,000 --> 00:28:05,210 trong dòng 286 có vẻ là thủ phạm. 651 00:28:05,210 --> 00:28:08,140 Bây giờ chúng ta hãy giả sử rằng CS50 đã được xung quanh cho số tiền khá thời gian, vì vậy 652 00:28:08,140 --> 00:28:09,720 chúng ta cũng không thể sai lầm. 653 00:28:09,720 --> 00:28:14,080 Và do đó, nó có lẽ không phải trong GetString rằng lỗi nằm, mà là trong 654 00:28:14,080 --> 00:28:17,810 dòng hello-2.c 18. 655 00:28:17,810 --> 00:28:20,670 >> Vì vậy, chúng ta hãy nhìn vào những gì mà dòng 18 là. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 Bằng cách nào đó dòng này không nhất thiết phải lỗi, cho mỗi gia nhập, nhưng đó là lý do 658 00:28:27,130 --> 00:28:28,630 sau đó rò rỉ bộ nhớ. 659 00:28:28,630 --> 00:28:32,140 Vì vậy, siêu đơn giản, những gì sẽ trực giác là giải pháp ở đây? 660 00:28:32,140 --> 00:28:34,710 Nếu chúng tôi đang yêu cầu cho bộ nhớ, không bao giờ cho nó trở lại, và đó có vẻ là một 661 00:28:34,710 --> 00:28:37,940 vấn đề bởi vì theo thời gian máy tính của tôi có thể chạy ra khỏi bộ nhớ, có thể làm chậm 662 00:28:37,940 --> 00:28:42,110 xuống, những điều xấu có thể xảy ra, tốt, các giải pháp trực quan đơn giản là những gì? 663 00:28:42,110 --> 00:28:43,140 Chỉ cần cho nó trở lại. 664 00:28:43,140 --> 00:28:44,770 >> Làm thế nào để bạn giải phóng bộ nhớ? 665 00:28:44,770 --> 00:28:49,970 Vâng, may mắn nó khá đơn giản chỉ cần nói tên miễn phí. 666 00:28:49,970 --> 00:28:51,260 Và chúng tôi đã không bao giờ làm điều này trước. 667 00:28:51,260 --> 00:28:55,890 Nhưng về cơ bản bạn có thể nghĩ miễn phí như trái ngược với malloc. 668 00:28:55,890 --> 00:28:58,030 miễn phí là đối diện của cấp phát bộ nhớ. 669 00:28:58,030 --> 00:28:59,540 Vì vậy, bây giờ hãy để tôi biên dịch lại này. 670 00:28:59,540 --> 00:29:02,050 Làm hello-2. 671 00:29:02,050 --> 00:29:04,620 Cho phép tôi chạy nó một lần nữa. hello-2 David. 672 00:29:04,620 --> 00:29:07,290 Vì vậy, nó dường như làm việc trong chính xác theo cùng một cách. 673 00:29:07,290 --> 00:29:11,180 Nhưng nếu tôi quay trở lại Valgrind và chạy lại cùng lệnh trên của tôi mới 674 00:29:11,180 --> 00:29:14,720 biên soạn chương trình, đánh máy trong tên của tôi như trước đây - 675 00:29:14,720 --> 00:29:15,370 tốt đẹp. 676 00:29:15,370 --> 00:29:16,760 Tóm tắt đống - 677 00:29:16,760 --> 00:29:17,740 trong sử dụng ở lối ra - 678 00:29:17,740 --> 00:29:19,370 byte trong khối không. 679 00:29:19,370 --> 00:29:21,840 Và điều này là siêu đẹp, tất cả khối đống được trả tự do. 680 00:29:21,840 --> 00:29:23,480 Không có rò rỉ là có thể. 681 00:29:23,480 --> 00:29:27,200 >> Vì vậy, sắp tới, không có vấn đề Set 4, nhưng với vấn đề Set 5, pháp y 682 00:29:27,200 --> 00:29:30,740 trở đi, điều này cũng sẽ trở thành một biện pháp đúng đắn của bạn 683 00:29:30,740 --> 00:29:33,630 chương trình, cho dù bạn có hay không hoặc không có rò rỉ bộ nhớ. 684 00:29:33,630 --> 00:29:36,900 Nhưng may mắn thay, không chỉ bạn có thể lý do qua chúng bằng trực giác, mà 685 00:29:36,900 --> 00:29:40,430 là, cho là, dễ dàng cho các chương trình nhỏ nhưng khó khăn hơn cho các chương trình lớn hơn, 686 00:29:40,430 --> 00:29:43,860 Valgrind, đối với những chương trình lớn hơn, có thể giúp bạn xác định 687 00:29:43,860 --> 00:29:45,360 các vấn đề cụ thể. 688 00:29:45,360 --> 00:29:47,500 >> Nhưng có một vấn đề khác có thể phát sinh. 689 00:29:47,500 --> 00:29:51,245 Hãy để tôi mở file này ở đây, đó là, một lần nữa, một ví dụ khá đơn giản. 690 00:29:51,245 --> 00:29:53,760 Nhưng chúng ta hãy tập trung vào những gì chương trình này không. 691 00:29:53,760 --> 00:29:55,190 Điều này được gọi là memory.c. 692 00:29:55,190 --> 00:29:58,380 Chúng tôi sẽ đăng này sau hôm nay zip mã nguồn của ngày hôm nay. 693 00:29:58,380 --> 00:30:01,610 Và nhận thấy rằng tôi có một chức năng được gọi là e không có đối số và 694 00:30:01,610 --> 00:30:02,800 trả về không có gì. 695 00:30:02,800 --> 00:30:07,240 Trong dòng 20, tôi dường như tuyên bố một con trỏ đến một int và gọi đó là x. 696 00:30:07,240 --> 00:30:09,570 Tôi đang giao là sự trở lại giá trị của malloc. 697 00:30:09,570 --> 00:30:14,590 Và chỉ để được rõ ràng, có bao nhiêu byte am Tôi có thể nhận được từ malloc 698 00:30:14,590 --> 00:30:17,080 trong tình huống này? 699 00:30:17,080 --> 00:30:18,040 >> Có lẽ 40. 700 00:30:18,040 --> 00:30:18,840 Nơi nào bạn nhận được điều đó từ đâu? 701 00:30:18,840 --> 00:30:22,410 Vâng, nếu bạn nhớ lại rằng một int thường 4 byte, ít nhất là trong 702 00:30:22,410 --> 00:30:25,110 thiết bị, 10 lần 4 rõ ràng là 40. 703 00:30:25,110 --> 00:30:28,920 Vì vậy, malloc là trả lại một địa chỉ một đoạn bộ nhớ và lưu trữ đó 704 00:30:28,920 --> 00:30:30,800 giải quyết cuối cùng trong x. 705 00:30:30,800 --> 00:30:32,570 Vì vậy, để được rõ ràng, những gì sau đó đang xảy ra? 706 00:30:32,570 --> 00:30:34,990 Vâng, hãy để tôi chuyển về để hình ảnh của chúng tôi ở đây. 707 00:30:34,990 --> 00:30:38,150 Hãy để tôi không chỉ vẽ dưới cùng của tôi bộ nhớ của máy tính, hãy để tôi đi trước và 708 00:30:38,150 --> 00:30:42,990 vẽ cả hình chữ nhật đại diện cho tất cả các bộ nhớ RAM của tôi. 709 00:30:42,990 --> 00:30:44,790 >> Chúng tôi sẽ nói rằng ngăn xếp là ở phía dưới. 710 00:30:44,790 --> 00:30:47,010 Và có một đoạn văn bản trong các dữ liệu chưa được khởi tạo. 711 00:30:47,010 --> 00:30:49,880 Nhưng tôi chỉ cần đi đến những trừu tượng những thứ khác đi như dấu chấm, dấu chấm dấu chấm. 712 00:30:49,880 --> 00:30:53,470 Tôi chỉ cần đi để tham khảo này như đống ở đầu trang. 713 00:30:53,470 --> 00:30:57,070 Và sau đó ở dưới cùng của hình ảnh này, để đại diện cho chính, tôi sẽ 714 00:30:57,070 --> 00:30:59,880 để cho nó một bộ nhớ lát trên stack. 715 00:30:59,880 --> 00:31:03,150 Cho e, tôi sẽ cung cấp cho nó một lát bộ nhớ trên stack. 716 00:31:03,150 --> 00:31:05,140 Bây giờ, tôi đã tham khảo ý kiến ​​của tôi mã nguồn một lần nữa. 717 00:31:05,140 --> 00:31:07,170 Các biến địa phương chính là gì? 718 00:31:07,170 --> 00:31:10,710 Dường như không có gì, vì vậy slice đó là hiệu quả sản phẩm nào hoặc thậm chí không lớn 719 00:31:10,710 --> 00:31:11,600 như tôi đã vẽ nó. 720 00:31:11,600 --> 00:31:15,730 Nhưng trong e, tôi có một biến địa phương, được gọi là x. 721 00:31:15,730 --> 00:31:20,410 Vì vậy, tôi sẽ đi trước và cho f một đoạn bộ nhớ, gọi đó là x. 722 00:31:20,410 --> 00:31:24,680 >> Và bây giờ malloc 10 lần 4, Vì vậy, malloc 40, đâu đó 723 00:31:24,680 --> 00:31:25,430 nhớ đến từ đâu? 724 00:31:25,430 --> 00:31:27,530 Chúng tôi đã không rút ra một bức tranh như thế này trước đây. 725 00:31:27,530 --> 00:31:31,140 Nhưng chúng ta hãy giả sử rằng nó có hiệu quả từ đây, vì vậy một, 726 00:31:31,140 --> 00:31:33,170 hai, ba, bốn, năm. 727 00:31:33,170 --> 00:31:34,680 Và bây giờ tôi cần 40 trong số này. 728 00:31:34,680 --> 00:31:37,540 Vì vậy, tôi sẽ chỉ làm dấu chấm, dấu chấm, dấu chấm để đề nghị rằng có bộ nhớ nhiều hơn 729 00:31:37,540 --> 00:31:39,350 trở lại từ đống. 730 00:31:39,350 --> 00:31:40,710 Tại địa chỉ là những gì? 731 00:31:40,710 --> 00:31:42,620 Hãy chọn tùy ý của chúng tôi giải quyết như mọi khi - 732 00:31:42,620 --> 00:31:46,310 Ox123, mặc dù nó có lẽ sẽ là một cái gì đó hoàn toàn khác nhau. 733 00:31:46,310 --> 00:31:50,420 Đó là địa chỉ của byte đầu tiên trong bộ nhớ mà tôi yêu cầu malloc cho. 734 00:31:50,420 --> 00:31:53,630 >> Vì vậy, trong ngắn hạn, một khi dòng 20 thực hiện, những gì là nghĩa đen 735 00:31:53,630 --> 00:31:57,170 được lưu trữ bên trong của x ở đây? 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 Và Ox là nhàm chán. 739 00:32:01,550 --> 00:32:03,200 Nó chỉ có nghĩa đây là một số thập lục phân. 740 00:32:03,200 --> 00:32:06,490 Nhưng điều quan trọng là những gì tôi đã lưu trữ trong x, mà là một biến địa phương. 741 00:32:06,490 --> 00:32:10,260 Nhưng kiểu dữ liệu của nó, một lần nữa, là một địa chỉ của một int. 742 00:32:10,260 --> 00:32:12,710 Vâng, tôi sẽ lưu trữ Ox123. 743 00:32:12,710 --> 00:32:16,610 Nhưng một lần nữa, nếu đó là một chút quá phức tạp không cần thiết, nếu tôi di chuyển 744 00:32:16,610 --> 00:32:21,490 trở lại, chúng ta có thể trừu tượng này đi khá hợp lý và chỉ nói rằng x là một 745 00:32:21,490 --> 00:32:23,910 con trỏ vào đó đoạn bộ nhớ. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Bây giờ câu hỏi ở bàn tay như sau - 748 00:32:26,230 --> 00:32:29,910 dòng 21, nó quay ra, là lỗi. 749 00:32:29,910 --> 00:32:31,160 Tại sao? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Xin lỗi? 752 00:32:36,930 --> 00:32:38,640 Nó không có - 753 00:32:38,640 --> 00:32:40,390 nói rằng một lần nữa. 754 00:32:40,390 --> 00:32:41,240 Vâng, nó không miễn phí. 755 00:32:41,240 --> 00:32:42,350 Vì vậy, đó là lần thứ hai nhưng. 756 00:32:42,350 --> 00:32:45,000 Do đó, có một khác nhưng đặc biệt tại dòng 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Chính xác. 759 00:32:50,040 --> 00:32:54,980 Này dòng mã đơn giản chỉ là một là lỗi tràn bộ đệm, một tràn bộ đệm. 760 00:32:54,980 --> 00:32:57,050 Một bộ đệm chỉ có nghĩa là một đoạn bộ nhớ. 761 00:32:57,050 --> 00:33:01,520 Nhưng mà đoạn bộ nhớ có kích thước 10, 10 số nguyên, có nghĩa là nếu chúng ta 762 00:33:01,520 --> 00:33:05,350 chỉ số vào nó bằng cách sử dụng cú pháp đường của mảng ký hiệu, hình vuông 763 00:33:05,350 --> 00:33:09,220 ngoặc đơn, bạn có thể truy cập x khung 0 x 1 x khung, 764 00:33:09,220 --> 00:33:10,390 khung dấu chấm, dấu chấm, dấu chấm. 765 00:33:10,390 --> 00:33:13,270 x khung 9 là một trong những lớn nhất. 766 00:33:13,270 --> 00:33:17,680 Vì vậy, nếu tôi làm x khung 10, nơi Tôi đang thực sự xảy ra trong bộ nhớ? 767 00:33:17,680 --> 00:33:19,120 >> Vâng, nếu tôi có 10 int - 768 00:33:19,120 --> 00:33:21,070 chúng ta hãy thực sự rút ra tất cả trong số này ra đây. 769 00:33:21,070 --> 00:33:22,700 Vì vậy, đó là năm đầu tiên. 770 00:33:22,700 --> 00:33:24,660 Đây là năm số nguyên khác. 771 00:33:24,660 --> 00:33:29,580 Vì vậy, khung x 0 là đây. x khung 1 là đây. x khung 9 là đây. x khung 772 00:33:29,580 --> 00:33:37,960 10 là ở đây, có nghĩa là tôi nói, ở dòng 21, các máy tính đặt 773 00:33:37,960 --> 00:33:39,400 số ở đâu? 774 00:33:39,400 --> 00:33:42,010 Số 0 ở đâu? 775 00:33:42,010 --> 00:33:43,380 Vâng, đó là 0, có. 776 00:33:43,380 --> 00:33:45,460 Nhưng chỉ thực tế là 0 của nó là loại một trùng hợp ngẫu nhiên. 777 00:33:45,460 --> 00:33:47,140 Nó có thể là số 50, cho tất cả chúng ta quan tâm. 778 00:33:47,140 --> 00:33:50,480 Nhưng chúng tôi đang cố gắng để đặt nó tại x khung 10, đó là nơi này 779 00:33:50,480 --> 00:33:53,700 dấu hỏi được rút ra, trong đó không phải là một điều tốt. 780 00:33:53,700 --> 00:33:57,070 Chương trình điều này có thể rất tốt sụp đổ như một kết quả. 781 00:33:57,070 --> 00:33:59,400 >> Bây giờ, chúng ta hãy đi trước và xem nếu điều này là, thực sự, những gì xảy ra. 782 00:33:59,400 --> 00:34:02,600 Làm cho bộ nhớ, vì các tập tin được gọi là memory.c. 783 00:34:02,600 --> 00:34:05,950 Chúng ta hãy đi trước và chạy bộ nhớ chương trình. 784 00:34:05,950 --> 00:34:08,239 Vì vậy, chúng tôi đã may mắn, thực sự, có vẻ như. 785 00:34:08,239 --> 00:34:09,340 Chúng tôi đã gặp may. 786 00:34:09,340 --> 00:34:11,060 Nhưng chúng ta hãy xem nếu bây giờ chúng tôi chạy Valgrind. 787 00:34:11,060 --> 00:34:14,170 Ở cái nhìn đầu tiên, chương trình của tôi có thể dường như là hoàn toàn chính xác. 788 00:34:14,170 --> 00:34:18,010 Nhưng cho phép tôi chạy Valgrind với - Bị rò rỉ-kiểm tra bằng đầy đủ về bộ nhớ. 789 00:34:18,010 --> 00:34:20,110 >> Và bây giờ khi tôi chạy - 790 00:34:20,110 --> 00:34:21,030 thú vị. 791 00:34:21,030 --> 00:34:26,800 Không hợp lệ viết của kích thước 4 tại dòng 21 của memory.c. 792 00:34:26,800 --> 00:34:29,284 Dòng 21 của memory.c là cái nào? 793 00:34:29,284 --> 00:34:30,340 Oh, thú vị. 794 00:34:30,340 --> 00:34:31,080 Nhưng chờ đợi. 795 00:34:31,080 --> 00:34:32,389 Kích thước 4, những gì là đề cập đến? 796 00:34:32,389 --> 00:34:34,969 Tôi chỉ làm một viết, nhưng nó có kích thước 4. 797 00:34:34,969 --> 00:34:36,889 Tại sao nó 4? 798 00:34:36,889 --> 00:34:39,280 Đó là bởi vì nó là một int, mà là, một lần nữa, bốn byte. 799 00:34:39,280 --> 00:34:42,510 Vì vậy, Valgrind tìm thấy một lỗi mà tôi, liếc nhìn mã của tôi, đã làm không. 800 00:34:42,510 --> 00:34:45,040 Và có thể TF của bạn sẽ hoặc sẽ không được. 801 00:34:45,040 --> 00:34:48,469 Nhưng những gì Valgrind chắc chắn thấy rằng chúng tôi đã thực hiện một sai lầm có, thậm chí 802 00:34:48,469 --> 00:34:52,719 mặc dù chúng tôi đã may mắn, và máy tính quyết định, phải không, tôi sẽ không sụp đổ 803 00:34:52,719 --> 00:34:57,470 chỉ vì bạn chạm vào một byte, một int giá trị của bộ nhớ mà bạn không 804 00:34:57,470 --> 00:34:58,550 thực sự của riêng. 805 00:34:58,550 --> 00:35:00,380 >> Vâng, những gì khác là lỗi ở đây. 806 00:35:00,380 --> 00:35:01,180 Địa chỉ - 807 00:35:01,180 --> 00:35:03,190 đây là một địa chỉ tìm kiếm điên trong hệ thập lục phân. 808 00:35:03,190 --> 00:35:06,890 Điều đó chỉ có nghĩa là ở đâu đó trong đống là byte sau khi một khối kích thước 40 809 00:35:06,890 --> 00:35:07,620 được phân bổ. 810 00:35:07,620 --> 00:35:10,610 Hãy để tôi thu nhỏ ở đây và xem đây là một ít hữu ích hơn. 811 00:35:10,610 --> 00:35:11,410 Thú vị. 812 00:35:11,410 --> 00:35:15,600 40 byte có chắc chắn bị mất trong lỗ kỷ lục 1 của 1. 813 00:35:15,600 --> 00:35:17,840 Một lần nữa, lời nói hơn là hữu ích ở đây. 814 00:35:17,840 --> 00:35:21,350 Nhưng dựa trên các đường đánh dấu, nơi nên tôi có thể tập trung của tôi 815 00:35:21,350 --> 00:35:24,070 sự chú ý cho lỗi khác? 816 00:35:24,070 --> 00:35:26,570 Trông giống như một dòng 20 của memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Vì vậy, nếu chúng ta quay lại dòng 20, đó là một mà bạn xác định trước đó. 818 00:35:30,990 --> 00:35:33,030 Và nó không nhất thiết phải là lỗi. 819 00:35:33,030 --> 00:35:35,160 Nhưng chúng tôi đã này đảo ngược tác dụng của nó. 820 00:35:35,160 --> 00:35:38,790 Vì vậy, làm thế nào để tôi sửa chữa ít nhất một trong những sai lầm? 821 00:35:38,790 --> 00:35:42,240 Tôi có thể làm gì sau khi dòng 21? 822 00:35:42,240 --> 00:35:47,110 Tôi có thể làm miễn phí của x, như vậy là để cung cấp cho trở lại bộ nhớ. 823 00:35:47,110 --> 00:35:49,230 Và làm thế nào để khắc phục lỗi này? 824 00:35:49,230 --> 00:35:52,120 Tôi chắc chắn nên đi không xa hơn 0. 825 00:35:52,120 --> 00:35:53,670 Vì vậy, hãy để tôi thử và chạy lại này. 826 00:35:53,670 --> 00:35:56,080 Xin lỗi, chắc chắn đi không xa hơn 9. 827 00:35:56,080 --> 00:35:57,510 Làm cho bộ nhớ. 828 00:35:57,510 --> 00:36:00,650 Hãy để tôi chạy lại Valgrind trong một cửa sổ lớn hơn. 829 00:36:00,650 --> 00:36:01,580 Và bây giờ nhìn. 830 00:36:01,580 --> 00:36:02,250 Tốt đẹp. 831 00:36:02,250 --> 00:36:03,270 Tất cả các khối đống được trả tự do. 832 00:36:03,270 --> 00:36:04,270 Không có rò rỉ là có thể. 833 00:36:04,270 --> 00:36:07,520 Và lên trên đây, không có đề cập đến nữa quyền không hợp lệ. 834 00:36:07,520 --> 00:36:09,820 >> Chỉ để có được tham lam, và hãy xem trình diễn khác 835 00:36:09,820 --> 00:36:11,050 không đi như dự định - 836 00:36:11,050 --> 00:36:12,560 Tôi đã nhận được may mắn vừa mới đây. 837 00:36:12,560 --> 00:36:15,530 Và thực tế rằng đây là 0 có lẽ không cần thiết gây hiểu nhầm. 838 00:36:15,530 --> 00:36:20,650 Hãy làm 50, một phần nào tùy ý số lượng, làm cho bộ nhớ dot bộ nhớ dấu gạch chéo - 839 00:36:20,650 --> 00:36:21,410 vẫn nhận được may mắn. 840 00:36:21,410 --> 00:36:22,510 Không bị rơi. 841 00:36:22,510 --> 00:36:26,150 Giả sử tôi chỉ cần làm một cái gì đó thực sự ngu ngốc, và tôi làm 100. 842 00:36:26,150 --> 00:36:30,360 Hãy để tôi làm lại bộ nhớ, dot cắt giảm bộ nhớ - 843 00:36:30,360 --> 00:36:31,075 đã may mắn một lần nữa. 844 00:36:31,075 --> 00:36:32,800 Làm thế nào về 1000? 845 00:36:32,800 --> 00:36:35,370 ints ngoài, gần, nơi tôi nên được? 846 00:36:35,370 --> 00:36:37,410 Làm cho bộ nhớ - 847 00:36:37,410 --> 00:36:38,570 chết tiệt. 848 00:36:38,570 --> 00:36:39,920 >> [Cười] 849 00:36:39,920 --> 00:36:41,270 >> OK. 850 00:36:41,270 --> 00:36:43,920 Chúng ta không lộn xộn xung quanh nữa. 851 00:36:43,920 --> 00:36:45,120 Chạy bộ nhớ. 852 00:36:45,120 --> 00:36:45,840 Có chúng tôi đi. 853 00:36:45,840 --> 00:36:46,410 Được rồi. 854 00:36:46,410 --> 00:36:52,500 Vì vậy, rõ ràng bạn chỉ số 100.000 ints ngoài nơi bạn cần phải có được trong 855 00:36:52,500 --> 00:36:54,410 bộ nhớ, điều xấu xảy ra. 856 00:36:54,410 --> 00:36:56,430 Vì vậy, điều này rõ ràng không một khó khăn, nhanh chóng quy tắc. 857 00:36:56,430 --> 00:36:58,190 Tôi là loại sử dụng thử nghiệm và sai để đạt được điều đó. 858 00:36:58,190 --> 00:37:02,230 Nhưng điều này là bởi vì, câu chuyện dài ngắn, bộ nhớ máy tính của bạn cũng được chia 859 00:37:02,230 --> 00:37:03,580 vào những thứ được gọi là phân đoạn. 860 00:37:03,580 --> 00:37:07,260 Và đôi khi, máy tính thực sự đưa cho bạn bộ nhớ nhiều hơn một chút 861 00:37:07,260 --> 00:37:08,400 hơn bạn yêu cầu. 862 00:37:08,400 --> 00:37:12,170 Nhưng cho hiệu quả, nó chỉ là dễ dàng hơn để có được nhiều bộ nhớ hơn nhưng chỉ cho bạn biết 863 00:37:12,170 --> 00:37:13,780 rằng bạn đang nhận được một phần của nó. 864 00:37:13,780 --> 00:37:16,370 >> Và nếu bạn nhận được may mắn đôi khi, do đó, bạn có thể có thể chạm vào 865 00:37:16,370 --> 00:37:17,795 bộ nhớ mà không thuộc về bạn. 866 00:37:17,795 --> 00:37:21,860 Bạn không có gì đảm bảo rằng những gì giá trị bạn đã chèn sẽ ở lại đó, bởi vì 867 00:37:21,860 --> 00:37:25,080 máy tính vẫn còn nghĩ rằng nó không của bạn, nhưng nó không nhất thiết sẽ 868 00:37:25,080 --> 00:37:29,910 để đạt một đoạn bộ nhớ trong máy tính và gây ra một sai lầm như 869 00:37:29,910 --> 00:37:31,710 này đây. 870 00:37:31,710 --> 00:37:32,060 Được rồi. 871 00:37:32,060 --> 00:37:37,240 Bất kỳ câu hỏi sau đó trên bộ nhớ? 872 00:37:37,240 --> 00:37:37,590 >> Được rồi. 873 00:37:37,590 --> 00:37:40,610 Chúng ta hãy có một cái nhìn ở đây, sau đó, tại một cái gì đó chúng tôi đã được tham gia cho 874 00:37:40,610 --> 00:37:48,361 cấp trong một thời gian, mà là trong tập tin này được gọi là cs50.h. 875 00:37:48,361 --> 00:37:49,420 Vì vậy, đây là một tập tin. 876 00:37:49,420 --> 00:37:51,130 Đây chỉ là một bó toàn bộ ý kiến ​​lên hàng đầu. 877 00:37:51,130 --> 00:37:53,900 Và bạn có thể nhìn vào điều này nếu bạn chọc xung quanh may. 878 00:37:53,900 --> 00:37:57,000 Nhưng nó chỉ ra rằng tất cả các thời gian, khi chúng tôi sử dụng để sử dụng chuỗi như một 879 00:37:57,000 --> 00:38:01,130 từ đồng nghĩa, các phương tiện mà chúng tôi tuyên bố đó đồng nghĩa là với điều này 880 00:38:01,130 --> 00:38:03,990 từ khoá typedef, để định nghĩa kiểu. 881 00:38:03,990 --> 00:38:07,500 Và chúng ta đang chủ yếu nói, làm chuỗi một từ đồng nghĩa với char sao. 882 00:38:07,500 --> 00:38:11,190 Đó là phương tiện mà chồng tạo ra những bánh xe đào tạo được gọi là 883 00:38:11,190 --> 00:38:12,040 chuỗi. 884 00:38:12,040 --> 00:38:14,830 >> Giờ đây chỉ là một nguyên mẫu cho getchar. 885 00:38:14,830 --> 00:38:17,350 Chúng tôi có thể nhìn thấy nó trước, nhưng đó là thực sự những gì nó làm. getchar 886 00:38:17,350 --> 00:38:19,070 không có đối số, trả về một char. 887 00:38:19,070 --> 00:38:21,340 getdouble không có đối số, trả về một đôi. 888 00:38:21,340 --> 00:38:24,440 GetFloat không có đối số, lợi nhuận một phao, vv. 889 00:38:24,440 --> 00:38:27,270 getInt là ở đây. getlonglong là ở đây. 890 00:38:27,270 --> 00:38:28,820 Và getString là ở đây. 891 00:38:28,820 --> 00:38:29,420 Và đó là nó. 892 00:38:29,420 --> 00:38:33,080 Đường màu tím này là tiền xử lý khác chỉ vì 893 00:38:33,080 --> 00:38:35,550 hashtag vào đầu nó. 894 00:38:35,550 --> 00:38:35,870 >> Được rồi. 895 00:38:35,870 --> 00:38:38,380 Vì vậy, bây giờ hãy để tôi đi vào cs50.c. 896 00:38:38,380 --> 00:38:40,400 Và chúng tôi sẽ không nói chuyện quá lâu về điều này. 897 00:38:40,400 --> 00:38:43,280 Nhưng để cung cấp cho bạn một cái nhìn thoáng qua về những gì được đi trên tất cả điều này 898 00:38:43,280 --> 00:38:46,434 thời gian, hãy để tôi đi đến - 899 00:38:46,434 --> 00:38:48,250 chúng ta hãy làm getchar. 900 00:38:48,250 --> 00:38:51,050 Vì vậy, getchar chủ yếu là ý kiến. 901 00:38:51,050 --> 00:38:52,060 Nhưng có vẻ như thế này. 902 00:38:52,060 --> 00:38:54,800 Vì vậy, đây là chức năng thực tế getchar mà chúng tôi đã được 903 00:38:54,800 --> 00:38:56,055 dùng cho các cấp tồn tại. 904 00:38:56,055 --> 00:38:59,370 Và mặc dù chúng tôi đã không sử dụng này thường xuyên, nếu bao giờ hết, nó ít nhất 905 00:38:59,370 --> 00:39:00,470 tương đối đơn giản. 906 00:39:00,470 --> 00:39:02,580 Vì vậy, nó có giá trị tham gia một xem nhanh tại đây. 907 00:39:02,580 --> 00:39:06,540 >> Vì vậy, getchar có một vòng lặp vô hạn, cố ý như vậy rõ ràng. 908 00:39:06,540 --> 00:39:10,050 Sau đó nó gọi - và đây là loại một tái sử dụng tốt đẹp của bản thân chúng ta đang viết. 909 00:39:10,050 --> 00:39:11,220 Nó gọi getString. 910 00:39:11,220 --> 00:39:12,460 Bởi vì những gì nó có nghĩa là để có được một char? 911 00:39:12,460 --> 00:39:14,730 Vâng, bạn cũng có thể cố gắng để có được một toàn bộ dòng văn bản từ người sử dụng và 912 00:39:14,730 --> 00:39:16,940 sau đó chỉ cần nhìn vào một của những nhân vật. 913 00:39:16,940 --> 00:39:19,170 Trong dòng 60, đây là một chút bit của một kiểm tra sự tỉnh táo. 914 00:39:19,170 --> 00:39:21,610 Nếu getString trở null, chúng ta không tiến hành. 915 00:39:21,610 --> 00:39:22,820 Một cái gì đó đã đi sai. 916 00:39:22,820 --> 00:39:28,120 >> Bây giờ điều này là hơi khó chịu nhưng thông thường trong C. char tối đa có thể 917 00:39:28,120 --> 00:39:29,960 đại diện cho những gì chỉ dựa trên tên của nó? 918 00:39:29,960 --> 00:39:31,670 Đó là một hằng số. 919 00:39:31,670 --> 00:39:36,040 Nó giống như các giá trị số của char lớn nhất bạn có thể đại diện với 920 00:39:36,040 --> 00:39:40,370 Cắn một miếng, mà có lẽ là số 255, đó là số lượng lớn nhất mà bạn 921 00:39:40,370 --> 00:39:42,720 đại diện cho tám bit, bắt đầu từ số không. 922 00:39:42,720 --> 00:39:47,460 Vì vậy, tôi đã sử dụng điều này, trong chức năng này, khi viết mã này, chỉ vì 923 00:39:47,460 --> 00:39:51,753 nếu có điều gì sai trong getchar nhưng mục đích của nó trong cuộc sống là để trả lại một 924 00:39:51,753 --> 00:39:54,830 char, bạn cần phải bằng cách nào đó có thể để báo hiệu cho người dùng biết 925 00:39:54,830 --> 00:39:55,840 một cái gì đó đã đi sai. 926 00:39:55,840 --> 00:39:56,970 Chúng ta không thể trở về null. 927 00:39:56,970 --> 00:39:58,480 Nó chỉ ra rằng null là một con trỏ. 928 00:39:58,480 --> 00:40:01,030 Và một lần nữa, có getchar để trả về một char. 929 00:40:01,030 --> 00:40:04,760 >> Vì vậy, các quy ước, nếu có điều gì sai, là bạn, các lập trình viên, hoặc trong 930 00:40:04,760 --> 00:40:08,160 trường hợp này, tôi có thư viện, tôi đã có chỉ là một quyết định tùy tiện, nếu 931 00:40:08,160 --> 00:40:12,230 điều gì sai, tôi sẽ trả lại số 255, mà thực sự là 932 00:40:12,230 --> 00:40:17,240 có nghĩa là chúng ta có thể không, người dùng có thể không nhập nhân vật đại diện bởi các 933 00:40:17,240 --> 00:40:21,410 số 255 bởi vì chúng tôi đã có một ăn cắp nó như một cái gọi là giá trị trọng điểm để 934 00:40:21,410 --> 00:40:23,410 đại diện cho một vấn đề. 935 00:40:23,410 --> 00:40:27,010 Bây giờ nó chỉ ra rằng nhân vật 255 không phải là một cái gì đó bạn có thể gõ trên 936 00:40:27,010 --> 00:40:28,380 bàn phím của bạn, vì vậy không có vấn đề lớn. 937 00:40:28,380 --> 00:40:30,910 Người dùng không nhận thấy rằng Tôi đã bị đánh cắp nhân vật này. 938 00:40:30,910 --> 00:40:34,620 Nhưng nếu bạn đã bao giờ nhìn thấy trong trang người đàn ông trên một hệ thống máy tính của một số tham chiếu đến một 939 00:40:34,620 --> 00:40:38,560 tất cả các mũ liên tục như thế này mà nói, trong trường hợp lỗi sức mạnh liên tục này 940 00:40:38,560 --> 00:40:42,720 được trả lại, đó là tất cả những con người đã làm năm trước đây đã được tự ý quyết định 941 00:40:42,720 --> 00:40:45,680 trả lại giá trị đặc biệt này và gọi nó là một hằng số trong trường hợp 942 00:40:45,680 --> 00:40:46,840 gặp khó khăn. 943 00:40:46,840 --> 00:40:48,580 >> Bây giờ sự kỳ diệu sẽ xảy ra ở đây. 944 00:40:48,580 --> 00:40:52,600 Đầu tiên, tôi tuyên bố trong dòng 67 hai nhân vật, C1 và C2. 945 00:40:52,600 --> 00:40:57,080 Và sau đó trong dòng 68, có thực sự một dòng mã đó là gợi nhớ của 946 00:40:57,080 --> 00:41:01,140 người bạn của chúng tôi printf, cho rằng nó không có phần trăm Cs trong dấu ngoặc kép. 947 00:41:01,140 --> 00:41:06,490 Nhưng nhận thấy những gì đang xảy ra ở đây. sscanf có nghĩa là chuỗi quét - 948 00:41:06,490 --> 00:41:11,690 có nghĩa là quét một định dạng chuỗi, ergo sscanf. 949 00:41:11,690 --> 00:41:12,590 Điều đó có nghĩa gì? 950 00:41:12,590 --> 00:41:16,310 Nó có nghĩa là bạn vượt qua sscanf một chuỗi. 951 00:41:16,310 --> 00:41:18,420 Và dòng là bất cứ điều gì các loại người sử dụng vào 952 00:41:18,420 --> 00:41:23,520 Bạn vượt qua sscanf một chuỗi định dạng như này mà nói với scanf là gì 953 00:41:23,520 --> 00:41:25,870 bạn hy vọng người sử dụng đã đánh máy in 954 00:41:25,870 --> 00:41:29,730 Sau đó bạn vượt qua trong các địa chỉ của hai khối của bộ nhớ, trong trường hợp này, 955 00:41:29,730 --> 00:41:31,150 bởi vì tôi có hai giữ chỗ. 956 00:41:31,150 --> 00:41:34,610 Vì vậy, tôi sẽ cung cấp cho nó địa chỉ của C1 và địa chỉ của C2. 957 00:41:34,610 --> 00:41:37,700 >> Và nhớ rằng bạn cung cấp cho một chức năng địa chỉ của một số biến, những gì 958 00:41:37,700 --> 00:41:38,950 ngụ ý? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Những chức năng mà có thể làm như vậy đem lại cho nó địa chỉ của một 961 00:41:45,050 --> 00:41:48,170 biến, như trái ngược với biến đó? 962 00:41:48,170 --> 00:41:49,450 Nó có thể thay đổi nó, phải không? 963 00:41:49,450 --> 00:41:53,250 Nếu bạn có một người nào đó một bản đồ cho một thể chất địa chỉ, họ có thể đến đó và làm 964 00:41:53,250 --> 00:41:54,750 bất cứ điều gì họ muốn tại địa chỉ đó. 965 00:41:54,750 --> 00:41:55,800 Cùng một ý tưởng ở đây. 966 00:41:55,800 --> 00:41:59,950 Nếu chúng tôi vượt qua để sscanf, địa chỉ của hai khối của bộ nhớ, ngay cả những nhỏ 967 00:41:59,950 --> 00:42:03,585 khối ít bộ nhớ, C1 và C2, nhưng chúng tôi nói cho nó địa chỉ của họ, 968 00:42:03,585 --> 00:42:05,170 sscanf có thể thay đổi nó. 969 00:42:05,170 --> 00:42:08,530 >> Vì vậy, mục đích sscanf trong cuộc sống, nếu chúng ta đọc trang người đàn ông, là để đọc những gì các 970 00:42:08,530 --> 00:42:13,420 người sử dụng gõ vào, hy vọng cho người sử dụng có gõ vào một nhân vật và có thể 971 00:42:13,420 --> 00:42:16,470 một nhân vật khác, và bất cứ điều gì người dùng đánh máy, ký tự đầu tiên đi 972 00:42:16,470 --> 00:42:19,310 ở đây, nhân vật thứ hai tại đây. 973 00:42:19,310 --> 00:42:22,470 Bây giờ, khi một sang một bên, điều này, và bạn sẽ chỉ biết điều này từ các tài liệu, 974 00:42:22,470 --> 00:42:25,570 thực tế là tôi đặt một không gian trống có chỉ có nghĩa là tôi không quan tâm 975 00:42:25,570 --> 00:42:28,440 người dùng chạm vào thanh không gian một vài lần trước khi người đó có một 976 00:42:28,440 --> 00:42:30,400 nhân vật, tôi sẽ bỏ qua bất kỳ không gian trắng. 977 00:42:30,400 --> 00:42:32,510 Do đó, tôi biết từ các tài liệu hướng dẫn. 978 00:42:32,510 --> 00:42:36,570 >> Thực tế là có một% thứ hai c tiếp theo không gian màu trắng thực sự là 979 00:42:36,570 --> 00:42:37,410 có chủ ý. 980 00:42:37,410 --> 00:42:41,190 Tôi muốn để có thể phát hiện nếu người sử dụng hơi say lên hoặc không hợp tác. 981 00:42:41,190 --> 00:42:45,630 Vì vậy, tôi hy vọng rằng người dùng chỉ đánh máy trong một ký tự, do đó tôi hy vọng 982 00:42:45,630 --> 00:42:50,640 đó sscanf chỉ sẽ trả lại giá trị 1 bởi vì, một lần nữa, nếu tôi đọc 983 00:42:50,640 --> 00:42:55,400 các tài liệu, mục đích sscanf trong cuộc sống là để trở về số lượng 984 00:42:55,400 --> 00:42:59,170 biến đã được lấp đầy với người sử dụng đầu vào. 985 00:42:59,170 --> 00:43:02,270 >> Tôi đã thông qua trong hai biến địa chỉ, C1 và C2. 986 00:43:02,270 --> 00:43:06,420 Tôi hy vọng, tuy nhiên, đó chỉ là một trong họ bị giết bởi vì nếu sscanf 987 00:43:06,420 --> 00:43:11,130 trả về 2, những gì có lẽ ngụ ý một cách hợp lý? 988 00:43:11,130 --> 00:43:14,600 Mà người sử dụng không chỉ cho tôi một nhân vật như tôi đã nói với người đó. 989 00:43:14,600 --> 00:43:17,860 Họ có thể đánh máy ở ít nhất hai ký tự. 990 00:43:17,860 --> 00:43:22,430 Vì vậy, nếu tôi thay vì không có thứ hai % C, tôi chỉ có một, mà 991 00:43:22,430 --> 00:43:25,370 thẳng thắn sẽ được trực quan hơn phương pháp tiếp cận, tôi nghĩ rằng một cái nhìn đầu tiên, 992 00:43:25,370 --> 00:43:30,220 bạn sẽ không thể phát hiện nếu người dùng đã được cung cấp cho bạn hơn 993 00:43:30,220 --> 00:43:31,780 đầu vào hơn bạn thực sự muốn. 994 00:43:31,780 --> 00:43:34,100 Vì vậy, đây là một hình thức tiềm ẩn kiểm tra lỗi. 995 00:43:34,100 --> 00:43:35,640 >> Nhưng nhận thấy những gì tôi làm ở đây. 996 00:43:35,640 --> 00:43:39,970 Một khi tôi chắc chắn rằng người sử dụng đã cho tôi một nhân vật, tôi giải phóng đường, làm 997 00:43:39,970 --> 00:43:44,450 trái ngược với getString, do đó sử dụng malloc, và sau đó tôi trở lại 998 00:43:44,450 --> 00:43:51,030 C1, nhân vật mà tôi hy vọng người sử dụng cung cấp và chỉ được cung cấp. 999 00:43:51,030 --> 00:43:54,680 Vì vậy, một cách nhanh chóng chỉ thoáng nhìn thấy, nhưng bất kỳ câu hỏi về getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Chúng tôi sẽ trở lại với một số người khác. 1002 00:43:59,590 --> 00:44:03,770 >> Vâng, hãy để tôi đi trước và làm điều này - giả sử bây giờ, chỉ để động viên của chúng tôi 1003 00:44:03,770 --> 00:44:08,910 thảo luận trong một tuần cộng với thời gian, điều này là một tập tin gọi là structs.h. 1004 00:44:08,910 --> 00:44:11,440 Và một lần nữa, đây chỉ là một hương vị của một cái gì đó ở phía trước. 1005 00:44:11,440 --> 00:44:13,090 Nhưng thông báo rằng rất nhiều của việc này là ý kiến. 1006 00:44:13,090 --> 00:44:17,440 Vì vậy, hãy để tôi làm nổi bật chỉ Phần thú vị cho bây giờ. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 có cùng một từ khóa một lần nữa. 1009 00:44:19,700 --> 00:44:23,100 typedef chúng tôi sử dụng để khai báo chuỗi như là một loại dữ liệu đặc biệt. 1010 00:44:23,100 --> 00:44:27,490 Bạn có thể sử dụng typedef để tạo ra thương hiệu mới các kiểu dữ liệu không tồn tại khi 1011 00:44:27,490 --> 00:44:28,570 C được phát minh. 1012 00:44:28,570 --> 00:44:32,520 Ví dụ, int đi kèm với C. char đi kèm với C. đôi đi kèm với C. Nhưng 1013 00:44:32,520 --> 00:44:34,000 không có khái niệm về một sinh viên. 1014 00:44:34,000 --> 00:44:37,230 Nhưng nó sẽ là khá hữu ích để có có thể viết một chương trình mà các cửa hàng 1015 00:44:37,230 --> 00:44:40,440 trong một biến, số ID của học sinh, tên của họ, và nhà của họ. 1016 00:44:40,440 --> 00:44:42,890 Nói cách khác, ba miếng dữ liệu, giống như một int và một 1017 00:44:42,890 --> 00:44:44,420 chuỗi và chuỗi khác. 1018 00:44:44,420 --> 00:44:48,220 >> Với typedef, những gì là khá mạnh mẽ về việc này và sturct từ khóa cho 1019 00:44:48,220 --> 00:44:53,660 cấu trúc, bạn, các lập trình viên vào năm 2013, thực sự có thể định nghĩa của riêng bạn 1020 00:44:53,660 --> 00:44:57,530 các kiểu dữ liệu không tồn tại năm trước nhưng phù hợp với mục đích của bạn. 1021 00:44:57,530 --> 00:45:01,910 Và vì vậy ở đây, trong dòng 13 đến 19, chúng ta đang khai báo một kiểu dữ liệu mới, như 1022 00:45:01,910 --> 00:45:04,320 một int, nhưng gọi đó là sinh viên. 1023 00:45:04,320 --> 00:45:09,310 Và bên trong của biến này sẽ có ba điều - một int, một chuỗi, 1024 00:45:09,310 --> 00:45:09,930 và một chuỗi. 1025 00:45:09,930 --> 00:45:13,040 Vì vậy, bạn có thể nghĩ đến những gì thực sự xảy ra ở đây, mặc dù đây là một 1026 00:45:13,040 --> 00:45:17,160 chút đơn giản cho ngày hôm nay, một sinh viên chủ yếu là đi 1027 00:45:17,160 --> 00:45:19,450 trông như thế này. 1028 00:45:19,450 --> 00:45:22,580 Đi của nó sẽ được một đoạn bộ nhớ với một ID, một tên 1029 00:45:22,580 --> 00:45:25,580 lĩnh vực, và lĩnh vực nhà ở. 1030 00:45:25,580 --> 00:45:30,670 Và chúng tôi sẽ có thể sử dụng những khối bộ nhớ và truy cập chúng như sau. 1031 00:45:30,670 --> 00:45:38,870 >> Nếu tôi đi vào struct0.c, đây là một tương đối dài, nhưng sau một 1032 00:45:38,870 --> 00:45:42,630 mô hình, các mã sử dụng thủ thuật mới này. 1033 00:45:42,630 --> 00:45:45,790 Vì vậy, đầu tiên, hãy để tôi hút sự chú ý của bạn để những phần thú vị lên hàng đầu. 1034 00:45:45,790 --> 00:45:49,670 Sharp xác định sinh viên 3, tuyên bố một được gọi là sinh viên và người được chỉ định không đổi 1035 00:45:49,670 --> 00:45:53,450 nó tùy tiện số 3, chỉ vì vậy tôi có ba học sinh sử dụng 1036 00:45:53,450 --> 00:45:54,830 chương trình này cho bây giờ. 1037 00:45:54,830 --> 00:45:55,960 Ở đây có chính. 1038 00:45:55,960 --> 00:45:58,860 Và thông báo, làm thế nào để khai báo một mảng của học sinh? 1039 00:45:58,860 --> 00:46:00,480 Vâng, tôi chỉ cần sử dụng cú pháp tương tự. 1040 00:46:00,480 --> 00:46:02,110 Học sinh từ rõ ràng là mới. 1041 00:46:02,110 --> 00:46:04,790 Nhưng sinh viên, lớp, học sinh khung. 1042 00:46:04,790 --> 00:46:06,720 >> Vì vậy, không may có rất nhiều tái sử dụng từ ngữ ở đây. 1043 00:46:06,720 --> 00:46:07,660 Đây chỉ là một số. 1044 00:46:07,660 --> 00:46:09,040 Vì vậy, đây là giống như nói rằng ba. 1045 00:46:09,040 --> 00:46:11,430 Lớp học chỉ là những gì tôi muốn gọi biến. 1046 00:46:11,430 --> 00:46:12,840 Tôi có thể gọi nó là sinh viên. 1047 00:46:12,840 --> 00:46:15,880 Nhưng lớp học, điều này không phải là một lớp học trong một hướng đối tượng Java kiểu cách. 1048 00:46:15,880 --> 00:46:17,220 Nó chỉ là một lớp học của học sinh. 1049 00:46:17,220 --> 00:46:20,590 Và kiểu dữ liệu của mọi phần tử trong mảng đó là sinh viên. 1050 00:46:20,590 --> 00:46:23,040 Vì vậy, đây là một chút khác nhau và từ nói điều gì đó 1051 00:46:23,040 --> 00:46:25,250 như thế này, nó chỉ là - 1052 00:46:25,250 --> 00:46:29,500 Tôi nói cho tôi ba sinh viên và gọi đó là lớp mảng. 1053 00:46:29,500 --> 00:46:29,800 >> Được rồi. 1054 00:46:29,800 --> 00:46:30,680 Bây giờ đây là bốn vòng. 1055 00:46:30,680 --> 00:46:33,480 Này của chàng trai quen thuộc - iterate từ con số không trên lên đến ba. 1056 00:46:33,480 --> 00:46:35,160 Và đây là đoạn mới của cú pháp. 1057 00:46:35,160 --> 00:46:37,710 Chương trình sẽ nhắc nhở tôi, con người, để cho nó một sinh viên 1058 00:46:37,710 --> 00:46:39,200 ID, đó là một int. 1059 00:46:39,200 --> 00:46:44,650 Và đây là cú pháp mà bạn có thể lưu trữ một cái gì đó trong lĩnh vực ID tại 1060 00:46:44,650 --> 00:46:48,630 đẳng cấp vị trí khung I. Vì vậy, cú pháp này không phải là mới. 1061 00:46:48,630 --> 00:46:51,450 Điều này chỉ có nghĩa là cung cấp cho tôi thứ tám học sinh trong lớp. 1062 00:46:51,450 --> 00:46:52,940 Nhưng biểu tượng này là mới. 1063 00:46:52,940 --> 00:46:56,320 Cho đến bây giờ, chúng tôi đã không thể sử dụng dấu chấm, ít nhất là trong mã như thế này. 1064 00:46:56,320 --> 00:47:01,490 Điều này có nghĩa là đi đến các cấu trúc được gọi là một sinh viên và đặt một cái gì đó. 1065 00:47:01,490 --> 00:47:05,670 Tương tự như vậy, trong dòng tiếp theo này, 31 tuổi, đi trước và đặt bất cứ điều gì loại người sử dụng 1066 00:47:05,670 --> 00:47:10,530 cho một tên ở đây và những gì họ làm cho một nhà, điều tương tự, đi trước và 1067 00:47:10,530 --> 00:47:13,230 đặt nó trong nhà.. 1068 00:47:13,230 --> 00:47:15,955 >> Vì vậy, những gì hiện chương trình này cuối cùng là làm gì? 1069 00:47:15,955 --> 00:47:17,220 Bạn có thể thấy một chút trêu ghẹo đó. 1070 00:47:17,220 --> 00:47:24,780 Hãy để tôi đi trước và làm cho cấu trúc 0 dấu chấm dấu gạch chéo cấu trúc 0, thẻ sinh viên của 1, 1071 00:47:24,780 --> 00:47:28,250 David nói Mather, thẻ sinh viên 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, thẻ sinh viên 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 và điều duy nhất chương trình này đã làm, mà chỉ là hoàn toàn tùy ý, được 1075 00:47:38,380 --> 00:47:40,980 Tôi muốn làm một cái gì đó với dữ liệu này, bây giờ mà tôi đã dạy chúng ta cách 1076 00:47:40,980 --> 00:47:43,450 sử dụng cấu trúc, là tôi chỉ có vòng này thêm ở đây. 1077 00:47:43,450 --> 00:47:45,260 Tôi lặp qua các mảng của các học sinh. 1078 00:47:45,260 --> 00:47:49,170 Tôi đã sử dụng, bạn có lẽ bây giờ quen thuộc của chúng tôi, chuỗi so sánh, để stircomp 1079 00:47:49,170 --> 00:47:53,780 kiểm tra là căn nhà thứ 8 của học sinh bằng Mather? 1080 00:47:53,780 --> 00:47:56,760 Và nếu như vậy, chỉ cần in một cái gì đó tùy ý thích, có, nó là. 1081 00:47:56,760 --> 00:47:59,430 Nhưng một lần nữa, chỉ đem lại cho tôi cơ hội sử dụng và tái sử dụng và 1082 00:47:59,430 --> 00:48:02,270 tái sử dụng dấu chấm mới này ký hiệu. 1083 00:48:02,270 --> 00:48:03,250 >> Vì vậy, những người quan tâm, phải không? 1084 00:48:03,250 --> 00:48:06,270 Đến với một chương trình học sinh phần nào tùy ý, nhưng nó quay ra 1085 00:48:06,270 --> 00:48:09,800 chúng tôi có thể làm những việc hữu ích với này, ví dụ như sau. 1086 00:48:09,800 --> 00:48:14,600 Đây là một cấu trúc phức tạp hơn nhiều trong C. Nó có một tá hoặc nhiều lĩnh vực, 1087 00:48:14,600 --> 00:48:15,880 hơi khó hiểu tên. 1088 00:48:15,880 --> 00:48:20,110 Nhưng nếu bạn đã từng nghe nói về một đồ họa định dạng tập tin gọi là bitmap, BMP, nó 1089 00:48:20,110 --> 00:48:22,830 chỉ ra rằng các định dạng tập tin bitmap khá nhiều trông như thế này. 1090 00:48:22,830 --> 00:48:24,200 Đó là một ngu ngốc ít phải đối mặt cười. 1091 00:48:24,200 --> 00:48:27,840 Đó là một hình ảnh nhỏ mà tôi đã phóng to trên khá lớn để tôi có thể nhìn thấy nhau 1092 00:48:27,840 --> 00:48:30,410 của các dấu chấm cá nhân hoặc điểm ảnh. 1093 00:48:30,410 --> 00:48:33,800 Bây giờ, hóa ra chúng ta có thể đại diện cho một chấm đen với, nói rằng, các số 0. 1094 00:48:33,800 --> 00:48:35,520 Và một dấu chấm màu trắng với số 1. 1095 00:48:35,520 --> 00:48:39,140 >> Vì vậy, nói cách khác, nếu bạn muốn vẽ một Khuôn mặt cười và lưu hình ảnh đó trong một 1096 00:48:39,140 --> 00:48:42,680 máy tính, nó cũng đủ để lưu trữ số không và những người giống như thế này, ở đâu, 1097 00:48:42,680 --> 00:48:45,250 một lần nữa, những người có màu trắng và số màu đen. 1098 00:48:45,250 --> 00:48:48,290 Và cùng nhau, nếu bạn có hiệu quả có một bao vây của những người thân và số không, bạn có một 1099 00:48:48,290 --> 00:48:51,030 mạng lưới các điểm ảnh, và nếu bạn đặt chúng ra, bạn có dễ thương 1100 00:48:51,030 --> 00:48:52,560 ít cười khuôn mặt. 1101 00:48:52,560 --> 00:48:58,150 Bây giờ, định dạng tập tin bitmap, BMP, là hiệu quả mà bên dưới mui xe, 1102 00:48:58,150 --> 00:49:00,970 nhưng với nhiều điểm ảnh sot bạn thực sự có thể đại diện cho màu sắc. 1103 00:49:00,970 --> 00:49:05,170 >> Nhưng khi bạn có phức tạp hơn định dạng file như BMP, JPEG và GIF 1104 00:49:05,170 --> 00:49:09,360 mà bạn có thể quen thuộc, những các tập tin trên đĩa thường không chỉ 1105 00:49:09,360 --> 00:49:13,760 có số không và những người thân cho các điểm ảnh, nhưng họ có một số siêu dữ liệu cũng - 1106 00:49:13,760 --> 00:49:16,960 meta trong ý nghĩa đó không phải là thực sự dữ liệu nhưng nó là hữu ích để có. 1107 00:49:16,960 --> 00:49:21,370 Vì vậy, các lĩnh vực này ở đây ngụ ý, và chúng ta sẽ thấy điều này một cách chi tiết hơn trong P-bộ 1108 00:49:21,370 --> 00:49:25,810 5, trước khi các số không và những người đại diện cho các điểm ảnh trong một hình ảnh, 1109 00:49:25,810 --> 00:49:29,110 có một loạt các siêu dữ liệu như kích thước của hình ảnh và các 1110 00:49:29,110 --> 00:49:30,250 chiều rộng của hình ảnh. 1111 00:49:30,250 --> 00:49:32,910 Và thông báo tôi tuốt ra một số điều tùy ý ở đây - 1112 00:49:32,910 --> 00:49:34,260 chiều rộng và chiều cao. 1113 00:49:34,260 --> 00:49:36,160 Số bit và một số thứ khác. 1114 00:49:36,160 --> 00:49:37,840 Do đó, có một số dữ liệu trong một tập tin. 1115 00:49:37,840 --> 00:49:41,470 >> Nhưng bằng sự hiểu biết như thế nào các tập tin được đặt ra theo cách này, bạn có thể thực sự 1116 00:49:41,470 --> 00:49:45,890 sau đó thao tác hình ảnh, khôi phục hình ảnh từ đĩa, thay đổi kích thước hình ảnh. 1117 00:49:45,890 --> 00:49:47,560 Nhưng bạn có thể không nhất thiết phải nâng cao chúng. 1118 00:49:47,560 --> 00:49:48,480 Tôi cần một bức ảnh. 1119 00:49:48,480 --> 00:49:52,840 Vì vậy, tôi đã đi lại để RJ đây, những người bạn nhìn thấy trên màn hình khá nhiều thời gian trước đây. 1120 00:49:52,840 --> 00:49:57,160 Và nếu tôi mở Keynote đây, đây là những gì sẽ xảy ra nếu bạn cố gắng để phóng to và thu 1121 00:49:57,160 --> 00:49:59,380 nâng cao RJ. 1122 00:49:59,380 --> 00:50:01,480 Anh ta không nhận được bất kỳ tốt hơn thực sự. 1123 00:50:01,480 --> 00:50:06,240 Bây giờ Keynote là loại làm mờ nó một chút, chỉ để che đậy sự 1124 00:50:06,240 --> 00:50:11,040 thực tế là RJ không nhận được đặc biệt tăng cường khi bạn zoom in 1125 00:50:11,040 --> 00:50:13,310 Và nếu làm theo cách này, nhìn thấy các hình vuông? 1126 00:50:13,310 --> 00:50:15,490 Vâng, bạn chắc chắn có thể nhìn thấy các hình vuông trên một máy chiếu. 1127 00:50:15,490 --> 00:50:17,690 >> Đó là những gì bạn nhận được khi bạn nâng cao. 1128 00:50:17,690 --> 00:50:22,570 Nhưng trong việc tìm hiểu RJ của chúng tôi hoặc Khuôn mặt cười được thực hiện sẽ cho chúng tôi 1129 00:50:22,570 --> 00:50:24,950 thực sự viết mã điều khiền những điều này. 1130 00:50:24,950 --> 00:50:29,970 Và tôi nghĩ rằng tôi muốn kết thúc vào ghi chú này, với 55 giây của một nâng cao đó là, 1131 00:50:29,970 --> 00:50:31,230 Tôi dám, nói chứ không phải gây hiểu nhầm. 1132 00:50:31,230 --> 00:50:32,990 >> [VIDEO xem lại] 1133 00:50:32,990 --> 00:50:34,790 >> -Hắn nói dối. 1134 00:50:34,790 --> 00:50:38,310 Về những gì, tôi không biết. 1135 00:50:38,310 --> 00:50:41,200 >> -Vì vậy, chúng ta biết gì? 1136 00:50:41,200 --> 00:50:45,280 >> -Đó at 9:15 Ray Santoya là tại máy ATM. 1137 00:50:45,280 --> 00:50:47,830 >> -Vì vậy, câu hỏi là những gì Anh ta làm at 9:16? 1138 00:50:47,830 --> 00:50:50,750 >> -Bắn súng chín milimet tại một cái gì đó. 1139 00:50:50,750 --> 00:50:52,615 Có lẽ ông đã nhìn thấy các tay bắn tỉa. 1140 00:50:52,615 --> 00:50:54,760 >> -Hoặc đã được làm việc với ông. 1141 00:50:54,760 --> 00:50:56,120 >> -Đợi. 1142 00:50:56,120 --> 00:50:57,450 Đi trở lại một. 1143 00:50:57,450 --> 00:50:58,700 >> -Những gì bạn thấy? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Mang khuôn mặt của mình lên, toàn màn hình. 1146 00:51:09,490 --> 00:51:09,790 >> -Ông kính. 1147 00:51:09,790 --> 00:51:11,040 >> -Có một sự phản ánh. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -Đó là đội bóng chày Neuvitas. 1150 00:51:23,520 --> 00:51:24,530 Đó là logo của họ. 1151 00:51:24,530 --> 00:51:27,040 >> -Và anh ấy nói chuyện với bất cứ ai là mặc áo khoác đó. 1152 00:51:27,040 --> 00:51:27,530 >> [END xem video] 1153 00:51:27,530 --> 00:51:29,180 >> DAVID J. Malan: Điều này sẽ có vấn đề Set 5. 1154 00:51:29,180 --> 00:51:30,720 Chúng ta sẽ thấy bạn vào tuần tới. 1155 00:51:30,720 --> 00:51:32,330 >> SPEAKER MALE: Tại CS50 tiếp theo. 1156 00:51:32,330 --> 00:51:39,240 >> [Dế hót líu lo] 1157 00:51:39,240 --> 00:51:41,270 >> [Chơi nhạc]