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