1 00:00:00,000 --> 00:00:02,860 [Powered by Google Translate] [Tuần 5] 2 00:00:02,860 --> 00:00:04,860 [David J. Malan - Đại học Harvard 3 00:00:04,860 --> 00:00:07,260 [Đây là CS50. - CS50.TV] 4 00:00:07,260 --> 00:00:09,740 >> Đây là CS50, Tuần 5. 5 00:00:09,740 --> 00:00:12,900 Ngày hôm nay và trong tuần này, chúng tôi giới thiệu một chút thế giới của pháp y 6 00:00:12,900 --> 00:00:14,850 trong bối cảnh của vấn đề Thiết lập 4. 7 00:00:14,850 --> 00:00:18,480 Hôm nay sẽ là một bài giảng được viết tắt bởi vì có một sự kiện đặc biệt ở đây sau đó. 8 00:00:18,480 --> 00:00:21,940 Vì vậy, chúng tôi sẽ mất một peek và trêu chọc cả học sinh và phụ huynh cũng như hôm nay 9 00:00:21,940 --> 00:00:24,600 với một số trong những điều mà trên đường chân trời. 10 00:00:24,600 --> 00:00:29,050 >> Trong số đó, là thứ hai, bạn sẽ có thêm một vài người bạn cùng lớp. 11 00:00:29,050 --> 00:00:32,980 edx, Harvard và sáng kiến ​​trực tuyến mới của MIT OpenCourseWare và nhiều hơn nữa, 12 00:00:32,980 --> 00:00:36,730 đang tung ra trong khuôn viên trường Đại học Harvard ngày Thứ hai, có nghĩa là thứ hai 13 00:00:36,730 --> 00:00:40,930 , như số gần đây nhất, bạn sẽ có thêm 86.000 các bạn cùng lớp 14 00:00:40,930 --> 00:00:43,680 những người sẽ theo cùng với các bài giảng và phần CS50 15 00:00:43,680 --> 00:00:45,890 và walkthroughs và bộ vấn đề. 16 00:00:45,890 --> 00:00:51,870 Và như là một phần của điều này, bạn sẽ trở thành thành viên của lớp khai mạc CS50 và bây giờ CS50x. 17 00:00:51,870 --> 00:00:56,150 Là một phần của bây giờ, nhận ra rằng sẽ có một số mặt tích cực như. 18 00:00:56,150 --> 00:01:00,620 Để chuẩn bị sẵn sàng cho điều này, số lượng lớn các sinh viên, 19 00:01:00,620 --> 00:01:03,820 nó đủ để nói rằng mặc dù chúng ta có 108 TFs và CA, 20 00:01:03,820 --> 00:01:07,560 nó không hoàn toàn tỷ lệ học sinh-giáo viên tốt nhất một khi chúng ta đạt 80.000 của học sinh. 21 00:01:07,560 --> 00:01:09,830 Chúng tôi sẽ không được phân loại vấn đề rất nhiều thiết lập thủ công, 22 00:01:09,830 --> 00:01:13,050 để giới thiệu tuần này trong bộ vấn đề sẽ là CS50 tra, 23 00:01:13,050 --> 00:01:15,410 đó là sẽ là một tiện ích dòng lệnh trong thiết bị 24 00:01:15,410 --> 00:01:17,880 bạn sẽ nhận được khi bạn cập nhật nó sau này vào cuối tuần này. 25 00:01:17,880 --> 00:01:21,030 Bạn sẽ có thể chạy lệnh, check50, trên pset của riêng bạn, 26 00:01:21,030 --> 00:01:24,770 và bạn sẽ nhận được thông tin phản hồi ngay lập tức để xem liệu chương trình của bạn là đúng hay sai 27 00:01:24,770 --> 00:01:27,980 theo thông số kỹ thuật thiết kế khác nhau mà chúng tôi đã cung cấp. 28 00:01:27,980 --> 00:01:30,310 Thêm vào đó trong vấn đề thiết lập các đặc điểm kỹ thuật. 29 00:01:30,310 --> 00:01:34,220 Các bạn cùng lớp CS50x sẽ được sử dụng này là tốt. 30 00:01:34,220 --> 00:01:36,170 >> Set 4: Vấn đề là tất cả về pháp lý, 31 00:01:36,170 --> 00:01:38,630 và pset này đã thực sự lấy cảm hứng từ một số công cụ thực tế cuộc sống 32 00:01:38,630 --> 00:01:41,210 theo đó khi tôi đã được ở trường đại học, tôi thực tập trong một thời gian 33 00:01:41,210 --> 00:01:45,270 với văn phòng Luật Sư Quận Middlesex County làm công việc pháp y 34 00:01:45,270 --> 00:01:47,660 với điều tra pháp y dẫn của họ. 35 00:01:47,660 --> 00:01:50,280 Điều này đã lên tới, như tôi nghĩ rằng tôi đã đề cập một vài tuần qua, 36 00:01:50,280 --> 00:01:52,720 là khối lượng Cảnh sát nhà nước hoặc những người khác sẽ đến, 37 00:01:52,720 --> 00:01:56,150 họ sẽ thả ra những thứ như ổ đĩa cứng và đĩa CD và đĩa mềm và các loại tương tự, 38 00:01:56,150 --> 00:01:58,770 và sau đó là mục tiêu của cơ quan pháp y để xác định 39 00:01:58,770 --> 00:02:01,470 liệu có hoặc không phải là bằng chứng của một số loại. 40 00:02:01,470 --> 00:02:04,730 Đây là đơn vị điều tra đặc biệt, do đó, nó là tội phạm cổ trắng. 41 00:02:04,730 --> 00:02:10,949 Đó là loại tội phạm đáng lo ngại hơn, bất cứ điều gì liên quan đến một số loại phương tiện truyền thông kỹ thuật số. 42 00:02:10,949 --> 00:02:16,450 Nó chỉ ra rằng không phải là nhiều người viết một email nói rằng, "Tôi đã làm nó." 43 00:02:16,450 --> 00:02:20,490 Vì vậy, khá thường xuyên, những tìm kiếm pháp y không bật lên tất cả những gì nhiều hoa trái, 44 00:02:20,490 --> 00:02:22,820 nhưng đôi khi người viết email như vậy. 45 00:02:22,820 --> 00:02:25,240 Vì vậy, đôi khi, những nỗ lực đã được khen thưởng. 46 00:02:25,240 --> 00:02:31,210 >> Tuy nhiên, lãnh đạo này pset pháp y, chúng tôi sẽ được giới thiệu trong pset4 một chút về đồ họa. 47 00:02:31,210 --> 00:02:35,410 Bạn có thể có những điều này cho các cấp - hình ảnh JPEG, GIF, và như thế - những ngày này. 48 00:02:35,410 --> 00:02:38,320 Nhưng nếu bạn thực sự nghĩ về nó, một hình ảnh, giống như khuôn mặt của Rob, 49 00:02:38,320 --> 00:02:41,270 có thể được mô hình hóa như là một chuỗi các dấu chấm hoặc điểm ảnh. 50 00:02:41,270 --> 00:02:43,380 Trong trường hợp của khuôn mặt của Rob, có tất cả các loại màu sắc, 51 00:02:43,380 --> 00:02:46,760 và chúng tôi bắt đầu nhìn thấy các dấu chấm cá nhân, nếu không được gọi là điểm ảnh, 52 00:02:46,760 --> 00:02:48,610 một khi chúng tôi bắt đầu để phóng to. 53 00:02:48,610 --> 00:02:54,660 Nhưng nếu chúng ta đơn giản hóa thế giới một chút và chỉ nói rằng đây là Rob màu đen và trắng, 54 00:02:54,660 --> 00:02:57,490 để đại diện cho màu đen và trắng, chúng tôi chỉ có thể sử dụng hệ nhị phân. 55 00:02:57,490 --> 00:03:01,660 Và nếu chúng ta sẽ sử dụng hệ nhị phân, 1 hoặc 0, chúng ta có thể bày tỏ cùng một hình ảnh này 56 00:03:01,660 --> 00:03:06,140 khuôn mặt tươi cười của Rob với mô hình này của các bit. 57 00:03:06,140 --> 00:03:12,100 11000011 đại diện cho trắng, màu trắng, màu đen, màu đen, màu đen, màu đen, trắng, trắng. 58 00:03:12,100 --> 00:03:16,150 Và vì vậy nó không phải là một bước nhảy vọt lớn sau đó để bắt đầu nói chuyện về hình ảnh đầy màu sắc, 59 00:03:16,150 --> 00:03:18,600 những điều mà bạn muốn nhìn thấy trên Facebook hoặc với một máy ảnh kỹ thuật số. 60 00:03:18,600 --> 00:03:21,410 Nhưng chắc chắn khi nói đến màu sắc, bạn cần nhiều bit hơn. 61 00:03:21,410 --> 00:03:25,690 Và khá phổ biến trong thế giới của hình ảnh là sử dụng 1-bit màu, 62 00:03:25,690 --> 00:03:29,560 vì điều này cho thấy, nhưng màu 24-bit, mà bạn thực sự nhận được hàng triệu màu. 63 00:03:29,560 --> 00:03:32,250 Vì vậy, trong trường hợp khi chúng tôi thu nhỏ vào mắt của Rob, 64 00:03:32,250 --> 00:03:36,370 đó là bất kỳ số lượng hàng triệu khả năng khác nhau đầy màu sắc. 65 00:03:36,370 --> 00:03:39,040 Vì vậy, chúng tôi sẽ giới thiệu trong 4 Set Vấn đề cũng như trong quá trình thực hiện, 66 00:03:39,040 --> 00:03:43,370 mà sẽ được ngày hôm nay lúc 3:30 thay vì thông thường 2:30 vì bài giảng hôm thứ Sáu ở đây. 67 00:03:43,370 --> 00:03:46,620 Nhưng đoạn video trực tuyến như bình thường vào ngày mai. 68 00:03:46,620 --> 00:03:48,820 >> Chúng tôi cũng sẽ giới thiệu bạn đến một định dạng tập tin khác. 69 00:03:48,820 --> 00:03:51,270 Điều này là cố ý có nghĩa là nhìn đáng sợ lúc đầu, 70 00:03:51,270 --> 00:03:55,670 nhưng điều này chỉ là một số tài liệu cho một cấu trúc C. 71 00:03:55,670 --> 00:03:58,940 Nó chỉ ra rằng Microsoft năm trước đây đã giúp phổ biến định dạng này 72 00:03:58,940 --> 00:04:05,150 được gọi là định dạng tập tin bitmap, bmp, và điều này là một siêu đơn giản, đầy màu sắc đồ họa định dạng tập tin 73 00:04:05,150 --> 00:04:10,150 đã được sử dụng trong một thời gian và đôi khi vẫn cho hình nền trên máy tính để bàn. 74 00:04:10,150 --> 00:04:14,760 Nếu bạn nghĩ rằng trở lại Windows XP và các ngọn đồi và màu xanh da trời, 75 00:04:14,760 --> 00:04:17,170 điển hình là một hình ảnh bmp hay bitmap. 76 00:04:17,170 --> 00:04:19,959 Bitmap là niềm vui đối với chúng tôi bởi vì họ có phức tạp hơn một chút. 77 00:04:19,959 --> 00:04:22,610 Nó không hoàn toàn đơn giản như thế này lưới của số 0 và 1. 78 00:04:22,610 --> 00:04:27,510 Thay vào đó, bạn có những thứ giống như một tiêu đề vào lúc bắt đầu của một tập tin. 79 00:04:27,510 --> 00:04:31,990 Vì vậy, nói cách khác, bên trong một file bmp. Là một bó toàn bộ 0 và 1, 80 00:04:31,990 --> 00:04:34,910 nhưng có một số số 0 và 1 bổ sung trong đó. 81 00:04:34,910 --> 00:04:38,220 Và nó quay ra rằng những gì chúng ta đã có thể dùng cho các cấp trong nhiều năm - 82 00:04:38,220 --> 00:04:45,170 định dạng file như doc hay xls hoặc mp3,. mp4, các định dạng tập tin bất cứ điều gì 83 00:04:45,170 --> 00:04:48,480 mà bạn đã quen thuộc với nó những gì thậm chí có nghĩa là một định dạng tập tin, 84 00:04:48,480 --> 00:04:52,480 bởi vì lúc cuối ngày, tất cả những tập tin này, chúng tôi sử dụng chỉ có 0 và 1. 85 00:04:52,480 --> 00:04:56,810 Và có lẽ những 0 và 1 đại diện cho ABC thông qua ASCII hoặc các loại tương tự, 86 00:04:56,810 --> 00:04:58,820 nhưng vào cuối ngày, nó vẫn chỉ là 0 và 1. 87 00:04:58,820 --> 00:05:02,100 Vì vậy, con người chỉ thỉnh thoảng quyết định để phát minh ra một định dạng tập tin mới 88 00:05:02,100 --> 00:05:06,420 nơi họ chuẩn hóa những gì các mẫu của các bit thực sự sẽ có nghĩa là. 89 00:05:06,420 --> 00:05:09,220 Và trong trường hợp này ở đây, các folks người đã thiết kế định dạng tập tin bitmap 90 00:05:09,220 --> 00:05:15,620 nói rằng các byte đầu tiên trong một tập tin bitmap, như ký hiệu bởi 0 bù đắp có, 91 00:05:15,620 --> 00:05:18,940 có là có được một số khó hiểu biến có tên gọi là bfType, 92 00:05:18,940 --> 00:05:23,080 mà chỉ là viết tắt của loại tập tin bitmap, loại tập tin bitmap này. 93 00:05:23,080 --> 00:05:27,700 Bạn có thể suy ra có lẽ từ hàng thứ hai mà bù đắp 2, byte số 2, 94 00:05:27,700 --> 00:05:33,740 có một mô hình của 0 và 1 đại diện cho những gì? Kích thước của một cái gì đó. 95 00:05:33,740 --> 00:05:35,310 Và nó đi lên từ đó. 96 00:05:35,310 --> 00:05:37,410 Vì vậy, trong 4 Set vấn đề, bạn sẽ được đi qua một số những điều này. 97 00:05:37,410 --> 00:05:39,520 Chúng tôi sẽ không quan tâm đến tất cả chúng. 98 00:05:39,520 --> 00:05:47,510 Nhưng nhận thấy nó bắt đầu trở nên thú vị xung quanh byte 54: rgbtBlue, Green, và Red. 99 00:05:47,510 --> 00:05:52,110 Nếu bạn đã từng nghe từ viết tắt RGB - màu đỏ, xanh lá cây, xanh da trời - đây là một tài liệu tham khảo đó 100 00:05:52,110 --> 00:05:54,610 bởi vì nó chỉ ra bạn có thể vẽ tất cả các màu sắc của cầu vồng 101 00:05:54,610 --> 00:05:58,180 với một số sự kết hợp của màu đỏ và màu xanh và màu xanh lá cây. 102 00:05:58,180 --> 00:06:03,320 Và trên thực tế, các bậc cha mẹ trong phòng có thể cho rằng một số các máy chiếu đầu tiên. 103 00:06:03,320 --> 00:06:05,890 Những ngày này, bạn chỉ nhìn thấy một ánh sáng chói của một ống kính, 104 00:06:05,890 --> 00:06:09,800 nhưng trở lại trong ngày, bạn đã có ống kính màu đỏ, ống kính màu xanh, và ống kính màu xanh lá cây, 105 00:06:09,800 --> 00:06:13,380 và họ cùng nhau nhằm vào một màn hình và hình thành một bức tranh đầy màu sắc. 106 00:06:13,380 --> 00:06:16,270 Và khá thường xuyên, các trường trung học và trường trung học sẽ có những thấu kính 107 00:06:16,270 --> 00:06:19,720 bao giờ nên hơi lệch, do đó, bạn đã nhìn thấy hình ảnh tăng gấp đôi hoặc gấp ba. 108 00:06:19,720 --> 00:06:24,100 Nhưng đó là ý tưởng. Bạn đã có ánh sáng màu đỏ và màu xanh lá cây và màu xanh vẽ một bức tranh. 109 00:06:24,100 --> 00:06:26,590 Và đó là nguyên tắc tương tự được sử dụng trong máy tính. 110 00:06:26,590 --> 00:06:30,230 >> Vì vậy, trong số những thách thức sau đó cho bạn trong vấn đề Set 4 sẽ có một vài điều. 111 00:06:30,230 --> 00:06:34,800 Một là để thực sự thay đổi kích thước một hình ảnh, để có trong một mô hình của 0 và 1, 112 00:06:34,800 --> 00:06:40,200 tìm ra khối của 0 và 1 đại diện cho những gì trong một cấu trúc như thế này, 113 00:06:40,200 --> 00:06:43,630 và sau đó tìm ra cách để tái tạo các điểm ảnh màu đỏ, xanh, màu xanh - 114 00:06:43,630 --> 00:06:46,660 bên trong để khi một bức ảnh trông như thế này ban đầu, 115 00:06:46,660 --> 00:06:49,210 nó có thể trông như thế này thay vì sau đó. 116 00:06:49,210 --> 00:06:53,640 Trong số những thách thức khác là có được rằng bạn sẽ được giao cho một hình ảnh pháp y 117 00:06:53,640 --> 00:06:56,030 của một tập tin thực tế từ một máy ảnh kỹ thuật số. 118 00:06:56,030 --> 00:06:58,960 Và trên máy ảnh đó, một lần khi một thời gian, một bó toàn bộ hình ảnh. 119 00:06:58,960 --> 00:07:03,760 Vấn đề là chúng ta vô tình bị xóa hoặc có hình ảnh bị hỏng bằng cách nào đó. 120 00:07:03,760 --> 00:07:05,750 Điều xấu xảy ra với máy ảnh kỹ thuật số. 121 00:07:05,750 --> 00:07:09,150 Và do đó, chúng tôi nhanh chóng sao chép tất cả các off 0 và 1 thẻ đó cho bạn, 122 00:07:09,150 --> 00:07:13,610 lưu chúng trong một tập tin lớn, và sau đó chúng tôi sẽ giao cho bạn trong vấn đề Set 4 123 00:07:13,610 --> 00:07:19,320 để bạn có thể viết một chương trình trong C nào đó để khôi phục lại tất cả những hình ảnh JPEG, lý tưởng. 124 00:07:19,320 --> 00:07:23,330 Và nó chỉ ra rằng hình ảnh JPEG, mặc dù họ đang hơi của một định dạng tập tin phức tạp - 125 00:07:23,330 --> 00:07:26,360 họ phức tạp hơn nhiều so với khuôn mặt tươi cười ở đây - 126 00:07:26,360 --> 00:07:31,160 nó quay ra rằng JPEG đều bắt đầu với các mô hình tương tự 0 và 1. 127 00:07:31,160 --> 00:07:35,630 Vì vậy, sử dụng, cuối cùng, một vòng lặp trong khi cho vòng lặp hoặc tương tự, 128 00:07:35,630 --> 00:07:38,880 bạn có thể lặp lại trên tất cả các số 0 và 1 trong bức ảnh pháp y, 129 00:07:38,880 --> 00:07:43,150 và mỗi khi bạn xem các mô hình đặc biệt được định nghĩa trong vấn đề thiết lập các đặc điểm kỹ thuật, 130 00:07:43,150 --> 00:07:47,880 bạn có thể giả định ở đây là, với xác suất rất cao, sự bắt đầu của một JPEG. 131 00:07:47,880 --> 00:07:51,230 Và ngay khi bạn tìm thấy cùng một khuôn mẫu một số số byte 132 00:07:51,230 --> 00:07:55,430 hoặc kilobytes hoặc MB sau đó, bạn có thể giả định đây là một JPEG thứ hai, 133 00:07:55,430 --> 00:07:57,380 hình ảnh này, tôi mất sau khi một trong những người đầu tiên. 134 00:07:57,380 --> 00:08:01,370 Hãy để tôi ngừng đọc tập tin đó đầu tiên, bắt đầu viết mới này, 135 00:08:01,370 --> 00:08:06,310 và đầu ra của chương trình của bạn cho pset4 là có được như nhiều như 50 hình ảnh JPEG. 136 00:08:06,310 --> 00:08:09,270 Và nếu nó không phải là 50 hình ảnh JPEG, bạn có một chút của một vòng lặp. 137 00:08:09,270 --> 00:08:12,490 Nếu bạn có một số lượng vô hạn của hình ảnh JPEG, bạn có một vòng lặp vô hạn. 138 00:08:12,490 --> 00:08:14,910 Vì vậy, đó cũng sẽ là một trường hợp khá phổ biến. 139 00:08:14,910 --> 00:08:16,600 Vì vậy, đó là những gì trên đường chân trời. 140 00:08:16,600 --> 00:08:21,310 >> Quiz 0 phía sau chúng tôi, nhận ra mỗi email của tôi lúc nào cũng có người cả hai đều hạnh phúc, 141 00:08:21,310 --> 00:08:23,640 sắp xếp thời gian 0 trung lập, và buồn xung quanh bài kiểm tra. 142 00:08:23,640 --> 00:08:26,800 Và xin vui lòng không đến được với tôi, người đứng đầu TF Zamyla, TF của riêng bạn, 143 00:08:26,800 --> 00:08:31,180 hoặc một trong các CA mà bạn biết nếu bạn muốn thảo luận về mọi thứ đã đi như thế nào. 144 00:08:31,180 --> 00:08:35,539 >> Vì vậy, để gây ấn tượng với các bậc cha mẹ ở đây trong phòng, thư viện CS50 là gì? 145 00:08:36,429 --> 00:08:40,390 [Cười] Good job. 146 00:08:40,390 --> 00:08:48,340 Thư viện CS50 là gì? Yeah. >> [Sinh viên] Đó là một tập trước bằng văn bản của mã [không nghe được] 147 00:08:48,340 --> 00:08:49,750 Được rồi, tốt. 148 00:08:49,750 --> 00:08:53,240 Đó là một tập trước bằng văn bản của mã mà chúng tôi các nhân viên đã viết, chúng tôi cung cấp cho bạn, 149 00:08:53,240 --> 00:08:55,030 cung cấp một số chức năng thông thường, 150 00:08:55,030 --> 00:08:59,020 thứ như thế làm cho tôi một chuỗi, làm cho tôi một int - tất cả các chức năng được liệt kê ở đây. 151 00:08:59,020 --> 00:09:02,260 >> Bắt đầu từ bây giờ, chúng tôi bắt đầu để thực sự đi những bánh xe đào tạo. 152 00:09:02,260 --> 00:09:05,050 Chúng ta sẽ bắt đầu để lấy đi một chuỗi từ bạn, 153 00:09:05,050 --> 00:09:08,870 thu hồi là chỉ là một từ đồng nghĩa cho những gì thực tế kiểu dữ liệu? >> [Nhiều sinh viên Char *. 154 00:09:08,870 --> 00:09:12,730 Char *. Đối với cha mẹ, đó là có thể [làm cho whooshing âm thanh]. Đó là tốt. 155 00:09:12,730 --> 00:09:17,550 Char * chúng tôi sẽ bắt đầu nhìn thấy trên màn hình hơn cả khi chúng tôi loại bỏ chuỗi từ những từ vựng của chúng tôi, 156 00:09:17,550 --> 00:09:19,730 ít nhất là khi nói đến thực sự viết code. 157 00:09:19,730 --> 00:09:22,840 Tương tự như vậy, chúng tôi sẽ ngừng sử dụng một số các chức năng này càng nhiều 158 00:09:22,840 --> 00:09:25,280 bởi vì các chương trình của chúng tôi sẽ nhận được tinh vi hơn. 159 00:09:25,280 --> 00:09:28,480 Thay vì chỉ viết các chương trình mà ngồi đó với một nhấp nháy nhanh chóng, 160 00:09:28,480 --> 00:09:31,870 chờ đợi cho người sử dụng gõ một cái gì đó trong, bạn sẽ có được đầu vào của bạn từ nơi khác. 161 00:09:31,870 --> 00:09:35,490 Ví dụ, bạn sẽ nhận được chúng từ một loạt các bit trên ổ đĩa cứng địa phương. 162 00:09:35,490 --> 00:09:38,580 Thay vào đó bạn sẽ nhận được chúng trong tương lai từ một kết nối mạng, 163 00:09:38,580 --> 00:09:40,230 một số trang web một nơi nào đó. 164 00:09:40,230 --> 00:09:44,110 >> Vì vậy, hãy bóc lớp này cho lần đầu tiên và kéo lên gia dụng CS50 165 00:09:44,110 --> 00:09:49,010 và tập tin này được gọi là cs50.h, bạn đã được # bao gồm nhiều tuần, 166 00:09:49,010 --> 00:09:51,140 nhưng chúng ta hãy thực sự nhìn thấy những gì bên trong này. 167 00:09:51,140 --> 00:09:54,430 Phía trên cùng của tập tin trong màu xanh chỉ là một bó toàn bộ ý kiến: 168 00:09:54,430 --> 00:09:57,050 bảo hành thông tin và cấp giấy phép. 169 00:09:57,050 --> 00:09:59,050 Đây là sắp xếp của một mô hình phổ biến trong phần mềm 170 00:09:59,050 --> 00:10:01,580 bởi vì rất nhiều phần mềm trong những ngày này là những gì được gọi là mã nguồn mở, 171 00:10:01,580 --> 00:10:05,220 có nghĩa là ai đó đã viết mã và làm cho nó tự do có sẵn 172 00:10:05,220 --> 00:10:10,470 không chỉ để chạy và sử dụng, nhưng để thực sự đọc và thay đổi và tích hợp vào công việc của riêng bạn. 173 00:10:10,470 --> 00:10:14,660 Vì vậy, đó là những gì bạn đã được sử dụng, phần mềm mã nguồn mở, mặc dù trong một hình thức rất nhỏ. 174 00:10:14,660 --> 00:10:18,560 Nếu tôi di chuyển xuống qua các ý kiến, tuy nhiên, chúng tôi sẽ bắt đầu thấy một số điều quen thuộc hơn. 175 00:10:18,560 --> 00:10:25,010 Thông báo ở trên cùng ở đây là các tập tin cs50.h bao gồm một bó toàn bộ các tập tin tiêu đề. 176 00:10:25,010 --> 00:10:28,560 Hầu hết trong số này, chúng tôi đã không nhìn thấy trước, nhưng một là quen thuộc. 177 00:10:28,560 --> 00:10:32,270 Mà trong số này chúng ta thấy, mặc dù một thời gian ngắn, do đó đến nay? >> [Sinh viên] Standard thư viện. 178 00:10:32,270 --> 00:10:35,810 Yeah, tiêu chuẩn thư viện. stdlib.h có malloc. 179 00:10:35,810 --> 00:10:38,320 Sau khi chúng tôi bắt đầu nói chuyện về cấp phát bộ nhớ động, 180 00:10:38,320 --> 00:10:41,650 mà chúng ta sẽ quay trở lại đến tuần sau, chúng tôi bắt đầu bao gồm các tập tin đó. 181 00:10:41,650 --> 00:10:46,640 Nó chỉ ra rằng bool và đúng và sai không thực sự tồn tại trong C cho mỗi gia nhập 182 00:10:46,640 --> 00:10:49,440 trừ khi bạn bao gồm tập tin này ở đây. 183 00:10:49,440 --> 00:10:52,710 Chúng tôi đã nhiều tuần được bao gồm stdbool.h 184 00:10:52,710 --> 00:10:55,620 để bạn có thể sử dụng các khái niệm của một bool, đúng hay sai 185 00:10:55,620 --> 00:10:58,620 Nếu không có điều này, bạn sẽ phải sắp xếp giả mạo nó và sử dụng một int 186 00:10:58,620 --> 00:11:02,610 và chỉ cần tùy tiện cho rằng 0 là sai và 1 là đúng. 187 00:11:02,610 --> 00:11:07,150 Nếu chúng ta di chuyển xuống thấp hơn nữa, đây là định nghĩa của chúng ta về một chuỗi. 188 00:11:07,150 --> 00:11:11,390 Hóa ra, như chúng tôi đã nói trước đây, rằng ngôi sao này ở đâu không quan trọng. 189 00:11:11,390 --> 00:11:13,720 Bạn thậm chí có thể có không gian xung quanh. 190 00:11:13,720 --> 00:11:16,740 Chúng tôi học kỳ này đã được thúc đẩy như thế này để làm cho rõ ràng 191 00:11:16,740 --> 00:11:18,620 ngôi sao đã làm với các loại, 192 00:11:18,620 --> 00:11:21,700 nhưng nhận ra chỉ là phổ biến, nếu không phải là một ít phổ biến hơn, 193 00:11:21,700 --> 00:11:24,430 là đặt nó ở đó, nhưng chức năng nó là điều tương tự. 194 00:11:24,430 --> 00:11:27,720 Nhưng bây giờ nếu chúng ta đọc xuống hơn nữa, chúng ta hãy có một cái nhìn tại getInt 195 00:11:27,720 --> 00:11:32,190 bởi vì chúng tôi sử dụng rằng có lẽ đầu tiên trước khi bất cứ điều gì khác trong học kỳ này. 196 00:11:32,190 --> 00:11:37,440 Đây là getInt. Đây là những gì? >> [Sinh viên] Một nguyên mẫu. >> Đây chỉ là một mẫu thử nghiệm. 197 00:11:37,440 --> 00:11:41,410 Thông thường, chúng tôi đã đưa nguyên mẫu tại các đỉnh của chúng tôi các tập tin c, 198 00:11:41,410 --> 00:11:46,690 nhưng bạn cũng có thể đặt nguyên mẫu trong tập tin tiêu đề, h tập tin., như thế này ở đây 199 00:11:46,690 --> 00:11:50,840 do đó khi bạn viết một số chức năng mà bạn muốn người khác có thể sử dụng, 200 00:11:50,840 --> 00:11:53,550 đó chính xác là trường hợp với các thư viện CS50, 201 00:11:53,550 --> 00:11:57,040 bạn không chỉ thực hiện các chức năng của bạn trong một cái gì đó giống như cs50.c, 202 00:11:57,040 --> 00:12:02,790 bạn cũng đặt các nguyên mẫu không phải ở trên cùng của tập tin đó nhưng ở phía trên cùng của một tập tin tiêu đề. 203 00:12:02,790 --> 00:12:07,170 Sau đó, tập tin tiêu đề đó là những gì bạn bè và đồng nghiệp bao gồm 204 00:12:07,170 --> 00:12:09,760 # bao gồm trong mã riêng của họ. 205 00:12:09,760 --> 00:12:12,210 Vì vậy, thời gian này, bạn đã bao gồm tất cả các nguyên mẫu, 206 00:12:12,210 --> 00:12:16,580 hiệu quả ở phía trên cùng của tập tin của bạn, nhưng bằng cách này # bao gồm cơ chế, 207 00:12:16,580 --> 00:12:20,070 về cơ bản các bản sao và bột nhão tập tin này thành của riêng bạn. 208 00:12:20,070 --> 00:12:23,070 Dưới đây là một số tài liệu hướng dẫn khá chi tiết. 209 00:12:23,070 --> 00:12:25,640 Chúng tôi đã thực hiện khá nhiều cho rằng getInt được một int, 210 00:12:25,640 --> 00:12:27,640 nhưng nó quay ra có một số trường hợp góc. 211 00:12:27,640 --> 00:12:31,810 Điều gì sẽ xảy ra nếu người sử dụng các loại trong một số cách quá lớn, một quintillion, 212 00:12:31,810 --> 00:12:35,490 chỉ có thể không phù hợp với bên trong của một int? Hành vi mong đợi là gì? 213 00:12:35,490 --> 00:12:38,020 Lý tưởng nhất, đó là dự đoán được. 214 00:12:38,020 --> 00:12:40,280 Vì vậy, trong trường hợp này, nếu bạn thực sự đọc những dòng chữ nhỏ, 215 00:12:40,280 --> 00:12:44,500 bạn có thể thấy rằng nếu không thể đọc được dòng này INT_MAX trả về. 216 00:12:44,500 --> 00:12:48,320 Chúng tôi đã không bao giờ nói về điều này, nhưng dựa trên vốn của nó, là những gì nó có thể? 217 00:12:48,320 --> 00:12:50,640 [Sinh viên] Một hằng số. >> Đó là một hằng số. 218 00:12:50,640 --> 00:12:54,770 Đó là một số hằng số đặc biệt có thể được khai báo trong một trong các tập tin tiêu đề 219 00:12:54,770 --> 00:13:00,090 lên cao hơn trong tập tin, và INT_MAX có lẽ là một cái gì đó như khoảng 2 tỷ đồng, 220 00:13:00,090 --> 00:13:04,990 ý tưởng là bởi vì bằng cách nào đó chúng ta cần phải biểu hiện một điều gì đó đã đi sai, 221 00:13:04,990 --> 00:13:10,700 chúng tôi, có, có 4 tỷ số lúc xử lý của chúng tôi: -2 tỷ đồng trên lên đến 2 tỷ đồng, cho hay phải mất. 222 00:13:10,700 --> 00:13:14,710 Vâng, những gì là phổ biến trong lập trình là bạn ăn cắp một trong những con số, 223 00:13:14,710 --> 00:13:18,920 có thể là 0, có thể 2 tỷ đồng, có thể -2 tỷ đồng, 224 00:13:18,920 --> 00:13:23,280 do đó, bạn chi tiêu một trong những giá trị có thể của bạn để bạn có thể cam kết với thế giới 225 00:13:23,280 --> 00:13:26,820 rằng nếu có điều gì sai, tôi sẽ trở lại giá trị này siêu lớn. 226 00:13:26,820 --> 00:13:31,030 Nhưng bạn không muốn người dùng gõ một cái gì đó khó hiểu như 234 ..., một số thực sự lớn. 227 00:13:31,030 --> 00:13:34,060 Khái quát nó thay vì như là một hằng số. 228 00:13:34,060 --> 00:13:38,060 Vì vậy, thực sự, nếu bạn đã là hậu môn trong vài tuần qua, bất cứ lúc nào bạn được gọi là getInt, 229 00:13:38,060 --> 00:13:42,900 bạn cần phải có được kiểm tra với một nếu điều kiện đã làm các loại người dùng trong INT_MAX, 230 00:13:42,900 --> 00:13:46,590 hoặc, cụ thể hơn, đã làm INT_MAX trở lại getInt, vì nếu làm vậy, 231 00:13:46,590 --> 00:13:51,830 mà thực sự có nghĩa là họ không gõ nó. Một cái gì đó đã đi sai trong trường hợp này. 232 00:13:51,830 --> 00:13:56,080 Vì vậy, đây là những gì thường được biết đến như một giá trị trọng điểm, mà chỉ có nghĩa đặc biệt. 233 00:13:56,080 --> 00:13:58,120 >> Bây giờ chúng ta hãy trở thành các tập tin c.. 234 00:13:58,120 --> 00:14:01,340 Các tập tin C đã tồn tại trong thiết bị một thời gian. 235 00:14:01,340 --> 00:14:06,840 Và trên thực tế, thiết bị có nó trước khi biên dịch cho bạn vào điều đó chúng tôi gọi là mã đối tượng, 236 00:14:06,840 --> 00:14:09,540 nhưng nó chỉ không quan trọng với bạn đó là vì hệ thống biết 237 00:14:09,540 --> 00:14:11,730 trong trường hợp này là: thiết bị. 238 00:14:11,730 --> 00:14:17,400 Hãy di chuyển xuống getInt và xem như thế nào getInt đã làm việc tất cả thời gian. 239 00:14:17,400 --> 00:14:19,460 Ở đây chúng tôi có ý kiến ​​tương tự từ trước. 240 00:14:19,460 --> 00:14:21,660 Hãy để tôi phóng to trên phần chỉ là mã. 241 00:14:21,660 --> 00:14:23,900 Và những gì chúng tôi có cho getInt là sau đây. 242 00:14:23,900 --> 00:14:25,700 Nó không có đầu vào. 243 00:14:25,700 --> 00:14:29,510 Nó trả về một int, trong khi (đúng), do đó, chúng ta có một vòng lặp vô hạn cố ý, 244 00:14:29,510 --> 00:14:33,180 nhưng có lẽ chúng ta sẽ thoát ra khỏi điều này bằng cách nào đó hoặc trở lại từ bên trong. 245 00:14:33,180 --> 00:14:34,870 >> Hãy xem cách làm việc này. 246 00:14:34,870 --> 00:14:39,240 Chúng tôi dường như được sử dụng GetString trong dòng này đầu tiên bên trong vòng lặp, 166. 247 00:14:39,240 --> 00:14:43,780 Điều này bây giờ là thực hành tốt, vì trong hoàn cảnh nào GetString có thể trở lại 248 00:14:43,780 --> 00:14:47,660 NULL từ khóa đặc biệt không? >> [Sinh viên] Nếu có điều gì sai. 249 00:14:47,660 --> 00:14:51,630 Nếu có điều gì sai. Và những gì có thể đi sai khi bạn gọi một cái gì đó giống như GetString? 250 00:14:54,960 --> 00:14:57,640 Yeah. >> [Sinh viên] Malloc không để cho nó ints. 251 00:14:57,640 --> 00:14:59,150 Yeah. Có lẽ malloc không. 252 00:14:59,150 --> 00:15:03,190 Một nơi nào đó bên dưới mui xe, GetString gọi malloc, cấp phát bộ nhớ, 253 00:15:03,190 --> 00:15:06,020 cho phép các cửa hàng máy tính tất cả các nhân vật 254 00:15:06,020 --> 00:15:07,750 mà người dùng gõ vào bàn phím. 255 00:15:07,750 --> 00:15:11,590 Và giả sử người dùng đã có một toàn bộ rất nhiều thời gian miễn phí và gõ nhiều, ví dụ, 256 00:15:11,590 --> 00:15:16,160 hơn 2 tỷ ký tự, nhân vật nhiều hơn máy tính thậm chí còn có bộ nhớ RAM. 257 00:15:16,160 --> 00:15:19,250 GetString để có thể để cho biết rằng cho bạn. 258 00:15:19,250 --> 00:15:22,560 Ngay cả nếu điều này là một trường hợp góc siêu siêu phổ biến, 259 00:15:22,560 --> 00:15:24,340 nó có bằng cách nào đó có thể xử lý này, 260 00:15:24,340 --> 00:15:28,750 và như vậy GetString, nếu chúng ta quay trở lại và đọc tài liệu của nó, không trong NULL trở lại thực tế. 261 00:15:28,750 --> 00:15:34,460 Vì vậy, bây giờ nếu GetString không thành công bằng cách trả về NULL, getInt là thất bại bằng cách trả lại INT_MAX 262 00:15:34,460 --> 00:15:37,690 chỉ như là một trọng điểm. Đây chỉ là quy ước của con người. 263 00:15:37,690 --> 00:15:41,450 Cách duy nhất bạn sẽ biết đây là trường hợp bằng cách đọc các tài liệu hướng dẫn. 264 00:15:41,450 --> 00:15:45,040 >> Hãy di chuyển xuống nơi int thực sự nhận được. 265 00:15:45,040 --> 00:15:51,160 Nếu tôi di chuyển xuống một chút nữa, trong dòng 170, chúng tôi có một bình luận trên những dòng này. 266 00:15:51,160 --> 00:15:55,100 Chúng tôi tuyên bố trong 172 int, n, và một char, c, và sau đó chức năng này mới, 267 00:15:55,100 --> 00:15:58,930 mà một số bạn có vấp trên trước, sscanf. 268 00:15:58,930 --> 00:16:00,870 Điều này là viết tắt cho scanf chuỗi. 269 00:16:00,870 --> 00:16:05,700 Nói cách khác, cho tôi một chuỗi và tôi sẽ quét nó cho các mẩu thông tin quan tâm. 270 00:16:05,700 --> 00:16:07,360 Điều đó có nghĩa là gì? 271 00:16:07,360 --> 00:16:11,800 Giả sử rằng tôi nhập vào, theo nghĩa đen, 123 vào bàn phím và sau đó nhấn Enter. 272 00:16:11,800 --> 00:16:16,470 Các kiểu dữ liệu của 123 khi trở về GetString là gì? >> [Sinh viên] String. 273 00:16:16,470 --> 00:16:18,380 Đó rõ ràng là một chuỗi, phải không? Tôi có một chuỗi. 274 00:16:18,380 --> 00:16:23,220 Vì vậy, 123 là thực sự, báo giá unquote, 123 0 \ kết thúc của nó. 275 00:16:23,220 --> 00:16:27,110 Đó không phải là một int. Đó không phải là một số. Nó trông giống như một số nhưng nó không thực sự. 276 00:16:27,110 --> 00:16:29,080 Vì vậy, getInt những gì phải làm gì? 277 00:16:29,080 --> 00:16:35,750 Nó đã để quét rằng chuỗi trái sang phải - 123 \ 0 - và bằng cách nào đó chuyển đổi một số nguyên thực tế. 278 00:16:35,750 --> 00:16:37,850 Bạn có thể tìm ra cách để làm điều này. 279 00:16:37,850 --> 00:16:41,450 Nếu bạn xem lại đến pset2, bạn có lẽ có một chút thoải mái với Caesar 280 00:16:41,450 --> 00:16:44,820 hoặc Vigenere, vì vậy bạn có thể lặp qua một chuỗi, bạn có thể chuyển đổi các ký tự để ints. 281 00:16:44,820 --> 00:16:46,710 Nhưng heck, đó là một toàn bộ rất nhiều công việc. 282 00:16:46,710 --> 00:16:49,860 Tại sao không gọi một chức năng như sscanf nào đó cho bạn? 283 00:16:49,860 --> 00:16:54,230 Vì vậy, sscanf hy vọng một đối số - trong trường hợp này được gọi là dòng, trong đó là một chuỗi. 284 00:16:54,230 --> 00:17:01,840 Sau đó, bạn chỉ định trong dấu ngoặc kép, rất giống như printf, những gì bạn mong đợi để xem trong chuỗi này. 285 00:17:01,840 --> 00:17:09,000 Và những gì tôi đang nói ở đây là tôi mong đợi để xem một số thập phân và có thể một nhân vật. 286 00:17:09,000 --> 00:17:12,000 Và chúng ta sẽ thấy lý do tại sao điều này là trường hợp trong thời điểm này chỉ là một. 287 00:17:12,000 --> 00:17:15,869 Và nó quay ra rằng ký hiệu này gợi nhớ các công cụ chúng tôi bắt đầu nói về 288 00:17:15,869 --> 00:17:17,619 chỉ hơn một tuần trước đây. 289 00:17:17,619 --> 00:17:21,740 Những gì là & n & c làm cho chúng ta ở đây? >> [Sinh viên] Địa chỉ và địa chỉ của c. 290 00:17:21,740 --> 00:17:25,400 Yeah. Nó đem lại cho tôi địa chỉ của n và địa chỉ của c. Tại sao điều đó lại quan trọng? 291 00:17:25,400 --> 00:17:30,220 Bạn biết rằng với chức năng trong C, bạn luôn có thể trả về một giá trị hoặc không có giá trị ở tất cả. 292 00:17:30,220 --> 00:17:34,530 Bạn có thể quay trở lại một int, một chuỗi, float, char, bất cứ điều gì, hoặc bạn có thể quay trở lại khoảng trống, 293 00:17:34,530 --> 00:17:38,030 nhưng bạn chỉ có thể quay trở lại một điều tối đa. 294 00:17:38,030 --> 00:17:42,760 Nhưng ở đây chúng tôi muốn sscanf để trả lại cho tôi có thể là một int, một số thập phân, 295 00:17:42,760 --> 00:17:46,220 và cũng là một char, và tôi sẽ giải thích lý do tại sao các char trong một thời điểm. 296 00:17:46,220 --> 00:17:51,460 Bạn có hiệu quả muốn sscanf để trở về hai điều, nhưng đó là không thể trong C. 297 00:17:51,460 --> 00:17:55,200 Bạn có thể làm việc xung quanh đó bằng cách đi qua trong hai địa chỉ 298 00:17:55,200 --> 00:17:57,370 bởi vì ngay sau khi bạn trao chức năng hai địa chỉ, 299 00:17:57,370 --> 00:18:00,470 chức năng đó có thể làm gì với họ? >> [Sinh viên] Viết thư cho các địa chỉ. 300 00:18:00,470 --> 00:18:02,010 Nó có thể viết thư đến những địa chỉ. 301 00:18:02,010 --> 00:18:05,770 Bạn có thể sử dụng các hoạt động sao và đi đến đó, với mỗi người trong số những địa chỉ. 302 00:18:05,770 --> 00:18:11,260 Đó là loại cơ chế này cửa trở lại nhưng rất phổ biến để thay đổi giá trị của biến 303 00:18:11,260 --> 00:18:14,870 nhiều hơn chỉ là một nơi - trong trường hợp này, hai. 304 00:18:14,870 --> 00:18:21,340 Bây giờ nhận thấy tôi đang kiểm tra == 1 và sau đó trở về n nếu điều đó không, trên thực tế, đánh giá đúng sự thật. 305 00:18:21,340 --> 00:18:26,170 Vì vậy, những gì đang xảy ra? Về mặt kỹ thuật, tất cả những gì chúng ta thực sự muốn xảy ra trong getInt này. 306 00:18:26,170 --> 00:18:30,740 Chúng tôi muốn phân tích, có thể nói, chúng tôi muốn đọc những chuỗi quote-unquote 123 - 307 00:18:30,740 --> 00:18:34,560 và nếu nó trông giống như có một số đó, những gì chúng ta đang nói sscanf làm 308 00:18:34,560 --> 00:18:38,190 đưa con số đó - 123 - trong biến n cho tôi. 309 00:18:38,190 --> 00:18:42,090 Vậy tại sao sau đó tôi mới thực sự có điều này là tốt? 310 00:18:42,090 --> 00:18:48,220 Vai trò của sscanf nói rằng bạn cũng có thể có được một nhân vật ở đây là gì? 311 00:18:48,220 --> 00:18:53,470 [Không nghe được sinh viên phản ứng] >> Một điểm thập phân có thể thực sự làm việc. 312 00:18:53,470 --> 00:18:56,330 Chúng ta hãy nắm suy nghĩ một lát. Những gì khác? 313 00:18:56,330 --> 00:18:59,270 [Sinh viên] Nó có thể là NULL. >> Suy nghĩ. Nó có thể là các ký tự null. 314 00:18:59,270 --> 00:19:01,660 Nó thực sự không phải trong trường hợp này. Yeah. >> [Sinh viên] ASCII. 315 00:19:01,660 --> 00:19:04,340 ASCII. Hoặc cho tôi khái quát hơn nữa. 316 00:19:04,340 --> 00:19:06,640 C% có chỉ là để kiểm tra lỗi. 317 00:19:06,640 --> 00:19:09,300 Chúng tôi không muốn có được một nhân vật sau khi số lượng, 318 00:19:09,300 --> 00:19:11,870 nhưng điều này cho phép tôi làm là sau đây. 319 00:19:11,870 --> 00:19:18,210 Nó chỉ ra rằng, bên cạnh việc lưu trữ các giá trị trong n và c trong ví dụ này ở đây, sscanf 320 00:19:18,210 --> 00:19:24,890 những gì nó cũng là nó sẽ trả về số lượng các biến đặt các giá trị. 321 00:19:24,890 --> 00:19:30,260 Vì vậy, nếu bạn chỉ gõ ở 123, sau đó chỉ d% để phù hợp với, 322 00:19:30,260 --> 00:19:33,880 và chỉ có n được lưu trữ với một giá trị như 123, 323 00:19:33,880 --> 00:19:35,640 và không có gì được đặt vào c. 324 00:19:35,640 --> 00:19:37,620 C vẫn còn là một giá trị rác, do đó, để nói chuyện - 325 00:19:37,620 --> 00:19:40,730 rác bởi vì nó không bao giờ được khởi tạo một số giá trị. 326 00:19:40,730 --> 00:19:45,520 Vì vậy, trong trường hợp đó, sscanf trả về 1 bởi vì tôi dân số 1 của các con trỏ, 327 00:19:45,520 --> 00:19:50,190 trong trường hợp tuyệt vời, tôi có một int vì vậy tôi giải phóng đường để giải phóng bộ nhớ 328 00:19:50,190 --> 00:19:54,000 GetString đó thực sự được phân bổ, và sau đó tôi trở lại n, 329 00:19:54,000 --> 00:19:58,500 khác nếu bạn đã bao giờ tự hỏi rằng Thử lại tuyên bố đến từ, nó đi kèm từ ngay tại đây. 330 00:19:58,500 --> 00:20:04,390 Vì vậy, nếu, ngược lại, tôi gõ 123foo chỉ là một số chuỗi văn bản ngẫu nhiên - 331 00:20:04,390 --> 00:20:08,490 sscanf sẽ nhìn thấy số lượng, số lượng, số lượng, f, 332 00:20:08,490 --> 00:20:16,410 và nó sẽ đưa số 123 trong n, nó sẽ đặt f trong c và sau đó trở lại 2. 333 00:20:16,410 --> 00:20:20,640 Vì vậy, chúng tôi có, chỉ cần sử dụng các định nghĩa cơ bản của hành vi sscanf, một cách rất đơn giản - 334 00:20:20,640 --> 00:20:23,900 cũng phức tạp ở cái nhìn đầu tiên, nhưng ở cuối của ngày cơ chế khá đơn giản - 335 00:20:23,900 --> 00:20:28,320 nói là có một int và nếu có, là điều duy nhất mà tôi tìm thấy? 336 00:20:28,320 --> 00:20:29,860 Và các khoảng trắng ở đây là có chủ ý. 337 00:20:29,860 --> 00:20:34,000 Nếu bạn đọc các tài liệu cho sscanf, nó nói với bạn rằng nếu bạn bao gồm một mảnh khoảng trắng 338 00:20:34,000 --> 00:20:38,810 ở đầu hoặc cuối cùng, sscanf quá sẽ cho phép người sử dụng, vì lý do gì, 339 00:20:38,810 --> 00:20:41,860 để đạt 123 gian quầy bar và đó sẽ là hợp pháp. 340 00:20:41,860 --> 00:20:44,150 Bạn sẽ không la lên với người sử dụng chỉ vì họ nhấn thanh không gian 341 00:20:44,150 --> 00:20:48,640 ở đầu hoặc cuối cùng, chỉ là một chút thân thiện với người sử dụng. 342 00:20:48,640 --> 00:20:52,300 >> Bất kỳ câu hỏi sau đó trên getInt? Yeah. >> [Sinh viên] Điều gì sẽ xảy ra nếu bạn chỉ cần đặt trong một char? 343 00:20:52,300 --> 00:20:54,030 Tốt câu hỏi. 344 00:20:54,030 --> 00:20:59,890 Điều gì sẽ xảy ra nếu bạn chỉ cần gõ vào một char như f và nhấn Enter mà không cần gõ 123? 345 00:20:59,890 --> 00:21:02,420 Bạn nghĩ gì về hành vi của các dòng mã này sau đó sẽ là? 346 00:21:02,420 --> 00:21:04,730 [Không nghe được sinh viên phản ứng] 347 00:21:04,730 --> 00:21:08,790 Yeah, vì vậy sscanf có thể bao gồm điều đó bởi vì trong trường hợp đó, nó sẽ không để điền vào n c. 348 00:21:08,790 --> 00:21:15,310 Nó sẽ thay vì trở về 0, trong trường hợp này tôi cũng bắt đó kịch bản 349 00:21:15,310 --> 00:21:18,750 bởi vì giá trị kỳ vọng tôi muốn là 1. 350 00:21:18,750 --> 00:21:22,000 Tôi chỉ muốn một và chỉ có một điều để được làm đầy. Tốt câu hỏi. 351 00:21:22,000 --> 00:21:24,290 >> Những người khác? Được rồi. 352 00:21:24,290 --> 00:21:26,250 >> Chúng ta không đi qua tất cả các chức năng ở đây, 353 00:21:26,250 --> 00:21:29,500 nhưng một trong đó có vẻ là có thể quan tâm còn lại là GetString 354 00:21:29,500 --> 00:21:32,790 bởi vì nó chỉ ra rằng GetFloat, getInt, GetDouble, GetLongLong 355 00:21:32,790 --> 00:21:36,260 tất cả punt rất nhiều các chức năng của họ để GetString. 356 00:21:36,260 --> 00:21:39,750 Vì vậy, chúng ta hãy xem xét làm thế nào ông được thực hiện ở đây. 357 00:21:39,750 --> 00:21:43,630 Điều này có vẻ phức tạp một chút, nhưng nó sử dụng cùng một nguyên tắc cơ bản 358 00:21:43,630 --> 00:21:45,670 chúng tôi bắt đầu nói về tuần trước. 359 00:21:45,670 --> 00:21:49,490 GetString, trong đó có không có đối số theo khoảng trống ở đây 360 00:21:49,490 --> 00:21:53,730 và nó trả về một chuỗi, tôi dường như đang tuyên bố một chuỗi được gọi là bộ đệm. 361 00:21:53,730 --> 00:21:56,270 Tôi không thực sự biết đó là những gì sẽ được sử dụng cho nêu ra, nhưng chúng ta sẽ thấy. 362 00:21:56,270 --> 00:21:58,390 Có vẻ như dung lượng mặc định 0. 363 00:21:58,390 --> 00:22:01,350 Không khá chắc chắn nơi này là đi, không chắc chắn những gì n được sẽ được sử dụng cho nêu ra, 364 00:22:01,350 --> 00:22:03,590 nhưng bây giờ nó nhận được một chút thú vị hơn. 365 00:22:03,590 --> 00:22:06,520 Trong dòng 243, chúng ta khai báo một int, c. 366 00:22:06,520 --> 00:22:08,800 Đây là một chi tiết ngu ngốc. 367 00:22:08,800 --> 00:22:15,820 Char là 8 bit, và 8 bit có thể lưu trữ bao nhiêu giá trị khác nhau? >> [Sinh viên] 256. >> 256. 368 00:22:15,820 --> 00:22:20,730 Vấn đề là nếu bạn muốn có 256 ký tự ASCII khác nhau, trong đó có 369 00:22:20,730 --> 00:22:23,340 nếu bạn nghĩ trở lại - và điều này không phải là một cái gì đó để ghi nhớ. 370 00:22:23,340 --> 00:22:25,710 Nhưng nếu bạn nghĩ rằng biểu đồ ASCII lớn chúng tôi đã có tuần trước, 371 00:22:25,710 --> 00:22:30,600 trong trường hợp đó 128 hoặc 256 ký tự ASCII. 372 00:22:30,600 --> 00:22:32,940 Chúng tôi sử dụng tất cả các mẫu lên 0 và 1. 373 00:22:32,940 --> 00:22:36,210 Đó là một vấn đề nếu bạn muốn để có thể phát hiện một lỗi 374 00:22:36,210 --> 00:22:40,190 bởi vì nếu bạn đã sử dụng 256 giá trị cho nhân vật của bạn, 375 00:22:40,190 --> 00:22:43,050 bạn đã không thực sự lập kế hoạch trước bởi vì bây giờ bạn không có cách nói, 376 00:22:43,050 --> 00:22:46,270 đây không phải là một nhân vật VN, đây là một số thông báo sai lầm. 377 00:22:46,270 --> 00:22:50,270 Vì vậy, những gì thế giới là họ sử dụng giá trị lớn nhất tiếp theo, một cái gì đó giống như một int, 378 00:22:50,270 --> 00:22:54,720 để bạn có một số điên bit, 32, 4 tỷ giá trị có thể 379 00:22:54,720 --> 00:22:58,860 vì vậy bạn chỉ có thể kết thúc bằng cách sử dụng cơ bản 257 của họ, 380 00:22:58,860 --> 00:23:01,720 1 trong tổng số đó có một số ý nghĩa đặc biệt như là một lỗi. 381 00:23:01,720 --> 00:23:03,120 >> Vì vậy, chúng ta hãy xem cách làm việc này. 382 00:23:03,120 --> 00:23:07,760 Trong dòng 246, tôi có vòng lặp trong khi lớn này được gọi fgetc, 383 00:23:07,760 --> 00:23:11,090 f có nghĩa là tập tin, vì vậy getc, và sau đó stdin. 384 00:23:11,090 --> 00:23:15,520 Hóa ra đây chỉ là cách chính xác hơn nói đọc dữ liệu vào từ bàn phím. 385 00:23:15,520 --> 00:23:19,300 Phương tiện đầu vào bàn phím tiêu chuẩn, tiêu chuẩn đầu ra có nghĩa là màn hình, 386 00:23:19,300 --> 00:23:23,310 và tiêu chuẩn lỗi, mà chúng ta sẽ thấy trong pset4, có nghĩa là màn hình 387 00:23:23,310 --> 00:23:27,490 nhưng một phần đặc biệt của màn hình để nó không conflated với sản lượng thực tế 388 00:23:27,490 --> 00:23:30,750 mà bạn dự định in. Nhưng thêm vào đó trong tương lai. 389 00:23:30,750 --> 00:23:34,440 Vì vậy, fgetc chỉ có nghĩa là đọc một ký tự từ bàn phím và lưu nó ở đâu? 390 00:23:34,440 --> 00:23:37,350 Lưu trữ nó trong c. 391 00:23:37,350 --> 00:23:41,360 Và sau đó kiểm tra - vì vậy tôi chỉ sử dụng một số liên từ Boolean - 392 00:23:41,360 --> 00:23:46,000 kiểm tra xem nó không bằng \ n, do đó, người dùng đã nhấn Enter, chúng tôi muốn dừng lại tại thời điểm đó, 393 00:23:46,000 --> 00:23:49,850 kết thúc vòng lặp và chúng tôi cũng muốn kiểm tra cho EOF hằng số đặc biệt, 394 00:23:49,850 --> 00:23:53,610 nếu bạn biết hoặc đoán, những gì đứng cho? >> [Sinh viên] End of file. Cuối >> của tập tin. 395 00:23:53,610 --> 00:23:56,560 Đây là loại vô nghĩa bởi vì nếu tôi gõ vào bàn phím, 396 00:23:56,560 --> 00:23:58,870 có thực sự không có tập tin liên quan đến điều này, 397 00:23:58,870 --> 00:24:01,150 nhưng điều này chỉ là sắp xếp của thuật ngữ chung được sử dụng để có nghĩa là 398 00:24:01,150 --> 00:24:04,220 rằng không có gì khác là đến từ các ngón tay của con người. 399 00:24:04,220 --> 00:24:06,460 EOF - cuối của tập tin. 400 00:24:06,460 --> 00:24:09,920 Là một sang một bên, nếu bạn đã từng nhấn Control D vào bàn phím của bạn, không phải là bạn sẽ có được nêu ra - 401 00:24:09,920 --> 00:24:15,230 bạn đã nhấn Control C - Control D gửi hằng số đặc biệt này được gọi là EOF. 402 00:24:15,230 --> 00:24:19,850 Vì vậy, bây giờ chúng tôi chỉ có một số cấp phát bộ nhớ động. 403 00:24:19,850 --> 00:24:23,440 >> Vì vậy, nếu (n + 1> công suất). Bây giờ tôi sẽ giải thích n. 404 00:24:23,440 --> 00:24:26,100 N chỉ là bao nhiêu byte hiện trong bộ đệm, 405 00:24:26,100 --> 00:24:28,620 chuỗi mà bạn đang xây dựng từ người sử dụng. 406 00:24:28,620 --> 00:24:33,450 Nếu bạn có thêm nhiều nhân vật trong bộ đệm của bạn hơn bạn có năng lực trong bộ đệm, 407 00:24:33,450 --> 00:24:37,410 trực giác những gì chúng tôi cần làm sau đó được phân bổ nhiều dung lượng hơn. 408 00:24:37,410 --> 00:24:43,330 Vì vậy, tôi sẽ lướt qua một số của số học ở đây và chỉ tập trung vào chức năng này ở đây. 409 00:24:43,330 --> 00:24:46,070 Bạn biết những gì malloc hoặc ít nhất là nói chung quen thuộc. 410 00:24:46,070 --> 00:24:48,970 Hãy đoán những gì realloc không. >> [Sinh viên] Thêm bộ nhớ. 411 00:24:48,970 --> 00:24:52,920 Nó không khá thêm bộ nhớ. Nó reallocates bộ nhớ như sau. 412 00:24:52,920 --> 00:24:57,220 Nếu vẫn còn có phòng ở cuối của chuỗi cung cấp cho bạn nhiều hơn của bộ nhớ mà 413 00:24:57,220 --> 00:25:00,000 hơn so với ban đầu cung cấp cho bạn, sau đó bạn sẽ nhận được rằng bộ nhớ bổ sung. 414 00:25:00,000 --> 00:25:03,460 Vì vậy, bạn chỉ có thể tiếp tục đưa nhân vật của chuỗi trở lại trở lại để sao lưu để sao lưu. 415 00:25:03,460 --> 00:25:05,830 Nhưng nếu đó không phải là trường hợp bởi vì bạn chờ đợi quá lâu 416 00:25:05,830 --> 00:25:07,940 và một cái gì đó ngẫu nhiên đã ngồi phịch trong bộ nhớ 417 00:25:07,940 --> 00:25:10,290 nhưng có thêm bộ nhớ xuống đây, đó là okay. 418 00:25:10,290 --> 00:25:13,100 Realloc sẽ làm tất cả những nâng nặng cho bạn, 419 00:25:13,100 --> 00:25:16,750 di chuyển các chuỗi bạn đã đọc vậy, đến nay ở đây, đặt nó xuống đó, 420 00:25:16,750 --> 00:25:19,460 và sau đó cung cấp cho bạn đường băng tại điểm đó một số chi tiết. 421 00:25:19,460 --> 00:25:22,550 >> Vì vậy, với một làn sóng của bàn tay, cho tôi nói rằng những gì GetString đang làm 422 00:25:22,550 --> 00:25:26,330 là nó bắt đầu với một bộ đệm nhỏ, có thể là một nhân vật duy nhất, 423 00:25:26,330 --> 00:25:30,820 và nếu người sử dụng các loại trong hai nhân vật, GetString kết thúc lên gọi realloc và nói 424 00:25:30,820 --> 00:25:33,150 một trong những nhân vật là không đủ, cho tôi hai nhân vật. 425 00:25:33,150 --> 00:25:35,950 Sau đó, nếu bạn đọc thông qua logic của vòng lặp, nó sẽ nói 426 00:25:35,950 --> 00:25:39,600 người sử dụng gõ vào 3 ký tự; cho tôi bây giờ không 2 nhưng 4 ký tự, 427 00:25:39,600 --> 00:25:42,320 sau đó cung cấp cho tôi 8, sau đó đưa cho tôi 16 và 32. 428 00:25:42,320 --> 00:25:45,000 Thực tế là tôi đang tăng gấp đôi công suất mỗi lần 429 00:25:45,000 --> 00:25:48,570 có nghĩa là các bộ đệm sẽ không phát triển chậm, nó sẽ phát triển cực nhanh. 430 00:25:48,570 --> 00:25:51,380 Và những gì có thể lợi dụng điều đó? 431 00:25:51,380 --> 00:25:54,600 Tại sao tôi tăng gấp đôi kích thước của bộ đệm 432 00:25:54,600 --> 00:25:58,020 cho dù người dùng chỉ có thể cần thêm một ký tự từ bàn phím? 433 00:25:58,020 --> 00:26:01,750 [Sinh viên phản ứng không nghe được] >> đó là gì? >> [Sinh viên] Bạn không cần phải phát triển nó thường xuyên. 434 00:26:01,750 --> 00:26:03,300 Chính xác. Bạn không cần phải phát triển nó thường xuyên. 435 00:26:03,300 --> 00:26:05,510 Và đây chỉ là loại bạn đang bảo hiểm rủi ro cược của bạn ở đây, 436 00:26:05,510 --> 00:26:10,850 Ý tưởng được rằng bạn không muốn gọi realloc rất nhiều bởi vì nó có xu hướng được làm chậm. 437 00:26:10,850 --> 00:26:12,910 Bất cứ lúc nào bạn yêu cầu hệ thống hoạt động cho bộ nhớ, 438 00:26:12,910 --> 00:26:16,990 như bạn sẽ thấy trong một loạt vấn đề trong tương lai, nó có xu hướng mất một thời gian. 439 00:26:16,990 --> 00:26:20,010 Vì vậy, giảm thiểu số tiền đó của thời gian, ngay cả khi bạn đang lãng phí một số không gian, 440 00:26:20,010 --> 00:26:21,900 có xu hướng là một điều tốt. 441 00:26:21,900 --> 00:26:24,060 >> Nhưng nếu chúng ta đọc qua phần cuối cùng của getString đây - 442 00:26:24,060 --> 00:26:27,950 và một lần nữa sự hiểu biết tất cả các dòng duy nhất ở đây không phải là quá quan trọng ngày hôm nay - 443 00:26:27,950 --> 00:26:30,530 nhận thấy rằng nó cuối cùng một lần nữa gọi malloc 444 00:26:30,530 --> 00:26:33,880 và phân bổ chính xác như nhiều byte như nó cần cho chuỗi 445 00:26:33,880 --> 00:26:38,060 và sau đó ném đi bằng cách gọi điện thoại miễn phí các bộ đệm quá lớn 446 00:26:38,060 --> 00:26:40,080 nếu nó thực sự đã tăng gấp đôi quá nhiều lần. 447 00:26:40,080 --> 00:26:42,730 Vì vậy, trong ngắn hạn, đó là cách GetString đã được làm việc tất cả thời gian. 448 00:26:42,730 --> 00:26:47,060 Tất cả nó là đọc một ký tự tại một thời điểm một lần nữa và một lần nữa và một lần nữa, 449 00:26:47,060 --> 00:26:50,750 và mỗi khi nó cần một số bộ nhớ bổ sung, nó yêu cầu hệ điều hành cho nó 450 00:26:50,750 --> 00:26:53,670 bằng cách gọi realloc. 451 00:26:53,670 --> 00:26:57,890 >> Bất kỳ câu hỏi nào? Được rồi. 452 00:26:57,890 --> 00:26:59,270 >> Một cuộc tấn công. 453 00:26:59,270 --> 00:27:04,060 Bây giờ chúng ta hiểu con trỏ hoặc ít nhất đang ngày càng quen thuộc với con trỏ, 454 00:27:04,060 --> 00:27:06,700 chúng ta hãy xem xét làm thế nào trên toàn thế giới bắt đầu sụp đổ 455 00:27:06,700 --> 00:27:10,030 nếu bạn không hoàn toàn bảo vệ chống lại người dùng đối lập, 456 00:27:10,030 --> 00:27:11,850 những người đang cố gắng để hack vào hệ thống của bạn, 457 00:27:11,850 --> 00:27:16,890 những người đang cố gắng để ăn cắp phần mềm của bạn bằng cách phá vỡ một số mã đăng ký 458 00:27:16,890 --> 00:27:19,090 rằng họ nếu không có thể phải gõ vào 459 00:27:19,090 --> 00:27:22,990 >> Hãy xem ví dụ này ở đây, mà chỉ là mã C mà có một chức năng chính ở phía dưới 460 00:27:22,990 --> 00:27:26,380 mà các cuộc gọi một foo chức năng. Và đó là những gì đi qua để foo? 461 00:27:26,380 --> 00:27:29,680 [Sinh viên] đối số duy nhất. >> [Malan] đối số duy nhất. 462 00:27:29,680 --> 00:27:33,450 Vì vậy, argv [1], có nghĩa là từ đầu tiên mà người dùng gõ vào dòng lệnh 463 00:27:33,450 --> 00:27:36,360 sau khi a.out hoặc bất cứ điều gì chương trình được gọi. 464 00:27:36,360 --> 00:27:41,680 Vì vậy, foo ở đầu trang có một char *. Nhưng char * chỉ là những gì? >> [Sinh viên] Một chuỗi. 465 00:27:41,680 --> 00:27:43,350 [Malan] Một chuỗi, do đó, không có gì mới ở đây. 466 00:27:43,350 --> 00:27:45,420 Đó là chuỗi tùy tiện được gọi là bar. 467 00:27:45,420 --> 00:27:51,430 Trong dòng này ở đây, char c [12]; loại bán kỹ thuật, dòng này là làm gì? 468 00:27:51,430 --> 00:27:55,220 [Sinh viên] Một mảng - >> Array of? >> [Sinh viên] Tính cách. >> Tính cách. 469 00:27:55,220 --> 00:27:58,870 Hãy cho tôi một mảng 12 ký tự. Vì vậy, chúng ta có thể gọi đây là một bộ đệm. 470 00:27:58,870 --> 00:28:02,920 Nó được gọi là kỹ thuật c, nhưng một bộ đệm trong chương trình chỉ có nghĩa là một loạt các không gian 471 00:28:02,920 --> 00:28:04,800 rằng bạn có thể đặt một số công cụ. 472 00:28:04,800 --> 00:28:07,940 Sau đó, cuối cùng, memcpy chúng tôi đã không được sử dụng trước đây, nhưng bạn có thể đoán những gì nó làm. 473 00:28:07,940 --> 00:28:10,480 Nó sao chép bộ nhớ. Làm gì? 474 00:28:10,480 --> 00:28:19,270 Nó dường như bản sao thanh, đầu vào của nó, vào c nhưng chỉ lên đến chiều dài của thanh. 475 00:28:19,270 --> 00:28:24,930 Nhưng có một lỗi ở đây. >> [Sinh viên] Bạn cần nhân vật sizeof. >> Okay. 476 00:28:24,930 --> 00:28:30,860 Về mặt kỹ thuật, chúng tôi thực sự cần phải làm strlen (bar) * sizeof (char)). Đó là chính xác. 477 00:28:30,860 --> 00:28:33,930 Nhưng trong trường hợp xấu nhất ở đây, chúng ta hãy giả định rằng Đó - 478 00:28:33,930 --> 00:28:35,950 Okay. Sau đó có hai lỗi. 479 00:28:35,950 --> 00:28:39,160 Vì vậy, sizeof (char)); 480 00:28:39,160 --> 00:28:41,290 Hãy để thực hiện điều này rộng hơn một chút. 481 00:28:41,290 --> 00:28:44,910 Vì vậy, bây giờ vẫn còn một lỗi, đó là những gì? >> [Không nghe được sinh viên phản ứng] 482 00:28:44,910 --> 00:28:46,990 Kiểm tra cho những gì? >> [Sinh viên] Kiểm tra NULL. 483 00:28:46,990 --> 00:28:50,270 Chúng tôi nói chung nên được kiểm tra NULL vì điều xấu xảy ra 484 00:28:50,270 --> 00:28:53,200 khi con trỏ của bạn là NULL bởi vì bạn có thể kết thúc đến đó, 485 00:28:53,200 --> 00:28:57,630 và bạn sẽ không bao giờ được NULL bởi dereferencing nó với các nhà điều hành sao. 486 00:28:57,630 --> 00:29:01,050 Vì vậy, đó là tốt. Và những gì khác chúng ta đang làm gì? Logic, có một lỗ hổng ở đây quá. 487 00:29:01,050 --> 00:29:04,450 [Sinh viên] Kiểm tra nếu argc là> = 2. 488 00:29:04,450 --> 00:29:10,550 Vì vậy, kiểm tra nếu argc là> = 2. Được rồi, do đó, có ba lỗi trong chương trình này ở đây. 489 00:29:10,550 --> 00:29:16,630 Bây giờ chúng tôi đang kiểm tra nếu người sử dụng thực sự gõ vào bất cứ điều gì vào argv [1]. Tốt. 490 00:29:16,630 --> 00:29:20,950 Vì vậy, các lỗi thứ ba là những gì? Yeah. >> [Sinh viên] C có thể không đủ lớn. 491 00:29:20,950 --> 00:29:23,320 Tốt. Chúng tôi đã kiểm tra một kịch bản. 492 00:29:23,320 --> 00:29:29,520 Chúng tôi ngầm kiểm tra không sao chép bộ nhớ nhiều hơn sẽ vượt quá chiều dài của thanh. 493 00:29:29,520 --> 00:29:32,510 Vì vậy, nếu các chuỗi người dùng gõ dài là 10 ký tự, 494 00:29:32,510 --> 00:29:36,020 điều này được nói chỉ sao chép 10 ký tự. Và đó là okay. 495 00:29:36,020 --> 00:29:39,940 Nhưng nếu những gì người dùng gõ vào một từ tại dấu nhắc như một từ 20-ký tự? 496 00:29:39,940 --> 00:29:44,900 Điều này nói sao chép 20 ký tự từ thanh vào những gì? 497 00:29:44,900 --> 00:29:49,750 C, nếu không được biết đến như một bộ đệm của chúng tôi, có nghĩa là bạn chỉ cần viết dữ liệu 498 00:29:49,750 --> 00:29:52,540 8 địa điểm byte mà bạn không sở hữu, 499 00:29:52,540 --> 00:29:54,870 và bạn không sở hữu chúng trong ý nghĩa rằng bạn không bao giờ được giao cho họ. 500 00:29:54,870 --> 00:30:00,370 Vì vậy, đây là những gì thường được gọi là cuộc tấn công tràn bộ đệm hoặc tấn công tràn bộ đệm. 501 00:30:00,370 --> 00:30:05,580 Và đó là một cuộc tấn công trong ý nghĩa rằng nếu người dùng hoặc chương trình đó là chức năng gọi điện thoại của bạn 502 00:30:05,580 --> 00:30:10,490 là làm điều này độc hại, những gì thực sự xảy ra tiếp theo thực sự có thể là khá xấu. 503 00:30:10,490 --> 00:30:12,450 >> Vì vậy, chúng ta hãy nhìn vào bức tranh này ở đây. 504 00:30:12,450 --> 00:30:16,060 Bức ảnh này đại diện cho ngăn xếp của bạn bộ nhớ. 505 00:30:16,060 --> 00:30:19,580 Nhớ lại rằng mỗi khi bạn gọi một chức năng, bạn sẽ có được khung nhỏ trên stack 506 00:30:19,580 --> 00:30:21,520 và sau đó một và sau đó một khác. 507 00:30:21,520 --> 00:30:24,300 Cho đến nay, chúng tôi đã chỉ cần loại trừu tượng này như hình chữ nhật 508 00:30:24,300 --> 00:30:26,290 hoặc trên bảng hoặc trên màn hình ở đây. 509 00:30:26,290 --> 00:30:30,580 Nhưng nếu chúng ta phóng to trên một trong những hình chữ nhật đó, khi bạn gọi một foo chức năng, 510 00:30:30,580 --> 00:30:35,880 nó quay ra rằng có nhiều ở bên trong ngăn xếp của khung đó trong hình chữ nhật đó 511 00:30:35,880 --> 00:30:40,060 hơn chỉ x và y và a và b, như chúng tôi đã nói về trao đổi. 512 00:30:40,060 --> 00:30:44,410 Nó chỉ ra rằng có một số chi tiết cấp thấp hơn, trong số đó trở về địa chỉ. 513 00:30:44,410 --> 00:30:49,550 Vì vậy, nó quay ra khi chính gọi foo, chính có thông báo foo 514 00:30:49,550 --> 00:30:53,520 địa chỉ chính là trong bộ nhớ của máy tính 515 00:30:53,520 --> 00:30:57,770 bởi vì nếu không, ngay như foo được thực hiện thực hiện, như trong trường hợp này đây, 516 00:30:57,770 --> 00:31:00,830 một khi bạn đạt được cú đúp đóng xoăn ở phần cuối của foo, 517 00:31:00,830 --> 00:31:05,310 làm thế nào heck foo biết nơi mà sự kiểm soát của chương trình là vụ phải đi? 518 00:31:05,310 --> 00:31:08,970 Nó chỉ ra rằng câu trả lời cho câu hỏi đó là trong hình chữ nhật màu đỏ ở đây. 519 00:31:08,970 --> 00:31:12,670 Điều này thể hiện một con trỏ, và nó vào máy tính để lưu trữ tạm thời 520 00:31:12,670 --> 00:31:17,030 trên stack được gọi là địa chỉ của chính vì vậy mà ngay sau khi foo được thực hiện thực hiện, 521 00:31:17,030 --> 00:31:21,120 máy tính biết đâu và những gì dòng chính để trở lại. 522 00:31:21,120 --> 00:31:23,940 Con trỏ Khung hình lưu liên quan tương tự như này. 523 00:31:23,940 --> 00:31:26,310 Char * bar ở đây đại diện cho những gì? 524 00:31:26,310 --> 00:31:31,350 Bây giờ phân khúc này màu xanh ở đây là của khung foo. Thanh là gì? 525 00:31:31,570 --> 00:31:35,010 Bar chỉ là đối số cho foo chức năng. 526 00:31:35,010 --> 00:31:37,500 Vì vậy, bây giờ chúng tôi đang trở lại sắp xếp của các hình ảnh quen thuộc. 527 00:31:37,500 --> 00:31:39,850 Có nhiều công cụ và phiền nhiễu nhiều hơn trên màn hình, 528 00:31:39,850 --> 00:31:43,380 nhưng phân khúc này ánh sáng màu xanh chỉ là những gì chúng tôi đã được vẽ lên bảng 529 00:31:43,380 --> 00:31:45,790 cho một cái gì đó như trao đổi. Đó là khung cho foo. 530 00:31:45,790 --> 00:31:51,490 Và điều duy nhất trong đó ngay bây giờ là bar, đó là tham số này. 531 00:31:51,490 --> 00:31:55,220 Nhưng những gì khác phải ở trong ngăn xếp theo mã này ở đây? 532 00:31:55,220 --> 00:31:57,760 [Sinh viên] char c [12]. >> [Malan] char c [12]. 533 00:31:57,760 --> 00:32:02,810 Chúng ta cũng nên xem 12 hình vuông của cấp phát bộ nhớ cho một biến được gọi là c, 534 00:32:02,810 --> 00:32:04,970 và thực sự chúng tôi có trên màn hình. 535 00:32:04,970 --> 00:32:08,480 Đầu rất có c [0], và sau đó là tác giả của sơ đồ này 536 00:32:08,480 --> 00:32:11,850 không bận tâm vẽ tất cả các hình vuông, nhưng có thực sự 12 có 537 00:32:11,850 --> 00:32:16,590 bởi vì nếu bạn nhìn vào góc dưới bên phải, c [11] nếu bạn đếm từ 0 byte như vậy 12. 538 00:32:16,590 --> 00:32:18,400 Nhưng đây là vấn đề. 539 00:32:18,400 --> 00:32:22,390 Trong đó hướng c ngày càng tăng? 540 00:32:22,390 --> 00:32:27,080 Sắp xếp các từ trên xuống nếu nó bắt đầu ở đầu trang và phát triển xuống dưới. 541 00:32:27,080 --> 00:32:30,110 Nó không giống như chúng tôi rời bản thân đường băng nhiều ở đây cả. 542 00:32:30,110 --> 00:32:32,090 Chúng tôi đã loại sơn mình vào một góc, 543 00:32:32,090 --> 00:32:36,940 và c [11] là phải lên chống lại bar, mà là phải lên chống lại con trỏ Khung hình lưu, 544 00:32:36,940 --> 00:32:39,960 đó là phải lên chống lại Quay lại Địa chỉ. Có không còn chỗ. 545 00:32:39,960 --> 00:32:42,810 Vì vậy, ý nghĩa của những gì sau đó nếu bạn vít lên 546 00:32:42,810 --> 00:32:46,500 và bạn cố gắng đọc 20 byte vào một bộ đệm 12-byte? 547 00:32:46,500 --> 00:32:50,060 Đâu những 8 byte bổ sung sẽ đi đâu? >> [Sinh viên] Inside - 548 00:32:50,060 --> 00:32:53,200 Bên trong mọi thứ khác, một số trong đó là siêu quan trọng. 549 00:32:53,200 --> 00:32:57,260 Và điều quan trọng nhất, có khả năng, là hộp màu đỏ ở đó, trở về địa chỉ, 550 00:32:57,260 --> 00:33:03,560 vì giả sử rằng bạn có vô tình hoặc adversarially ghi đè lên những 4 byte, 551 00:33:03,560 --> 00:33:07,260 địa chỉ con trỏ, không chỉ với rác nhưng với một số 552 00:33:07,260 --> 00:33:09,810 điều đó xảy ra để đại diện cho một địa chỉ thực trong bộ nhớ. 553 00:33:09,810 --> 00:33:13,880 Ý nghĩa là gì, một cách logic không? >> [Sinh viên] Chức năng sẽ trở về một nơi khác. 554 00:33:13,880 --> 00:33:15,250 Chính xác. 555 00:33:15,250 --> 00:33:19,170 Khi foo trả về và số truy cập mà xoăn cú đúp, chương trình sẽ tiến hành 556 00:33:19,170 --> 00:33:25,060 không quay trở lại, nó sẽ quay trở lại bất cứ địa chỉ trong hộp màu đỏ. 557 00:33:25,060 --> 00:33:28,600 >> Trong trường hợp đăng ký phần mềm phá vỡ, 558 00:33:28,600 --> 00:33:32,260 những gì nếu các địa chỉ đó là được trở lại là chức năng bình thường được gọi là 559 00:33:32,260 --> 00:33:35,690 sau khi bạn đã trả tiền cho phần mềm và inputted mã đăng ký của bạn? 560 00:33:35,690 --> 00:33:39,870 Bạn có thể sắp xếp lừa máy tính vào sẽ không ở đây nhưng thay vì đi lên. 561 00:33:39,870 --> 00:33:45,100 Hoặc nếu bạn thực sự thông minh, một đối thủ thực sự có thể gõ vào bàn phím, ví dụ, 562 00:33:45,100 --> 00:33:50,690 không phải là một từ thực tế, không phải là 20 ký tự, nhưng giả sử họ thực sự loại trong 563 00:33:50,690 --> 00:33:52,770 một số ký tự đại diện cho mã. 564 00:33:52,770 --> 00:33:55,320 Và nó sẽ không phải là mã C, nó thực sự sẽ là ký tự 565 00:33:55,320 --> 00:33:59,290 đại diện cho các mã máy nhị phân 0 và 1. 566 00:33:59,290 --> 00:34:01,290 Nhưng giả sử họ đủ thông minh để làm điều đó, 567 00:34:01,290 --> 00:34:06,500 bằng cách nào đó dán vào một cái gì đó nhanh chóng GetString đó là cơ bản biên dịch mã, 568 00:34:06,500 --> 00:34:09,980 và 4 byte cuối cùng ghi đè lên địa chỉ trả lại. 569 00:34:09,980 --> 00:34:13,360 Và những gì địa chỉ nào mà đầu vào làm gì? 570 00:34:13,360 --> 00:34:18,630 Nó thực sự lưu trữ trong địa chỉ của byte đầu tiên của bộ đệm hình chữ nhật màu đỏ. 571 00:34:18,630 --> 00:34:23,070 Vì vậy, bạn phải thực sự thông minh, và điều này là rất nhiều thử và sai cho những người xấu ra khỏi đó, 572 00:34:23,070 --> 00:34:25,639 nhưng nếu bạn có thể tìm ra bộ đệm này lớn như thế nào 573 00:34:25,639 --> 00:34:28,820 như vậy mà các byte cuối cùng trong đầu vào bạn cung cấp cho chương trình 574 00:34:28,820 --> 00:34:33,540 xảy ra được tương đương với địa chỉ bắt đầu của bộ đệm của bạn, bạn có thể làm điều này. 575 00:34:33,540 --> 00:34:39,320 Nếu chúng ta nói bình thường chào hỏi nhau và \ 0, đó là những gì kết thúc trong bộ đệm. 576 00:34:39,320 --> 00:34:44,420 Nhưng nếu chúng ta thông minh hơn và chúng tôi điền vào đó bộ đệm với những gì chúng ta tổng quát sẽ gọi mã tấn công - 577 00:34:44,420 --> 00:34:48,860 AAA, tấn công, tấn công, tấn công - nơi đây chỉ là một cái gì đó mà làm một cái gì đó xấu, 578 00:34:48,860 --> 00:34:51,820 những gì sẽ xảy ra nếu bạn thực sự thông minh, bạn có thể làm điều này. 579 00:34:51,820 --> 00:34:58,610 Trong hộp màu đỏ ở đây là một dãy số - 80, C0, 35, 08. 580 00:34:58,610 --> 00:35:01,610 Chú ý rằng đó phù hợp với số ở đây. 581 00:35:01,610 --> 00:35:04,430 Đó là theo thứ tự ngược, nhưng thêm vào một số thời gian mà các. 582 00:35:04,430 --> 00:35:08,140 Chú ý rằng địa chỉ này trở lại đã được cố tình thay đổi 583 00:35:08,140 --> 00:35:12,020 bằng địa chỉ lên đây, không phải là địa chỉ chính. 584 00:35:12,020 --> 00:35:17,500 Vì vậy, nếu kẻ xấu là siêu thông minh, anh ta hoặc cô ấy sẽ bao gồm trong đó mã tấn công 585 00:35:17,500 --> 00:35:20,930 một cái gì đó như xóa tất cả các tập tin của người sử dụng hoặc sao chép các mật khẩu 586 00:35:20,930 --> 00:35:24,680 hoặc tạo ra một tài khoản người dùng mà tôi sau đó có thể đăng nhập vào bất cứ điều gì ở tất cả. 587 00:35:24,680 --> 00:35:26,950 >> Và điều này là nguy hiểm và quyền lực của C. 588 00:35:26,950 --> 00:35:29,840 Bởi vì bạn có thể truy cập vào bộ nhớ thông qua con trỏ 589 00:35:29,840 --> 00:35:32,520 và do đó bạn có thể viết bất cứ điều gì bạn muốn vào bộ nhớ của máy tính, 590 00:35:32,520 --> 00:35:35,080 bạn có thể làm cho một máy tính làm bất cứ điều gì bạn muốn 591 00:35:35,080 --> 00:35:39,550 chỉ đơn giản bằng khi nó nhảy xung quanh trong không gian bộ nhớ riêng của mình. 592 00:35:39,550 --> 00:35:44,650 Và như vậy cho đến ngày nay rất nhiều chương trình và rất nhiều trang web đang bị tổn hại 593 00:35:44,650 --> 00:35:46,200 đun sôi xuống để những người lợi dụng điều này. 594 00:35:46,200 --> 00:35:50,760 Và điều này có thể có vẻ giống như một siêu tấn công tinh vi, nhưng nó không luôn luôn bắt đầu theo cách đó. 595 00:35:50,760 --> 00:35:53,560 Thực tế là những gì người xấu thường sẽ làm, 596 00:35:53,560 --> 00:35:58,200 cho dù đó là một chương trình tại một dòng lệnh hoặc một chương trình GUI hoặc một trang web, 597 00:35:58,200 --> 00:35:59,940 bạn chỉ cần bắt đầu cung cấp vô nghĩa. 598 00:35:59,940 --> 00:36:03,980 Bạn gõ vào một từ thực sự lớn vào lĩnh vực tìm kiếm và nhấn Enter, 599 00:36:03,980 --> 00:36:05,780 và bạn chờ đợi để xem nếu trang web bị treo 600 00:36:05,780 --> 00:36:09,990 hoặc bạn chờ đợi để xem chương trình thể hiện một số thông báo lỗi 601 00:36:09,990 --> 00:36:14,330 bởi vì nếu bạn nhận được may mắn như kẻ xấu và bạn cung cấp một số đầu vào điên 602 00:36:14,330 --> 00:36:18,980 mà treo chương trình, điều đó có nghĩa là các lập trình viên đã không dự đoán hành vi xấu của bạn, 603 00:36:18,980 --> 00:36:23,630 có nghĩa là bạn có thể có thể là đủ với nỗ lực, dùng thử đủ và lỗi, 604 00:36:23,630 --> 00:36:26,650 tìm ra cách để tiến hành một cuộc tấn công chính xác hơn. 605 00:36:26,650 --> 00:36:31,410 Vì vậy, nhiều một phần của an ninh không chỉ là tránh các cuộc tấn công hoàn toàn 606 00:36:31,410 --> 00:36:34,100 nhưng phát hiện chúng và thực sự nhìn vào các bản ghi 607 00:36:34,100 --> 00:36:36,780 và nhìn thấy những gì các yếu tố đầu vào điên có người gõ vào trang web của bạn, 608 00:36:36,780 --> 00:36:38,960 những thuật ngữ tìm kiếm có người gõ vào trang web của bạn 609 00:36:38,960 --> 00:36:42,870 với hy vọng tràn một số bộ đệm. 610 00:36:42,870 --> 00:36:45,500 Và tất cả điều này nắm những điều cơ bản đơn giản của những gì là một mảng 611 00:36:45,500 --> 00:36:49,080 và nó có ý nghĩa gì để phân bổ và sử dụng bộ nhớ. 612 00:36:49,080 --> 00:36:51,710 >> Liên quan đến mà sau đó cũng là. 613 00:36:51,710 --> 00:36:54,280 Hãy chỉ lướt qua bên trong của một ổ đĩa cứng một lần nữa. 614 00:36:54,280 --> 00:36:58,440 Bạn nhớ lại từ một hoặc hai tuần trước khi bạn kéo các tập tin vào thùng rác hoặc thùng rác, 615 00:36:58,440 --> 00:37:03,710 những gì sẽ xảy ra? >> [Sinh viên] Không có gì. >> Tuyệt đối không có gì, phải không? 616 00:37:03,710 --> 00:37:05,740 Cuối cùng, nếu bạn chạy thấp trên không gian đĩa, 617 00:37:05,740 --> 00:37:08,190 Windows hay Mac OS sẽ bắt đầu xóa các tập tin cho bạn. 618 00:37:08,190 --> 00:37:10,390 Nhưng nếu bạn kéo một cái gì đó trong đó, đó không phải là an toàn ở tất cả. 619 00:37:10,390 --> 00:37:13,800 Tất cả bạn cùng phòng của bạn hoặc bạn bè hoặc thành viên gia đình đã làm được nhấp đúp chuột vào và thì đấy, 620 00:37:13,800 --> 00:37:16,310 có tất cả các tập tin sơ sài mà bạn cố gắng để xóa. 621 00:37:16,310 --> 00:37:19,590 Hầu hết chúng ta ít nhất biết rằng bạn phải click chuột phải hoặc Kiểm soát nhấp chuột 622 00:37:19,590 --> 00:37:22,310 và trống rỗng thùng rác hoặc một cái gì đó như thế. 623 00:37:22,310 --> 00:37:25,000 Nhưng thậm chí sau đó mà không hoàn toàn làm các trick 624 00:37:25,000 --> 00:37:28,010 bởi vì những gì sẽ xảy ra khi bạn có một tập tin trên ổ cứng của bạn 625 00:37:28,010 --> 00:37:32,770 đại diện cho một số tài liệu Word hoặc một số JPEG, và điều này đại diện cho ổ đĩa cứng của bạn, 626 00:37:32,770 --> 00:37:35,350 và chúng ta hãy nói này mảnh ở đây đại diện cho tập tin đó, 627 00:37:35,350 --> 00:37:38,390 và nó bao gồm một bó toàn bộ 0 và 1. 628 00:37:38,390 --> 00:37:42,470 Điều gì sẽ xảy ra khi bạn không chỉ kéo tập tin đó vào thùng rác hoặc có thể tái chế bin 629 00:37:42,470 --> 00:37:48,020 nhưng cũng có sản phẩm nào đó? Sắp xếp không có gì. 630 00:37:48,020 --> 00:37:49,640 Nó không phải hoàn toàn không có gì. 631 00:37:49,640 --> 00:37:54,290 Bây giờ nó chỉ là không có gì bởi vì một chút gì đó xảy ra trong các hình thức của bảng này. 632 00:37:54,290 --> 00:37:58,370 Vì vậy, có một số loại cơ sở dữ liệu hoặc bảng bên trong bộ nhớ của máy vi tính 633 00:37:58,370 --> 00:38:03,850 mà về cơ bản có một cột cho tên file và một cho các tập tin 'vị trí cột, 634 00:38:03,850 --> 00:38:07,720 nơi này có thể là vị trí 123, chỉ cần một số ngẫu nhiên. 635 00:38:07,720 --> 00:38:14,560 Vì vậy, chúng ta có thể có một cái gì đó như x.jpeg và vị trí 123. 636 00:38:14,560 --> 00:38:18,800 Điều gì sẽ xảy ra sau đó khi bạn thực sự trống thùng rác của bạn? 637 00:38:18,800 --> 00:38:20,330 Mà đi xa. 638 00:38:20,330 --> 00:38:23,610 Nhưng những gì không đi là 0 và 1. 639 00:38:23,610 --> 00:38:26,270 >> Vì vậy, những gì sau đó kết nối để pset4? 640 00:38:26,270 --> 00:38:31,240 Vâng, với pset4, chỉ vì chúng tôi đã vô tình xóa thẻ flash nhỏ gọn 641 00:38:31,240 --> 00:38:35,750 đã có tất cả các hình ảnh hay vì họ không may mắn trở thành hỏng 642 00:38:35,750 --> 00:38:38,000 không có nghĩa là 0 và số 1 không phải là vẫn còn đó. 643 00:38:38,000 --> 00:38:40,410 Có lẽ một vài trong số họ bị mất vì một cái gì đó đã bị hỏng 644 00:38:40,410 --> 00:38:43,320 trong ý nghĩa rằng một số số 0 trở thành số 1 và số 1 trở thành số 0. 645 00:38:43,320 --> 00:38:47,240 Những điều xấu có thể xảy ra do lỗi của phần mềm hay phần cứng bị lỗi. 646 00:38:47,240 --> 00:38:50,370 Nhưng nhiều người trong số những bit, có thể thậm chí 100% trong số họ, vẫn còn đó. 647 00:38:50,370 --> 00:38:55,050 Nó chỉ là máy tính hoặc máy ảnh không biết nơi JPEG1 bắt đầu 648 00:38:55,050 --> 00:38:56,910 và nơi JPEG2 bắt đầu. 649 00:38:56,910 --> 00:39:01,070 Nhưng nếu bạn, lập trình, biết với một chút hiểu biết về nơi mà những hình ảnh JPEG 650 00:39:01,070 --> 00:39:06,010 hoặc những gì họ trông như thế để bạn có thể phân tích các ảnh JPEG 0 và 1 và nói, JPEG, 651 00:39:06,010 --> 00:39:09,440 bạn có thể viết một chương trình với thực chất chỉ là một vòng lặp trong khi 652 00:39:09,440 --> 00:39:12,820 phục hồi mỗi một trong những tập tin. 653 00:39:12,820 --> 00:39:16,030 Vì vậy, bài học sau đó là bắt đầu an toàn tẩy xoá các tập tin của bạn 654 00:39:16,030 --> 00:39:18,340 nếu bạn muốn tránh hiện tượng này. Vâng. 655 00:39:18,340 --> 00:39:21,010 >> [Sinh viên] Làm thế nào đến nó nói trên máy tính của bạn 656 00:39:21,010 --> 00:39:23,550 rằng bạn có nhiều bộ nhớ hơn so với trước khi? 657 00:39:23,550 --> 00:39:27,820 Có nhiều bộ nhớ hơn so với trước khi - >> [sinh viên] Thêm bộ nhớ có sẵn. 658 00:39:27,820 --> 00:39:29,630 Oh. Tốt câu hỏi. 659 00:39:29,630 --> 00:39:32,360 Vậy tại sao sau đó sau khi dọn sạch thùng rác máy tính của bạn cho bạn biết 660 00:39:32,360 --> 00:39:34,910 rằng bạn có không gian tự do hơn so với trước khi? 661 00:39:34,910 --> 00:39:36,770 Tóm lại, bởi vì nó nói dối. 662 00:39:36,770 --> 00:39:40,740 Về mặt kỹ thuật, bạn có thêm không gian bởi vì bây giờ bạn đã nói 663 00:39:40,740 --> 00:39:43,680 bạn có thể đặt các công cụ khác, nơi mà tập tin một lần. 664 00:39:43,680 --> 00:39:45,450 Nhưng điều đó không có nghĩa là các bit được đi xa, 665 00:39:45,450 --> 00:39:48,590 và điều đó không có nghĩa là các bit được thay đổi để tất cả các số 0, ví dụ, 666 00:39:48,590 --> 00:39:50,150 để bảo vệ bạn. 667 00:39:50,150 --> 00:39:54,640 Vì vậy, ngược lại, nếu bạn xóa an toàn các tập tin hoặc sức phá hủy các thiết bị, 668 00:39:54,640 --> 00:39:57,300 đó thực sự là cách duy nhất đôi khi xung quanh đó. 669 00:39:57,300 --> 00:40:02,020 >> Vì vậy, tại sao chúng ta không để lại lưu ý rằng bán đáng sợ, và chúng ta sẽ thấy bạn vào hôm thứ Hai. 670 00:40:02,020 --> 00:40:07,000 [Vỗ tay] 671 00:40:07,780 --> 00:40:10,000 >> [CS50.TV]