1 00:00:00,000 --> 00:00:11,242 >> [Chơi nhạc] 2 00:00:11,242 --> 00:00:16,630 >> DAVID J. Malan: Tất cả quyền này là CS50 và điều này là sự bắt đầu của tuần năm. 3 00:00:16,630 --> 00:00:21,480 Vì vậy, ngày hôm nay, bên dưới ghế ngồi của bạn, bạn sẽ không tìm thấy bất cứ điều gì. 4 00:00:21,480 --> 00:00:24,790 Nhưng ở trên, bạn nên tìm những, một ít dấu hiệu của sự đánh giá cao của chúng tôi cho 5 00:00:24,790 --> 00:00:26,970 tất cả các công việc mà bạn đặt vào các trò chơi của Mười lăm. 6 00:00:26,970 --> 00:00:30,290 Đơn giản chỉ cần loại bỏ các vòng tròn nhỏ trên phía dưới để bắt đầu chơi cho 7 00:00:30,290 --> 00:00:31,680 còn lại của lớp. 8 00:00:31,680 --> 00:00:38,930 >> Vì vậy, nhớ lại rằng, hoặc biết rằng vấn đề đặt bốn, mà đi ra ngoài vào cuối tuần này, 9 00:00:38,930 --> 00:00:40,340 liên quan đến văn bản trò chơi khác. 10 00:00:40,340 --> 00:00:43,740 Nhưng lần này nó liên quan đến cách sử dụng một thực tế giao diện người dùng đồ họa, không phải là một 11 00:00:43,740 --> 00:00:46,310 giao diện văn bản như Trò chơi của Mười lăm là. 12 00:00:46,310 --> 00:00:50,210 Và các trò chơi ở phía trước của bạn, nếu bạn đã chưa nhìn thấy điều này tiếp theo, 13 00:00:50,210 --> 00:00:52,310 trông một chút gì đó như thế này. 14 00:00:52,310 --> 00:00:55,170 Tôi sẽ đi vào thiết bị đầu cuối của tôi cửa sổ ở đây trong GDB. 15 00:00:55,170 --> 00:00:58,600 Và tôi sẽ đi trước và chạy giải pháp nhân viên, mà bạn có thể truy cập 16 00:00:58,600 --> 00:01:01,010 sau khi chạy cập nhật 50 như bình thường. 17 00:01:01,010 --> 00:01:04,090 >> Nhưng tôi sẽ đặt nó vào một chút chế độ bí mật, một chút trứng Phục Sinh, 18 00:01:04,090 --> 00:01:08,480 cái gọi là chế độ của Thiên Chúa, bởi Thiên Chúa đặt trong argv1. 19 00:01:08,480 --> 00:01:12,920 Và tôi phải làm theo hướng dẫn của riêng tôi, chạy nó trong của riêng tôi 20 00:01:12,920 --> 00:01:14,220 vấn đề thiết lập thư mục. 21 00:01:14,220 --> 00:01:19,190 Vì vậy, bây giờ bạn nhìn thấy một phiên bản hoàn chỉnh các trò chơi của breakout. 22 00:01:19,190 --> 00:01:21,090 Trong thực tế, đây là chế độ không-tay. 23 00:01:21,090 --> 00:01:24,850 Vì vậy, nó thực sự - 24 00:01:24,850 --> 00:01:26,470 gây ấn tượng mạnh mặc dù bạn có thể có - 25 00:01:26,470 --> 00:01:30,850 khá tầm thường để thực hiện chế độ Thiên Chúa trong Đột phá, không giống như trò chơi của mười lăm, 26 00:01:30,850 --> 00:01:33,590 mà một số bạn có thể đã giải quyết cho phiên bản hacker. 27 00:01:33,590 --> 00:01:37,890 >> Trong Breakout nó cũng đủ trong Thiên Chúa chế độ chỉ đơn giản là làm những gì, 28 00:01:37,890 --> 00:01:41,220 trực giác với mái chèo? 29 00:01:41,220 --> 00:01:45,630 Chỉ cần làm cho nó bằng bất cứ điều gì vị trí ngang của quả bóng. 30 00:01:45,630 --> 00:01:49,220 Và miễn là bạn làm điều này theo sát bước chân với quả bóng di chuyển trò chơi này sẽ 31 00:01:49,220 --> 00:01:53,100 không bao giờ, bao giờ, bao giờ bỏ lỡ bóng và bạn sẽ giành chiến thắng tất cả các thời gian. 32 00:01:53,100 --> 00:01:55,430 >> Nhưng trong phiên bản của hacker trong tuần này có nhiều hơn là chỉ Thiên Chúa chế độ. 33 00:01:55,430 --> 00:01:56,720 Có một số tính năng khác. 34 00:01:56,720 --> 00:01:58,140 Trong số đó, laser. 35 00:01:58,140 --> 00:02:01,070 Vì vậy, nếu bạn thực sự mất kiên nhẫn bạn có thể bắt đầu bắn hạ những viên gạch 36 00:02:01,070 --> 00:02:02,120 và một vài người khác. 37 00:02:02,120 --> 00:02:04,560 Và đối với những người bạn của những người muốn hiệu chỉnh tiêu chuẩn so với tin tặc 38 00:02:04,560 --> 00:02:08,750 phiên bản, tôi có thể thấy rằng trong tuần này phiên bản của hacker cố tình là một 39 00:02:08,750 --> 00:02:12,830 ít khả thi hơn, nói rằng, hơn Thiên Chúa chế độ là với trò chơi của Mười lăm. 40 00:02:12,830 --> 00:02:15,300 >> Vì vậy, nếu bạn đang tìm kiếm một đoạn và bạn đang tìm kiếm một số vui vẻ thêm 41 00:02:15,300 --> 00:02:18,400 tính năng làm lặn trong nếu quan tâm. 42 00:02:18,400 --> 00:02:21,280 Bây giờ thực tế hơn, hãy để tôi chỉ ra một điều là tốt. 43 00:02:21,280 --> 00:02:24,780 GDB, mà một số bạn có thể không có nhưng chạm cá nhân, đó là tốt. 44 00:02:24,780 --> 00:02:28,530 Nhưng bây giờ thực sự là thời gian để làm quen này và thoải mái với công cụ này 45 00:02:28,530 --> 00:02:31,510 bởi vì nó sẽ làm cho cuộc sống của bạn dễ dàng hơn nhiều, thực sự. 46 00:02:31,510 --> 00:02:34,900 >> Mỗi bài giảng của Rob trên GDB một vài tuần trước, nhớ lại 47 00:02:34,900 --> 00:02:36,810 GDB là một trình gỡ lỗi. 48 00:02:36,810 --> 00:02:41,230 Đó là một công cụ cho phép bạn chạy của bạn chương trình nhưng chạy nó từng bước, dòng 49 00:02:41,230 --> 00:02:45,680 Dòng, do đó bạn có thể poke xung quanh, để các bạn thấy những điều xảy ra, vì vậy 50 00:02:45,680 --> 00:02:47,310 mà bạn có thể in ra giá trị của biến. 51 00:02:47,310 --> 00:02:50,580 Trong ngắn hạn, nó sẽ cho bạn nhiều hơn nữa sức mạnh hơn printDef không. 52 00:02:50,580 --> 00:02:52,900 >> Bây giờ phải thừa nhận rằng, giao diện là khá phức tạp. 53 00:02:52,900 --> 00:02:55,180 Màu đen và màu trắng giao diện văn bản cho hầu hết các phần. 54 00:02:55,180 --> 00:02:57,400 Các lệnh được phần nào khó khăn nhớ lần đầu tiên. 55 00:02:57,400 --> 00:03:01,230 Nhưng ngay cả khi nó có thể đưa bạn một nửa một giờ, một giờ, để đưa trả trước đó 56 00:03:01,230 --> 00:03:02,940 đầu tư thời gian vào nó, tôi tin tưởng. 57 00:03:02,940 --> 00:03:06,440 Chắc chắn vào cuối học kỳ của nó sẽ tiết kiệm cho bạn một thứ tự cường độ hơn 58 00:03:06,440 --> 00:03:07,600 thời gian hơn thế. 59 00:03:07,600 --> 00:03:09,200 >> Vì vậy, vào đầu tuần lặn nhập 60 00:03:09,200 --> 00:03:13,200 Và trong các điều khoản của breakout, biết rằng bạn có thể làm được điều này, miễn là bạn có 61 00:03:13,200 --> 00:03:18,230 mã phân phối hoặc mã riêng của bạn trong tiến bộ trong thư mục Pst4 của bạn. 62 00:03:18,230 --> 00:03:21,680 Biết rằng bạn có thể chạy gdb. / Đột phá. 63 00:03:21,680 --> 00:03:23,490 >> Điều này sẽ mở ra một cửa sổ như thế này. 64 00:03:23,490 --> 00:03:25,530 Hãy để tôi cung cấp cho bản thân mình hơn của một cửa sổ thiết bị đầu cuối. 65 00:03:25,530 --> 00:03:27,770 Và sau đó những gì tôi sẽ đi trước và làm, nó không chỉ cần chạy nó. 66 00:03:27,770 --> 00:03:30,690 Tôi sẽ lần đầu tiên thiết lập một điểm break thu hồi, cho phép bạn tạm dừng 67 00:03:30,690 --> 00:03:32,500 thực hiện tại một địa điểm cụ thể. 68 00:03:32,500 --> 00:03:35,750 >> Chỉ để giữ cho mọi thứ đơn giản, tôi sẽ để phá vỡ tại dòng một chỉ bằng cách gõ 69 00:03:35,750 --> 00:03:37,000 số một. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Hãy để tôi thực sự mở lại cửa sổ này bởi vì nó nhận được một 72 00:03:43,250 --> 00:03:45,700 nhỏ nhỏ đó. 73 00:03:45,700 --> 00:03:53,270 Vì vậy, những gì bây giờ tôi sẽ làm ở đây là nếu tôi mở cửa sổ thiết bị đầu cuối của tôi. 74 00:03:53,270 --> 00:03:53,910 Thôi nào, có chúng tôi đi. 75 00:03:53,910 --> 00:03:59,850 >> Vì vậy, bây giờ nếu tôi quay trở lại Dropbox, Pst4 và chạy gdb. / đột phá nhập, thông báo 76 00:03:59,850 --> 00:04:02,600 Tôi sẽ phá vỡ một thiết lập một điểm break ở dòng thứ nhất. 77 00:04:02,600 --> 00:04:04,840 Và bây giờ tôi sẽ đi và loại chạy về phía trước. 78 00:04:04,840 --> 00:04:07,370 Và khi tôi làm, nhận thấy không có gì có thể xảy ra. 79 00:04:07,370 --> 00:04:08,120 >> Không có cửa sổ pop up. 80 00:04:08,120 --> 00:04:09,790 Không có đồ họa giao diện người dùng được nêu ra. 81 00:04:09,790 --> 00:04:13,340 Nhưng đó là dễ hiểu bởi vì tôi nghĩa tại dòng trong một chương trình của tôi. 82 00:04:13,340 --> 00:04:17,110 Và nhận thấy rằng tôi đã chuyển tiếp nhanh, đặc biệt bây giờ đến 62, bởi vì tất cả 83 00:04:17,110 --> 00:04:20,600 các công cụ ở trên cùng của tập tin này là những thứ như ý kiến ​​và hằng số và 84 00:04:20,600 --> 00:04:22,460 không hấp dẫn các công cụ cho bây giờ. 85 00:04:22,460 --> 00:04:25,840 >> Vì vậy, bây giờ tôi bên trong của chính, có vẻ như, tại dòng 62. 86 00:04:25,840 --> 00:04:27,960 Và đây là sự phân phối mã, thu hồi. 87 00:04:27,960 --> 00:04:33,810 Nếu tôi mở này lên bằng cách đi, tương tự, vào thư mục hộp thả tôi vào Pst4, 88 00:04:33,810 --> 00:04:35,450 vào breakout.c. 89 00:04:35,450 --> 00:04:40,670 Và nếu tôi di chuyển xuống và xuống và xuống, và để cho tôi đi trước và bật 90 00:04:40,670 --> 00:04:44,990 số dòng của tôi. 91 00:04:44,990 --> 00:04:50,300 >> Những gì tôi sẽ thấy, nếu tôi di chuyển xuống đường 62, chính xác là dòng 92 00:04:50,300 --> 00:04:50,910 chúng tôi đã tạm dừng trên. 93 00:04:50,910 --> 00:04:53,720 Vì vậy, dòng này đây, 62 tuổi, là nơi chúng tôi sắp sửa được. 94 00:04:53,720 --> 00:04:57,470 Vì vậy, bây giờ trong GDB, nếu tôi đi trước và gõ giờ tiếp theo, nhập nó sẽ 95 00:04:57,470 --> 00:04:58,450 thực hiện dòng đó. 96 00:04:58,450 --> 00:05:00,610 Và thì đấy, chúng tôi có cái gọi là cửa sổ g. 97 00:05:00,610 --> 00:05:02,800 Nếu không quen thuộc với những gì một GWindow là, không phải lo lắng. 98 00:05:02,800 --> 00:05:05,740 Spec sẽ giới thiệu bạn với nó, như cũng như một số video hương 99 00:05:05,740 --> 00:05:06,830 nhúng trong spec. 100 00:05:06,830 --> 00:05:08,610 >> Nhưng bây giờ chúng ta hãy làm điều này một ít thú vị hơn. 101 00:05:08,610 --> 00:05:10,960 Hãy để tôi di chuyển cửa sổ này hơn sang một bên một chút. 102 00:05:10,960 --> 00:05:13,480 Hãy để tôi làm cho cửa sổ một chút lớn hơn để tôi có thể nhìn thấy hơn. 103 00:05:13,480 --> 00:05:16,140 >> Và bây giờ hãy để tôi đi trước và làm gì tiếp theo nữa. 104 00:05:16,140 --> 00:05:17,550 Và có những viên gạch của tôi. 105 00:05:17,550 --> 00:05:20,490 Nếu tôi gõ tiếp theo lại bây giờ tôi thấy bóng. 106 00:05:20,490 --> 00:05:23,520 Và nếu tôi gõ tiếp theo lại bây giờ tôi thấy mái chèo. 107 00:05:23,520 --> 00:05:26,690 >> Và may mắn thay gedit đây không phải là thực sự hợp tác bằng cách cho tôi 108 00:05:26,690 --> 00:05:27,660 tất cả mọi thứ tôi muốn. 109 00:05:27,660 --> 00:05:30,820 Nhưng bây giờ nếu tôi làm gì tiếp theo một lần nữa, tiếp theo một lần nữa, tôi chỉ 110 00:05:30,820 --> 00:05:32,260 khai báo một số biến. 111 00:05:32,260 --> 00:05:34,750 Và tôi có thể in bất kỳ một của những kẻ ra. 112 00:05:34,750 --> 00:05:37,170 Gạch in, bản in cuộc sống. 113 00:05:37,170 --> 00:05:39,910 >> Và bây giờ nếu tôi tiếp tục làm tiếp theo, thông báo rằng tôi sẽ có 114 00:05:39,910 --> 00:05:40,870 trong vòng lặp đó. 115 00:05:40,870 --> 00:05:43,380 Nhưng mã này sẽ thực hiện chính xác như tôi mong đợi. 116 00:05:43,380 --> 00:05:45,810 Vì vậy, khi tôi nhấn chức năng này, Chờ cho Click, nó sẽ làm 117 00:05:45,810 --> 00:05:46,830 nó theo nghĩa đen đó. 118 00:05:46,830 --> 00:05:48,870 Vì vậy, tôi dường như đã mất quyền kiểm soát trong chương trình. 119 00:05:48,870 --> 00:05:50,480 >> GDB không đem lại cho tôi một dấu nhắc. 120 00:05:50,480 --> 00:05:51,500 Nhưng không phải lo lắng. 121 00:05:51,500 --> 00:05:53,720 Hãy vào trò chơi của tôi, nhấp vào một nơi nào đó. 122 00:05:53,720 --> 00:05:56,270 >> Và thì đấy, bây giờ nó đi vào dòng 86. 123 00:05:56,270 --> 00:05:59,460 Vì vậy, một lần nữa, nó là vô giá, cuối cùng, cho các vấn đề gỡ lỗi. 124 00:05:59,460 --> 00:06:03,050 Bởi vì bạn có nghĩa là có thể bước qua mã của bạn, in những điều trên và nhiều, 125 00:06:03,050 --> 00:06:03,640 nhiều, nhiều hơn nữa. 126 00:06:03,640 --> 00:06:07,210 Nhưng hiện nay, những công cụ một mình sẽ giúp bạn khá xa. 127 00:06:07,210 --> 00:06:10,050 >> Vì vậy, chúng tôi, tất nhiên, lấy một cái nhìn ở đồ họa bây giờ, tất cả của một đột ngột. 128 00:06:10,050 --> 00:06:12,350 Và bây giờ thế giới của chúng tôi được một chút thú vị hơn. 129 00:06:12,350 --> 00:06:15,680 Và bạn biết, có lẽ, từ một số các video trực tuyến mà chúng ta có những 130 00:06:15,680 --> 00:06:18,280 quần short mà bạn đã xem như là một phần của bài tập. 131 00:06:18,280 --> 00:06:20,460 >> Và họ đã bị bắn, cố tình, chống lại một nền màu trắng. 132 00:06:20,460 --> 00:06:23,380 Và một số người trong số họ có giảng dạy Nghiên cứu sinh vẽ một số văn bản trên 133 00:06:23,380 --> 00:06:25,490 màn hình đó là phủ về phía họ. 134 00:06:25,490 --> 00:06:27,760 Nhưng tất nhiên, đây không phải là tất cả những gì thú vị trong thế giới thực. 135 00:06:27,760 --> 00:06:30,520 Đây chỉ là một giảng đường với một màn hình lớn màu trắng và bối cảnh. 136 00:06:30,520 --> 00:06:33,330 Và đội ngũ sản xuất tuyệt vời của chúng tôi loại của làm cho mọi thứ trông đẹp 137 00:06:33,330 --> 00:06:36,620 sau khi thực tế bằng cách cắt ra hoặc đè bất cứ điều gì 138 00:06:36,620 --> 00:06:37,840 chúng ta làm hoặc không muốn. 139 00:06:37,840 --> 00:06:41,560 >> Bây giờ chỉ cần để thúc đẩy tuần này và thực sự, nơi bạn có thể đi, cuối cùng, 140 00:06:41,560 --> 00:06:42,560 với khoa học máy tính. 141 00:06:42,560 --> 00:06:44,260 Không chỉ là vấn đề sau khi thiết lập bốn. 142 00:06:44,260 --> 00:06:48,240 Nhưng sau một khóa học hoặc một toàn bộ chương trình giảng dạy đó là những gì tuyệt vời bạn có thể 143 00:06:48,240 --> 00:06:51,090 làm những ngày về đồ họa nói riêng. 144 00:06:51,090 --> 00:06:53,440 >> Một số bạn có thể đã nhìn thấy điều này chảy xung quanh trực tuyến. 145 00:06:53,440 --> 00:06:56,240 Nhưng tôi nghĩ rằng tôi muốn cho bạn thấy, chỉ một vài phút, một cái nhìn thoáng qua về những gì 146 00:06:56,240 --> 00:07:01,890 công nghệ máy tính và những gì CGI, đồ họa máy tính có thể làm những ngày này 147 00:07:01,890 --> 00:07:04,510 với một bài hát quen thuộc và có lẽ phim. 148 00:07:04,510 --> 00:07:05,760 >> [MUSIC - LANA DEL RAY, "TRẺ ĐẸP VÀ] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> SPEAKER 1: Nó chỉ là một chút tuyệt vời, có lẽ, như thế nào 151 00:10:52,470 --> 00:10:52,857 mặt ở khắp nơi - 152 00:10:52,857 --> 00:10:57,040 >> [Vỗ tay] 153 00:10:57,040 --> 00:10:59,230 >> SPEAKER 1: Tôi chỉ cần tải về nó. 154 00:10:59,230 --> 00:11:02,920 Nhưng nó thực sự tuyệt vời, tôi nghĩ rằng, chỉ cần cách mặt ở khắp nơi và phần mềm mã và 155 00:11:02,920 --> 00:11:04,230 các công cụ như thế này thực sự là. 156 00:11:04,230 --> 00:11:07,685 Vì vậy, đó là một hương vị của hướng trong đó bạn có thể đi. 157 00:11:07,685 --> 00:11:10,620 Oh, không gia dụng ngày hôm nay. 158 00:11:10,620 --> 00:11:14,640 Vâng, đó là thời gian thực sự bi thảm cho điểm tôi chỉ cố gắng để thực hiện. 159 00:11:14,640 --> 00:11:18,670 >> Được rồi, vì vậy hãy khởi động Kết hợp một lần nữa. 160 00:11:18,670 --> 00:11:20,800 Nhắc nhở tôi sau này. 161 00:11:20,800 --> 00:11:24,190 Tất cả các bên phải, và bạn nên đã có một email như một sang một bên nếu bạn đã có được một 162 00:11:24,190 --> 00:11:25,460 nhận thấy như thế. 163 00:11:25,460 --> 00:11:29,940 Được rồi, nhớ lại rằng tuần trước chúng tôi bắt đầu bóc này 164 00:11:29,940 --> 00:11:31,380 sau đó được gọi là chuỗi. 165 00:11:31,380 --> 00:11:34,700 >> chuỗi nhớ lại một kiểu dữ liệu đó là khai báo trong thư viện CS50. 166 00:11:34,700 --> 00:11:37,740 Và nó là một phần của các bánh xe đào tạo mà bây giờ sẽ bắt đầu cất cánh. 167 00:11:37,740 --> 00:11:41,280 Đó là một khái niệm hữu ích sớm. 168 00:11:41,280 --> 00:11:43,750 Nhưng bây giờ nó sẽ nhận được nhiều hơn thú vị và mạnh mẽ hơn để 169 00:11:43,750 --> 00:11:48,330 thực sự thấy rằng bên dưới mui xe, một chuỗi chỉ là những gì, đã làm chúng tôi nói gì không? 170 00:11:48,330 --> 00:11:50,500 >> Yeah, vì vậy đó là một cái gọi là char *. 171 00:11:50,500 --> 00:11:53,860 Và * có biểu thị rằng có một số loại địa chỉ có liên quan. 172 00:11:53,860 --> 00:11:58,690 Và vì vậy khi bạn nói char * Bạn chỉ có nghĩa là một biến có kiểu dữ liệu là một 173 00:11:58,690 --> 00:11:59,290 con trỏ bây giờ. 174 00:11:59,290 --> 00:12:01,770 Thực tế là có những ngôi sao có chỉ có nghĩa là bạn đang khai báo một 175 00:12:01,770 --> 00:12:03,020 cái gọi là con trỏ. 176 00:12:03,020 --> 00:12:06,220 Và con trỏ có nghĩa là sẽ rõ ràng lưu trữ các địa chỉ của, của 177 00:12:06,220 --> 00:12:07,810 Tất nhiên, một char. 178 00:12:07,810 --> 00:12:08,960 >> Bây giờ tại sao điều này có ý nghĩa? 179 00:12:08,960 --> 00:12:11,200 Vâng, một chuỗi là những gì bên dưới mui xe? 180 00:12:11,200 --> 00:12:15,130 Vâng, trong một thời gian chúng tôi đã nói rằng một chuỗi bên dưới mui xe là 181 00:12:15,130 --> 00:12:18,460 chỉ h-e-l-l-o, ví dụ. 182 00:12:18,460 --> 00:12:21,585 >> Nhưng chúng tôi đã nói về điều này như là, về cơ bản, một mảng. 183 00:12:21,585 --> 00:12:25,410 Và một mảng sau đó sẽ xem xét một chút hơn như thế này, với mỗi 184 00:12:25,410 --> 00:12:26,460 chiếm một vết cắn. 185 00:12:26,460 --> 00:12:28,710 Và sau đó chúng tôi đã nói rằng có một cái gì đó đặc biệt trở lại đây, các 186 00:12:28,710 --> 00:12:31,270 dấu gạch chéo ngược 0, hoặc null terminator. 187 00:12:31,270 --> 00:12:35,230 >> Vì vậy, tất cả các thời gian này, này đây đã được một chuỗi. 188 00:12:35,230 --> 00:12:38,320 Nhưng thực sự, một chuỗi thực sự là một địa chỉ. 189 00:12:38,320 --> 00:12:43,210 Và địa chỉ, như chúng ta sẽ thấy, thường bắt đầu với 0x theo quy ước. 190 00:12:43,210 --> 00:12:44,540 0x gì biểu thị? 191 00:12:44,540 --> 00:12:45,970 Không ai biết? 192 00:12:45,970 --> 00:12:47,320 >> Vì vậy, nó chỉ có nghĩa là hệ thập lục phân. 193 00:12:47,320 --> 00:12:52,360 Vì vậy, bạn có thể nhớ lại, trên thực tế, từ PST 1, tôi tin rằng, một trong những khởi động 194 00:12:52,360 --> 00:12:55,740 câu hỏi thực sự được hỏi về ký hiệu thập lục phân ngoài 195 00:12:55,740 --> 00:12:57,100 nhị phân và thập phân. 196 00:12:57,100 --> 00:13:00,460 Và động lực ở đây là với hệ thập lục phân bạn có 16 197 00:13:00,460 --> 00:13:01,770 chữ số theo ý của bạn. 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, tiếp theo bởi a, b, c, d, đ, e. 199 00:13:07,900 --> 00:13:10,430 >> Và nếu tính tất cả những người lên, bạn nhận được tổng số 16. 200 00:13:10,430 --> 00:13:13,200 Vì vậy, điều này trái ngược với số thập phân, nơi chúng tôi có 10 201 00:13:13,200 --> 00:13:14,690 chữ số, 0 đến chín. 202 00:13:14,690 --> 00:13:17,750 Nó trái ngược với nhị phân nơi chúng tôi chỉ có 0 và 1. 203 00:13:17,750 --> 00:13:21,450 >> Nhưng vào cuối ngày, bạn có thể chỉ cần đại diện cho các con số tương tự, nhưng 204 00:13:21,450 --> 00:13:22,500 hơi khác nhau. 205 00:13:22,500 --> 00:13:25,840 Và hệ thập lục phân là phổ biến vì như nó quay ra - và chúng ta sẽ thấy điều này 206 00:13:25,840 --> 00:13:28,790 sau trong khóa học - ngay cả khi chúng ta có được để lập trình web trong bối cảnh 207 00:13:28,790 --> 00:13:32,100 HTML và mã màu, hệ thập lục phân là tốt đẹp. 208 00:13:32,100 --> 00:13:36,390 Bởi vì mỗi chữ số, quay ra, đại diện cho bốn bit hoàn hảo. 209 00:13:36,390 --> 00:13:39,280 Vì vậy, nó chỉ là loại đường lên độc đáo như chúng tôi cuối cùng sẽ thấy. 210 00:13:39,280 --> 00:13:44,720 Vì vậy, đây có thể là một cái gì đó hoặc Ox123 như thế, biểu thị địa chỉ 123 211 00:13:44,720 --> 00:13:47,050 ở đâu đó bên trong của tôi bộ nhớ của máy tính. 212 00:13:47,050 --> 00:13:50,600 >> Nhưng tất nhiên, một số vấn đề phát sinh vì cơ bản này 213 00:13:50,600 --> 00:13:51,520 thực hiện. 214 00:13:51,520 --> 00:13:55,930 Và nhớ lại rằng tôi đã lấy một đâm vào thực hiện một chức năng như thế này - 215 00:13:55,930 --> 00:14:00,260 so sánh dấu gạch ngang 0 dot c tuần trước, mà mặc dù nó trông giống như nó là 216 00:14:00,260 --> 00:14:04,270 đúng, nó chỉ đơn giản là không so sánh hai dây một cách chính xác. 217 00:14:04,270 --> 00:14:07,470 >> Tôi đã vứt bỏ chính, và tôi đã ném đi những ý kiến ​​chỉ để tập trung vào 218 00:14:07,470 --> 00:14:08,970 các mã đó là quan tâm ở đây. 219 00:14:08,970 --> 00:14:10,660 Và đó là màu đỏ vì đó là lỗi. 220 00:14:10,660 --> 00:14:11,670 Vì lý do gì? 221 00:14:11,670 --> 00:14:15,890 >> Vâng, ở trên cùng có khi tôi tuyên bố một chuỗi, những gì đã thực sự xảy ra 222 00:14:15,890 --> 00:14:17,260 bên dưới mui xe? 223 00:14:17,260 --> 00:14:19,530 Vâng, hãy để tôi đi về phía sàng lọc ở đây và rút ra rằng. 224 00:14:19,530 --> 00:14:23,230 Vì vậy, tôi tuyên bố, một lần nữa, string s GetString. 225 00:14:23,230 --> 00:14:26,640 >> Vì vậy, tôi sẽ đi trước và bây giờ vẽ s cho những gì nó thực sự là. 226 00:14:26,640 --> 00:14:28,590 Nó sẽ là một hình vuông đây. 227 00:14:28,590 --> 00:14:30,490 Và tôi sẽ yêu cầu bồi thường mà đó là 32 bit. 228 00:14:30,490 --> 00:14:32,890 Ít nhất nó thường là, ít nhất là trên CS50 229 00:14:32,890 --> 00:14:34,520 thiết bị trong rất nhiều máy tính. 230 00:14:34,520 --> 00:14:35,980 Tôi sẽ gọi nó là s. 231 00:14:35,980 --> 00:14:39,070 >> Nhưng bây giờ nhớ lại rằng chúng tôi gọi là GetString. 232 00:14:39,070 --> 00:14:41,430 Vì vậy, lợi nhuận GetString, tất nhiên, một chuỗi. 233 00:14:41,430 --> 00:14:45,790 Nếu sử dụng các loại trong h-e-l-l-o nhập chuỗi hello được trả lại. 234 00:14:45,790 --> 00:14:51,010 Và chuỗi đó, như chúng tôi vừa nói, kết thúc ở đâu đó trong bộ nhớ máy tính của bạn 235 00:14:51,010 --> 00:14:53,240 với một dấu gạch chéo ngược 0 ở cuối. 236 00:14:53,240 --> 00:14:56,650 Tôi sẽ vẽ này như mảng - hoặc khối liên tục của các nhân vật - 237 00:14:56,650 --> 00:14:58,330 nó thực sự là. 238 00:14:58,330 --> 00:15:01,790 >> Và bây giờ, những gì đang GetString thực sự trở lại? 239 00:15:01,790 --> 00:15:04,340 Những gì đã GetString được trở về tất cả thời gian này? 240 00:15:04,340 --> 00:15:07,520 Vâng, chúng ta nói, trong tuần trước, nó trả về một chuỗi. 241 00:15:07,520 --> 00:15:10,250 Nhưng về mặt kỹ thuật hơn, những gì hiện GetString trở lại rõ ràng? 242 00:15:10,250 --> 00:15:11,610 >> ĐỐI TƯỢNG: Một địa chỉ. 243 00:15:11,610 --> 00:15:12,600 >> SPEAKER 1: Một địa chỉ. 244 00:15:12,600 --> 00:15:16,630 Cụ thể nó sẽ trả về địa chỉ của vết cắn đầu tiên, bất cứ điều gì. 245 00:15:16,630 --> 00:15:18,830 Tôi chỉ tiếp tục sử dụng một, hai, ba bởi vì nó thuận tiện. 246 00:15:18,830 --> 00:15:21,380 >> Nó sẽ trả về địa chỉ của các đầu tiên nhân vật trong chuỗi. 247 00:15:21,380 --> 00:15:23,510 Và chúng tôi cho biết tuần trước rằng đó là đủ. 248 00:15:23,510 --> 00:15:26,710 Bởi vì chúng ta luôn luôn có thể tìm ra nơi kết thúc chuỗi chỉ bằng cách 249 00:15:26,710 --> 00:15:30,150 duyệt qua nó, có lẽ, với một cho vòng lặp hoặc một vòng lặp trong khi hoặc một cái gì đó như 250 00:15:30,150 --> 00:15:34,990 đó, chỉ cần tìm kiếm "dấu gạch chéo ngược 0", các nhân vật trọng điểm đặc biệt. 251 00:15:34,990 --> 00:15:37,220 >> Và sau đó chúng ta biết rằng chuỗi sẽ xảy ra là chiều dài - 252 00:15:37,220 --> 00:15:37,980 trong trường hợp này - 253 00:15:37,980 --> 00:15:38,670 năm. 254 00:15:38,670 --> 00:15:43,800 Vì vậy, về mặt kỹ thuật những gì GetString không là nó trả về Ox123 trong trường hợp này. 255 00:15:43,800 --> 00:15:53,670 Và về mặt kỹ thuật những gì xảy ra sau đó là mà chúng tôi lưu trữ, bên trong s, Ox123. 256 00:15:53,670 --> 00:15:56,460 Vào cuối ngày, mặc dù điều này là khái niệm mới, con trỏ, họ 257 00:15:56,460 --> 00:15:57,350 chỉ biến. 258 00:15:57,350 --> 00:16:00,440 Nhưng chúng xảy ra để lưu trữ các bit mà tập thể đại diện cho một địa chỉ. 259 00:16:00,440 --> 00:16:03,700 Vì vậy, về mặt kỹ thuật tất cả họ được được lưu trữ trong s là Ox123. 260 00:16:03,700 --> 00:16:04,680 >> Nhưng chúng tôi như con người - 261 00:16:04,680 --> 00:16:06,020 bao gồm cả hôm nay trở đi - 262 00:16:06,020 --> 00:16:09,290 đang thực sự sẽ không quan tâm, thông thường, những địa chỉ thực tế 263 00:16:09,290 --> 00:16:10,520 một số đoạn bộ nhớ. 264 00:16:10,520 --> 00:16:14,040 Nó chỉ là mức thấp của chi tiết để có trí tuệ thú vị. 265 00:16:14,040 --> 00:16:15,440 Vì vậy, tôi sẽ lùi lại này. 266 00:16:15,440 --> 00:16:19,810 Và thay vào đó, mức độ cao hơn, chỉ cần nói rằng khi chúng ta đang nói về con trỏ 267 00:16:19,810 --> 00:16:22,170 Tôi sẽ chỉ thu hút nhiều hơn mũi tên sử dụng mà chuyển tải 268 00:16:22,170 --> 00:16:26,060 cùng ý tưởng và tóm tắt đi cụ thể về những gì thực tế 269 00:16:26,060 --> 00:16:27,700 địa chỉ cơ bản là. 270 00:16:27,700 --> 00:16:33,290 >> Bây giờ nếu chúng ta quay trở lại các mã, những gì xảy ra trong tuần cuối cùng nếu chúng ta có chuỗi t 271 00:16:33,290 --> 00:16:34,510 bằng GetString? 272 00:16:34,510 --> 00:16:38,630 Vâng, nếu tôi một lần nữa, gõ vào xin chào thời gian này tôi sẽ nhận được 273 00:16:38,630 --> 00:16:40,460 một đoạn bộ nhớ. 274 00:16:40,460 --> 00:16:44,820 h-e-l-l-o dấu chéo ngược 0. 275 00:16:44,820 --> 00:16:48,320 >> Nhưng vì tôi gọi là getString lần thứ hai - 276 00:16:48,320 --> 00:16:51,100 và tôi biết điều này từ nhìn vào mã nguồn cho GetString - thậm chí 277 00:16:51,100 --> 00:16:54,350 mặc dù nó trùng hợp ngẫu nhiên mà là xin chào gõ vào hai lần, GetString không phải là 278 00:16:54,350 --> 00:16:55,890 sẽ cố gắng để tối ưu hóa và được thông minh. 279 00:16:55,890 --> 00:16:58,550 Nó chỉ sẽ nhận được một đoạn bộ nhớ từ máy tính, mà là 280 00:16:58,550 --> 00:16:59,640 sẽ có mặt tại một địa chỉ khác. 281 00:16:59,640 --> 00:17:02,330 Chúng ta hãy tự ý chỉ nói 456. 282 00:17:02,330 --> 00:17:04,079 >> Và sau đó những gì là nó sẽ trở lại? 283 00:17:04,079 --> 00:17:08,030 Nó sẽ trở lại 456 và lưu trữ nó trong t. 284 00:17:08,030 --> 00:17:12,010 Vì vậy, những gì đang thực sự xảy ra, trên bên trái là tôi có đoạn khác 285 00:17:12,010 --> 00:17:14,260 bộ nhớ, 32 bit thường. 286 00:17:14,260 --> 00:17:16,720 Và trong đó sẽ đi Ox456. 287 00:17:16,720 --> 00:17:20,140 Nhưng một lần nữa, tôi không quan tâm đến các số cụ thể nữa. 288 00:17:20,140 --> 00:17:23,069 Tôi chỉ cần đi đến trừu tượng vẽ nó như một mũi tên. 289 00:17:23,069 --> 00:17:25,202 >> Vì vậy, đây bây giờ là một lời giải thích mới. 290 00:17:25,202 --> 00:17:28,735 Nhưng đó là ý tưởng chính xác đó là đã xảy ra suốt thời gian qua. 291 00:17:28,735 --> 00:17:33,150 Và do đó, lý do đó, điều này đầu tiên phiên bản của so sánh là lỗi 292 00:17:33,150 --> 00:17:34,480 tuần trước là lý do tại sao? 293 00:17:34,480 --> 00:17:38,000 Khi bạn làm gì nếu s tương đương với bằng t bạn là những gì thật sự 294 00:17:38,000 --> 00:17:40,550 bên dưới mui xe so sánh? 295 00:17:40,550 --> 00:17:41,910 >> Bạn đang so sánh các địa chỉ. 296 00:17:41,910 --> 00:17:47,950 Và chỉ trực quan, rõ ràng, Ox123 sẽ không bằng Ox456. 297 00:17:47,950 --> 00:17:49,380 Những con số, những bit chỉ khác nhau. 298 00:17:49,380 --> 00:17:53,220 >> Và do đó một cách nhất quán, tuần trước cho biết bạn gõ những thứ khác nhau, ngay cả khi 299 00:17:53,220 --> 00:17:55,360 lời là đúng nguyên văn như vậy. 300 00:17:55,360 --> 00:17:58,770 Vì vậy, chúng tôi sửa lỗi này. 301 00:17:58,770 --> 00:18:00,120 Trong điều khoản của layman, việc sửa chữa là gì? 302 00:18:00,120 --> 00:18:02,110 >> ĐỐI TƯỢNG: Sử dụng chức năng. 303 00:18:02,110 --> 00:18:02,870 >> SPEAKER 1: Sử dụng chức năng. 304 00:18:02,870 --> 00:18:05,190 Hoặc sao chắc chắn có liên quan, nhưng sử dụng một chức năng để làm những gì? 305 00:18:05,190 --> 00:18:05,962 >> ĐỐI TƯỢNG: Để so sánh chuỗi. 306 00:18:05,962 --> 00:18:07,390 >> SPEAKER 1: Để so sánh chuỗi. 307 00:18:07,390 --> 00:18:11,030 Vì vậy, các vấn đề cơ bản ở đây là rằng tôi chỉ xem xét 308 00:18:11,030 --> 00:18:15,870 chất lượng của chuỗi được xác định bằng so sánh địa chỉ của họ. 309 00:18:15,870 --> 00:18:18,540 Và rõ ràng đó chỉ là câm giờ một lần bạn hiểu những gì đang xảy ra 310 00:18:18,540 --> 00:18:19,510 bên dưới mui xe. 311 00:18:19,510 --> 00:18:23,270 Để thực sự so sánh chuỗi để xem họ bằng trong cách mà một con người 312 00:18:23,270 --> 00:18:26,680 sẽ xem xét hai dây được bình đẳng chúng ta cần phải so sánh chúng nhân vật cho 313 00:18:26,680 --> 00:18:28,070 nhân vật cho nhân vật. 314 00:18:28,070 --> 00:18:30,020 >> Bây giờ tôi có thể có thực hiện này rất tediously. 315 00:18:30,020 --> 00:18:32,240 Nhưng thân thiết, chúng tôi sử dụng một vòng lặp. 316 00:18:32,240 --> 00:18:36,050 Và chỉ cần so sánh s khung tôi chống lại t khung tôi. 317 00:18:36,050 --> 00:18:39,590 s khung tôi cộng với 1 đối với t khung tôi cộng với 1, vv, trong 318 00:18:39,590 --> 00:18:40,580 một số loại vòng lặp. 319 00:18:40,580 --> 00:18:44,950 Và nếu tôi phát hiện bất kỳ hai ký tự khác nhau, hoặc nếu tôi nhận ra rằng ooh, s là 320 00:18:44,950 --> 00:18:48,410 ngắn hơn hoặc dài hơn t t Tôi ngay lập tức có thể nói sai, 321 00:18:48,410 --> 00:18:49,390 họ không giống nhau. 322 00:18:49,390 --> 00:18:55,370 >> Nhưng nếu tôi nhận được thông qua s và t và nói , cùng, cùng, cùng, cùng, kết thúc 323 00:18:55,370 --> 00:18:58,520 cả hai chuỗi, tôi có thể nói đúng, chúng bằng nhau. 324 00:18:58,520 --> 00:19:01,040 Vâng, may mắn thay, năm trước một người nào đó đã viết mã cho chúng tôi. 325 00:19:01,040 --> 00:19:03,790 >> Và họ gọi nó là StrComp cho chuỗi so sánh. 326 00:19:03,790 --> 00:19:11,900 Và mặc dù nó là một chút truy cập trực quan, StrComp trả về 0 nếu những 327 00:19:11,900 --> 00:19:14,520 hai dây, s và t là như nhau. 328 00:19:14,520 --> 00:19:18,090 Nhưng nó trả về giá trị âm nếu s nên đến trước khi t theo thứ tự abc hoặc 329 00:19:18,090 --> 00:19:20,610 giá trị tích cực nếu cần đến sau khi t theo bảng chữ cái. 330 00:19:20,610 --> 00:19:24,030 >> Vì vậy, nếu bạn muốn sắp xếp một cái gì đó, nó quay ra rằng StrComp là hữu ích. 331 00:19:24,030 --> 00:19:26,660 Bởi vì nó không chỉ nói có hay không, bằng hoặc không. 332 00:19:26,660 --> 00:19:30,440 Nó mang lại cho bạn một cảm giác đặt hàng như một từ điển sức. 333 00:19:30,440 --> 00:19:33,770 Vì vậy, StrComp, s dấu phẩy t bằng bằng 0 có nghĩa là 334 00:19:33,770 --> 00:19:35,200 dây thật sự bình đẳng. 335 00:19:35,200 --> 00:19:38,680 Bởi vì bất cứ ai đã viết chức năng này năm trước đây có lẽ là sử dụng một vòng lặp for 336 00:19:38,680 --> 00:19:42,840 hoặc một vòng lặp trong khi hay tin như thế để tích hợp trên các nhân vật một lần nữa 337 00:19:42,840 --> 00:19:45,270 và một lần nữa và một lần nữa. 338 00:19:45,270 --> 00:19:47,300 >> Nhưng hai vấn đề nảy sinh ở đây. 339 00:19:47,300 --> 00:19:48,750 Đây là copy0.c. 340 00:19:48,750 --> 00:19:51,680 Và hai màu đỏ là bởi vì đó là sai lầm. 341 00:19:51,680 --> 00:19:52,800 Và chúng tôi đã làm gì ở đây? 342 00:19:52,800 --> 00:19:54,310 Vâng, đầu tiên tôi gọi là getString. 343 00:19:54,310 --> 00:19:56,255 Và tôi lưu trữ các giá trị trả về trong s. 344 00:19:56,255 --> 00:20:00,260 Vì vậy, đó là khá nhiều giống như này là một phần trên của hình ảnh. 345 00:20:00,260 --> 00:20:01,490 >> Nhưng điều gì sẽ đến sau đó? 346 00:20:01,490 --> 00:20:04,980 Vâng, hãy để tôi đi trước để loại bỏ của một bó toàn bộ này. 347 00:20:04,980 --> 00:20:09,650 Chúng tôi sẽ quay lại trong thời gian đến nơi chúng tôi chỉ có s, mà bây giờ phù hợp với 348 00:20:09,650 --> 00:20:10,940 đường lên đó. 349 00:20:10,940 --> 00:20:11,400 >> Tôi kiểm tra. 350 00:20:11,400 --> 00:20:13,450 Nếu s bằng bằng 0. 351 00:20:13,450 --> 00:20:18,670 Bây giờ, một mặt lưu ý nhanh chóng, khi có thể GetString trở về 0? 352 00:20:18,670 --> 00:20:19,580 Không có đủ bộ nhớ. 353 00:20:19,580 --> 00:20:19,880 Phải không? 354 00:20:19,880 --> 00:20:22,310 >> Nó hiếm hoi rằng điều này sẽ xảy ra, chắc chắn trên một máy tính đó là 355 00:20:22,310 --> 00:20:24,740 có hàng trăm megs hoặc thậm chí hợp đồng biểu diễn của bộ nhớ RAM. 356 00:20:24,740 --> 00:20:27,080 Nhưng nó có thể, trong lý thuyết, trở về 0, đặc biệt là nếu 357 00:20:27,080 --> 00:20:28,080 người sử dụng không hợp tác. 358 00:20:28,080 --> 00:20:31,640 Có cách để giả vờ như bạn chưa bất cứ điều gì nhập và lừa 359 00:20:31,640 --> 00:20:34,100 GetString vào trở lại 0 có hiệu quả. 360 00:20:34,100 --> 00:20:35,470 >> Vì vậy, nó sẽ kiểm tra cho điều đó. 361 00:20:35,470 --> 00:20:39,430 Bởi vì nếu bất kỳ của bạn đã bắt đầu nhận được, đã có, lỗi phân khúc - 362 00:20:39,430 --> 00:20:42,280 trong đó đã có thể là một nguồn của một số thất vọng - 363 00:20:42,280 --> 00:20:46,150 đó là hầu như luôn luôn kết quả bộ nhớ liên quan đến lỗi. 364 00:20:46,150 --> 00:20:50,440 Bằng cách nào đó bạn sai lầm liên quan với một con trỏ, thậm chí nếu bạn đã không nhận ra 365 00:20:50,440 --> 00:20:51,530 có một con trỏ. 366 00:20:51,530 --> 00:20:55,260 Vì vậy, bạn có thể đã gây ra chia nhỏ gói lỗi càng sớm càng một tuần sử dụng 367 00:20:55,260 --> 00:21:02,100 một cái gì đó giống như một vòng lặp hoặc một thời gian vòng lặp và một mảng bằng cách đi quá xa 368 00:21:02,100 --> 00:21:05,900 qua ranh giới của một số mảng bạn tuyên bố, trong tuần hai trong 369 00:21:05,900 --> 00:21:06,690 cụ thể. 370 00:21:06,690 --> 00:21:09,220 >> Bạn có thể thực hiện nó ngay cả trong vấn đề thiết lập bốn với Breakout. 371 00:21:09,220 --> 00:21:12,910 Mặc dù có thể bạn không nhìn thấy bất kỳ ngôi sao trong mã phân phối 372 00:21:12,910 --> 00:21:17,410 Đột phá, nó chỉ ra rằng những GRect và những thứ đó GOval và khác, 373 00:21:17,410 --> 00:21:19,650 những người thực sự con trỏ bên dưới mui xe. 374 00:21:19,650 --> 00:21:23,430 >> Nhưng Stanford, như chúng tôi, loại da rằng chi tiết ít nhất là cho các thư viện 375 00:21:23,430 --> 00:21:26,540 mục đích, giống như chúng ta làm cho chuỗi và char *. 376 00:21:26,540 --> 00:21:30,060 Nhưng GRect và GOval và tất cả những điều các bạn đang hoặc sẽ được sử dụng 377 00:21:30,060 --> 00:21:32,630 tuần này là cuối cùng địa chỉ bộ nhớ. 378 00:21:32,630 --> 00:21:33,650 Bạn chỉ không biết nó. 379 00:21:33,650 --> 00:21:37,240 >> Vì vậy, nó không phải là đáng ngạc nhiên sau đó, có lẽ, mà bạn có thể đi qua một số 380 00:21:37,240 --> 00:21:38,580 lỗi phân khúc. 381 00:21:38,580 --> 00:21:41,290 Nhưng điều thú vị ở đây bây giờ, nếu sau khi chúng tôi kiểm tra số 0 chúng tôi 382 00:21:41,290 --> 00:21:43,460 chuỗi t được s. 383 00:21:43,460 --> 00:21:44,690 Vâng, hãy để tôi tuyên bố t. 384 00:21:44,690 --> 00:21:47,730 Tôi sẽ vẽ nó như một hình vuông, 32 bit, gọi nó là t. 385 00:21:47,730 --> 00:21:49,740 Và sau đó tôi sẽ làm được s. 386 00:21:49,740 --> 00:21:51,130 >> Vâng, điều đó không có nghĩa là gì? 387 00:21:51,130 --> 00:21:53,280 Vâng, đó là một chút khó khăn để nghĩ về nó hình khôn ngoan. 388 00:21:53,280 --> 00:21:55,025 Nhưng chúng ta hãy suy nghĩ về những gì bên trong của x? 389 00:21:55,025 --> 00:21:59,430 Những gì là nghĩa đen bên trong biến này? 390 00:21:59,430 --> 00:22:01,500 Các Ox123 giá trị. 391 00:22:01,500 --> 00:22:05,815 >> Vì vậy, khi tôi nói chuỗi t được s, mà chỉ có nghĩa là có số lượng 392 00:22:05,815 --> 00:22:10,070 trong, mà là Ox123 và đặt nó Ox123. 393 00:22:10,070 --> 00:22:13,740 Hoặc những bức tranh, nếu tôi loại trừu tượng đi từ chi tiết mà nó có 394 00:22:13,740 --> 00:22:16,600 hiệu lực của nghĩa đen làm này là tốt. 395 00:22:16,600 --> 00:22:22,110 >> Vì vậy, bây giờ, nghĩ lại tuần trước khi chúng tôi tiến hành tư T. tôi 396 00:22:22,110 --> 00:22:23,800 T đã làm khung 0. 397 00:22:23,800 --> 00:22:27,150 Vâng, T khung 0, mặc dù đó là một con trỏ, bạn có thể đối xử với nó như thể 398 00:22:27,150 --> 00:22:29,220 nó là một mảng, với một hình vuông khung ký hiệu. 399 00:22:29,220 --> 00:22:31,550 >> Vì vậy, nơi là T khung 0? 400 00:22:31,550 --> 00:22:32,990 Vâng, đó là h. 401 00:22:32,990 --> 00:22:36,800 Và khi chúng tôi sử dụng dòng mã, hai phía trên, đó là trong đó c type.h 402 00:22:36,800 --> 00:22:38,460 tập tin tiêu đề, đó là nơi nó tuyên bố. 403 00:22:38,460 --> 00:22:44,410 Bạn đang tận H. này Nhưng Tất nhiên, đó là h chính xác đó là 404 00:22:44,410 --> 00:22:46,540 bên trong, do đó, để nói chuyện. 405 00:22:46,540 --> 00:22:51,930 Và vì vậy bây giờ bạn đã thay đổi hoặc vốn đầu tư cả hai bản gốc và 406 00:22:51,930 --> 00:22:53,120 cái gọi là bản sao. 407 00:22:53,120 --> 00:22:56,620 Bởi vì bạn đã không tạo một bản sao trong cách mà một con người sẽ muốn nó được. 408 00:22:56,620 --> 00:22:59,710 >> Vì vậy, những gì đã được sửa chữa ở đây, trong copy1.c tuần trước? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Chức năng, vì vậy chúng tôi có thể thực sự sao chép chuỗi. 411 00:23:05,580 --> 00:23:08,700 Và về cơ bản, những gì chúng ta cần phải làm để sao chép chuỗi? 412 00:23:08,700 --> 00:23:12,070 >> Vâng, trong phiên bản này màu xanh lá cây ở đây tôi sẽ làm điều đó ở mức khá thấp. 413 00:23:12,070 --> 00:23:14,260 Thực tế, có chức năng họ có thể giúp đỡ với điều này. 414 00:23:14,260 --> 00:23:17,710 Nhưng một trong những cơ bản nhất, và nhiều nhất một quen thuộc, ít nhất, sẽ sớm được 415 00:23:17,710 --> 00:23:19,600 quen thuộc với chúng ta, là như sau - 416 00:23:19,600 --> 00:23:21,910 do đó, một trên dòng đầu tiên mã trong xanh bây giờ. 417 00:23:21,910 --> 00:23:23,970 >> Tôi chỉ viết lại như là char *. 418 00:23:23,970 --> 00:23:25,250 Không có chức năng sự khác biệt đó. 419 00:23:25,250 --> 00:23:28,790 Tôi chỉ ném đi những thư viện và CS50 Tôi gọi nó là gì, một *. 420 00:23:28,790 --> 00:23:31,640 >> Bây giờ dấu chấm, dấu chấm, dấu chấm, bởi vì có một số kiểm tra lỗi đó không phải là 421 00:23:31,640 --> 00:23:33,200 thú vị để nói về một lần nữa. 422 00:23:33,200 --> 00:23:34,710 Vì vậy, bây giờ t được khai báo. 423 00:23:34,710 --> 00:23:35,780 Nó cũng là một char *. 424 00:23:35,780 --> 00:23:38,280 Vì vậy, tôi đã vẽ một hình vuông nhỏ trên màn hình như trước. 425 00:23:38,280 --> 00:23:41,870 >> Nhưng ở phía bên phải, malloc, chúng tôi đã nói là bộ nhớ phân bổ. 426 00:23:41,870 --> 00:23:44,130 Vì vậy, phân bổ một số đoạn bộ nhớ. 427 00:23:44,130 --> 00:23:48,830 Và bao nhiêu byte làm chúng tôi thực sự muốn phân bổ, nó có vẻ? 428 00:23:48,830 --> 00:23:50,340 >> Vâng, chiều dài chuỗi s. 429 00:23:50,340 --> 00:23:52,310 Vì vậy nếu nó xin chào đó là sẽ là năm. 430 00:23:52,310 --> 00:23:53,950 Chúng tôi sẽ nói h-e-l-l-o. 431 00:23:53,950 --> 00:23:55,090 Vì vậy, năm byte. 432 00:23:55,090 --> 00:23:57,960 >> Nhưng sau đó cộng thêm 1, tại sao 1? 433 00:23:57,960 --> 00:23:58,830 Nhân vật 0. 434 00:23:58,830 --> 00:24:03,640 Nếu chúng ta không cho phép những anh chàng này, chúng tôi có thể vô tình tạo ra một tình huống 435 00:24:03,640 --> 00:24:05,600 nơi chuỗi là h-e-l-l-o. 436 00:24:05,600 --> 00:24:08,470 Và sau đó là thời gian GetString tiếp theo là gọi và tôi gõ vào, ví dụ, 437 00:24:08,470 --> 00:24:14,020 David, D-một-v-i-d, máy tính sẽ nghĩ rằng s thực sự là 438 00:24:14,020 --> 00:24:18,900 h-e-l-l-o-d-một-v-i-d bởi vì có không phá vỡ ở giữa những từ đó. 439 00:24:18,900 --> 00:24:19,810 >> Vì vậy, chúng ta cần phá vỡ đó. 440 00:24:19,810 --> 00:24:20,720 Vì vậy, chúng tôi không muốn năm. 441 00:24:20,720 --> 00:24:22,100 Chúng tôi muốn sáu byte. 442 00:24:22,100 --> 00:24:23,110 >> Và byte tôi nói. 443 00:24:23,110 --> 00:24:25,220 Nhưng nó thực sự thời gian kích thước của char. 444 00:24:25,220 --> 00:24:28,040 Về mặt kỹ thuật char gần như luôn luôn là một byte. 445 00:24:28,040 --> 00:24:31,030 >> Nhưng chỉ để làm cho mã của chúng tôi cầm tay, vậy để nói chuyện, để nó hoạt động trên 446 00:24:31,030 --> 00:24:33,750 máy tính khác nhau ngay cả khi họ có thể thể hơi khác nhau bên dưới 447 00:24:33,750 --> 00:24:36,590 mui xe, tôi sẽ tổng quát nói rằng kích thước của char để 448 00:24:36,590 --> 00:24:37,660 mã của tôi luôn luôn làm việc. 449 00:24:37,660 --> 00:24:40,610 Và tôi không cần phải biên dịch lại nó chỉ bởi vì tôi nâng cấp máy tính của tôi hay sử dụng 450 00:24:40,610 --> 00:24:42,140 một số nền tảng khác nhau. 451 00:24:42,140 --> 00:24:45,300 >> Vì vậy, tôi đã có 6 lần kích thước của một char, mà sẽ xảy ra là 1. 452 00:24:45,300 --> 00:24:47,440 Vì vậy, đó có nghĩa là có thể malloc cung cấp cho tôi sáu byte. 453 00:24:47,440 --> 00:24:49,140 Là những gì mà thực sự đang làm gì? 454 00:24:49,140 --> 00:24:52,810 Vâng, hãy để tôi quay trở lại trong thời gian ở đây nơi chúng ta đang ở trong câu chuyện. 455 00:24:52,810 --> 00:24:57,620 >> Vì vậy, nếu tôi quay trở lại đây, tôi đã tuyên bố một * char gọi là t. 456 00:24:57,620 --> 00:25:00,280 Bây giờ tôi đã gọi là malloc trong sáu byte. 457 00:25:00,280 --> 00:25:06,400 Và bây giờ tôi sẽ rút ra những sáu byte giống như mảng trước đó. 458 00:25:06,400 --> 00:25:10,570 Nhưng tôi thực sự không biết điều gì trong mảng này. 459 00:25:10,570 --> 00:25:14,640 >> Nếu bạn cấp phát bộ nhớ nó chỉ ra rằng bạn không thể tin tưởng rằng có một số 460 00:25:14,640 --> 00:25:15,810 giá trị đã biết đó. 461 00:25:15,810 --> 00:25:18,400 Nó có thể được sử dụng bởi một cái gì đó khác, một số chức năng khác, một số khác 462 00:25:18,400 --> 00:25:19,630 dòng mã mà bạn đã viết. 463 00:25:19,630 --> 00:25:22,870 Vì vậy, chúng ta thường gọi là các rác thải giá trị và vẽ chúng, có lẽ, như 464 00:25:22,870 --> 00:25:26,170 dấu hỏi, chỉ cho thấy rằng chúng tôi không biết những gì thực sự ở đó. 465 00:25:26,170 --> 00:25:30,390 Và đó là không có việc lớn, miễn là chúng tôi có đủ thông minh để ghi đè lên những 466 00:25:30,390 --> 00:25:34,550 giá trị rác với số lượng hoặc ký tự mà chúng tôi quan tâm. 467 00:25:34,550 --> 00:25:36,340 >> Vì vậy, trong trường hợp này những gì tôi sẽ làm gì? 468 00:25:36,340 --> 00:25:38,670 Vâng, dòng của tôi về code tiếp theo, tôi có bốn. 469 00:25:38,670 --> 00:25:41,350 int tôi nhận được 0, n nhận được chiều dài chuỗi s. 470 00:25:41,350 --> 00:25:42,750 Vì vậy, một quen thuộc cho vòng lặp. 471 00:25:42,750 --> 00:25:45,875 Tôi là nhỏ hơn hoặc bằng n, mà thường là ở trên. 472 00:25:45,875 --> 00:25:47,500 >> Nhưng lần này là có chủ ý. 473 00:25:47,500 --> 00:25:51,890 I + +, và sau đó tôi chỉ đơn giản là làm t khung tôi được s. 474 00:25:51,890 --> 00:25:56,320 Bởi vì hình ảnh của tôi trông như thế này tại thời điểm này, được lưu trữ trong t là 475 00:25:56,320 --> 00:25:59,530 địa chỉ của người đoạn ngẫu nhiên của bộ nhớ giá trị mà chưa được biết. 476 00:25:59,530 --> 00:26:03,030 Nhưng ngay sau khi tôi làm t khung 0 mà đặt tôi ở đây. 477 00:26:03,030 --> 00:26:07,430 >> Và những gì kết thúc lên nhận rút ra có? 478 00:26:07,430 --> 00:26:08,740 Chúng tôi sẽ đặt h. 479 00:26:08,740 --> 00:26:11,170 Bởi vì đó là những gì tại s khung 0. 480 00:26:11,170 --> 00:26:14,300 Và sau đó điều tương tự cho điện tử, và tôi, và tôi, và o. 481 00:26:14,300 --> 00:26:17,930 >> n, tại sao tôi đi lên thông qua một bằng n? 482 00:26:17,930 --> 00:26:19,200 Vì nhân vật 0. 483 00:26:19,200 --> 00:26:23,580 Vì vậy, chỉ cần được rõ ràng, sau đó, nếu tôi thực sự xóa bất cứ điều gì những rác 484 00:26:23,580 --> 00:26:28,870 giá trị này và sau đó thực sự thu hút những gì tôi mong đợi, đây là s khung 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, cộng với đó là theo sau nhân vật mới. 486 00:26:32,440 --> 00:26:36,080 >> Và vì vậy bây giờ nếu chúng tôi tiếp tục qua các dấu chấm, dấu chấm, dấu chấm trong phiên bản chính xác này 487 00:26:36,080 --> 00:26:41,930 và hoa t khung 0 Tôi sẽ, của Tất nhiên, được tận dụng chỉ này 488 00:26:41,930 --> 00:26:47,050 chàng trai ở đây, mà khái niệm, là mục tiêu cuối cùng. 489 00:26:47,050 --> 00:26:48,040 Vì vậy, đó là tất cả các con trỏ. 490 00:26:48,040 --> 00:26:51,430 >> Và bạn đã sử dụng chúng trong nhiều tuần bây giờ trong bối cảnh của chuỗi. 491 00:26:51,430 --> 00:26:53,530 Nhưng bên dưới mui xe chúng một chút phức tạp hơn. 492 00:26:53,530 --> 00:26:57,520 Nhưng nếu bạn nghĩ về họ trong này dưới dạng ảnh tôi đề nghị rằng họ đang 493 00:26:57,520 --> 00:27:01,720 có lẽ không phải tất cả mà đáng sợ như họ đầu tiên có vẻ ở cái nhìn đầu tiên, 494 00:27:01,720 --> 00:27:04,730 đặc biệt là với cú pháp mới như vậy. 495 00:27:04,730 --> 00:27:07,290 Bất kỳ câu hỏi về con trỏ, chuỗi, hoặc ký tự? 496 00:27:07,290 --> 00:27:07,580 Yeah? 497 00:27:07,580 --> 00:27:09,252 >> ĐỐI TƯỢNG: bạn có thể quay trở lại đến [nghe được]? 498 00:27:09,252 --> 00:27:10,502 >> SPEAKER 1: Chắc chắn. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> ĐỐI TƯỢNG: Vậy làm thế nào đến trong của bạn cuối cùng dòng, bạn không có một * t dòng 501 00:27:19,525 --> 00:27:21,513 và một * s trong dòng? 502 00:27:21,513 --> 00:27:23,004 Bạn không có tham chiếu đến - 503 00:27:23,004 --> 00:27:24,640 >> SPEAKER 1: Ah, một câu hỏi thực sự tốt. 504 00:27:24,640 --> 00:27:26,800 Tại sao tôi không có một * t và * s? 505 00:27:26,800 --> 00:27:30,340 Bởi vì một thời gian ngắn, tuần trước, như trong của chúng tôi chức năng trao đổi, tôi đã nói rằng khi 506 00:27:30,340 --> 00:27:33,350 bạn đã có một con trỏ phương tiện mà bạn đi đến đó như chúng tôi đã làm 507 00:27:33,350 --> 00:27:36,590 vật lý trên sân khấu, là để thực sự sử dụng các nhà điều hành sao. 508 00:27:36,590 --> 00:27:40,570 >> Nó chỉ ra rằng điều này vuông-khung ký hiệu là những gì chúng tôi sẽ gọi cú pháp 509 00:27:40,570 --> 00:27:44,190 đường, mà chỉ là một cách gợi cảm của nói rằng đó là viết tắt ký hiệu cho 510 00:27:44,190 --> 00:27:45,950 chính xác những gì bạn đang mô tả. 511 00:27:45,950 --> 00:27:49,385 Nhưng đó là một ít trực quan hơn. 512 00:27:49,385 --> 00:27:53,510 Và có nguy cơ làm cho điều này có vẻ hơn phức tạp hơn nó cần phải được, 513 00:27:53,510 --> 00:27:56,990 những gì đang thực sự xảy ra ở đây như sau - 514 00:27:56,990 --> 00:28:01,450 Nếu tôi nói * t đó có nghĩa là đi đến địa chỉ được lưu trữ trong t. 515 00:28:01,450 --> 00:28:04,350 >> Vì vậy, theo nghĩa đen, nếu t được lưu trữ các địa chỉ của người h 516 00:28:04,350 --> 00:28:07,300 ban đầu, * t phương tiện đi đây. 517 00:28:07,300 --> 00:28:10,730 Bây giờ, những gì t khung 0 nghĩa là gì? 518 00:28:10,730 --> 00:28:11,560 Cùng một điều chính xác. 519 00:28:11,560 --> 00:28:13,510 Nó chỉ là một ít người sử dụng hơn thân thiện với người viết. 520 00:28:13,510 --> 00:28:14,430 >> Nhưng tôi không thực hiện được nêu ra. 521 00:28:14,430 --> 00:28:17,800 Tôi không thể chỉ nói * t được * s. 522 00:28:17,800 --> 00:28:19,440 Bởi vì những gì tôi sẽ làm sau đó? 523 00:28:19,440 --> 00:28:22,950 Tôi muốn được đặt h, h, h, h, h trong suốt toàn bộ điều. 524 00:28:22,950 --> 00:28:22,995 Phải không? 525 00:28:22,995 --> 00:28:26,020 >> Vì * t là đi đến các địa chỉ trong t. 526 00:28:26,020 --> 00:28:27,580 Nhưng chúng ta đang ở trong một vòng lặp. 527 00:28:27,580 --> 00:28:32,150 Và những gì giá trị tôi incrementing, tất nhiên, trên mỗi lần lặp? 528 00:28:32,150 --> 00:28:32,690 i. 529 00:28:32,690 --> 00:28:34,590 >> Nhưng có một cơ hội ở đây, phải không? 530 00:28:34,590 --> 00:28:37,870 Mặc dù điều này cảm thấy như nó nhận được nhiều hơn một chút tinh vi 531 00:28:37,870 --> 00:28:40,730 hơn các ký hiệu vuông-khung chúng tôi đã sử dụng một thời gian - 532 00:28:40,730 --> 00:28:43,840 cho tôi lùi lại thay đổi giờ của tôi có - 533 00:28:43,840 --> 00:28:48,870 mặc dù điều này bây giờ là nhận được một chút fancier, ý tưởng cơ bản, nếu * t 534 00:28:48,870 --> 00:28:53,630 có nghĩa là ở đây và * t chỉ là đi đến địa chỉ trong t. 535 00:28:53,630 --> 00:28:54,990 >> Nhưng những gì đã được địa chỉ trong t? 536 00:28:54,990 --> 00:28:56,850 Số lượng, chúng tôi tiếp tục sử dụng? 537 00:28:56,850 --> 00:29:00,540 Như Ox456, chúng ta hãy mang lại cho rằng trở lại chỉ vì lợi ích của cuộc thảo luận. 538 00:29:00,540 --> 00:29:05,380 Vâng, nếu tôi muốn có được ở các điện tử trong t chuỗi, tôi chỉ muốn đi đến, 539 00:29:05,380 --> 00:29:06,460 về cơ bản, 456. 540 00:29:06,460 --> 00:29:09,230 >> Hay đúng hơn, 457. 541 00:29:09,230 --> 00:29:10,590 Tôi chỉ cần thêm một. 542 00:29:10,590 --> 00:29:11,790 Nhưng tôi có thể làm điều đó, phải không? 543 00:29:11,790 --> 00:29:14,680 Vì t, mặc dù tôi giữ cho bản vẽ nó bây giờ như một mũi tên, nó chỉ là một 544 00:29:14,680 --> 00:29:16,570 số, Ox456. 545 00:29:16,570 --> 00:29:21,400 Và nếu tôi thêm một đến đó, hoặc hơn nói chung, nếu tôi thêm tôi để tôi có thể 546 00:29:21,400 --> 00:29:24,350 thực sự có được chính xác nơi mà tôi muốn. 547 00:29:24,350 --> 00:29:26,260 Vì vậy, nếu tôi thực sự làm được điều này - 548 00:29:26,260 --> 00:29:28,970 và đây là những gì bây giờ được gọi là con trỏ số học - 549 00:29:28,970 --> 00:29:30,375 Tôi có thể loại bỏ dòng này. 550 00:29:30,375 --> 00:29:33,550 Đó là, thẳng thắn mà nói, tôi nghĩ rằng rõ ràng hơn và một ít người sử dụng thân thiện hơn để đọc. 551 00:29:33,550 --> 00:29:35,970 Nhưng điều này là không ít chính xác. 552 00:29:35,970 --> 00:29:38,570 >> Dòng mã này hiện đang sử dụng con trỏ số học. 553 00:29:38,570 --> 00:29:40,920 Nó nói đến địa chỉ sau đây - 554 00:29:40,920 --> 00:29:44,670 bất cứ điều gì khi bắt đầu t là, mà là t cộng với tôi, ban đầu 555 00:29:44,670 --> 00:29:45,730 là 0, đó là rất tốt. 556 00:29:45,730 --> 00:29:49,280 Bởi vì đó có nghĩa là sự khởi đầu của t cộng với 1, cộng với 2, và 3, và vv. 557 00:29:49,280 --> 00:29:51,030 Và cùng đối phó với s. 558 00:29:51,030 --> 00:29:52,750 >> Vì vậy, đường cú pháp cho việc này. 559 00:29:52,750 --> 00:29:55,900 Nhưng sự hiểu biết những gì đang thực sự xảy ra bên dưới mui xe, tôi sẽ tranh luận, 560 00:29:55,900 --> 00:29:57,410 là thực sự hữu ích trong và của chính nó. 561 00:29:57,410 --> 00:30:00,620 Bởi vì nó có nghĩa là bây giờ có không ma thuật nhiều hơn nữa xảy ra 562 00:30:00,620 --> 00:30:01,620 bên dưới mui xe. 563 00:30:01,620 --> 00:30:03,920 Có sẽ không có nhiều hơn lớp chúng ta có thể gọt vỏ sao cho bạn. 564 00:30:03,920 --> 00:30:04,810 Đây là c. 565 00:30:04,810 --> 00:30:06,410 Và điều này được lập trình. 566 00:30:06,410 --> 00:30:08,002 Thực sự tốt câu hỏi. 567 00:30:08,002 --> 00:30:11,570 >> Được rồi, vì vậy đây là lỗi mà chương trình tôi đã đề cập đến trước đó. 568 00:30:11,570 --> 00:30:12,650 trao đổi là sai lầm. 569 00:30:12,650 --> 00:30:14,070 Nếu không có vẻ làm việc. 570 00:30:14,070 --> 00:30:17,390 Nhớ lại rằng giống như với sữa và nước cam - mà tôi bắt đầu 571 00:30:17,390 --> 00:30:18,660 uống cuộc biểu tình ngày hôm nay. 572 00:30:18,660 --> 00:30:22,220 Vì vậy, cũng giống như với các nước cam và sữa, chúng tôi đã phải sử dụng một 573 00:30:22,220 --> 00:30:26,200 biến tạm thời, tmp, để tổ chức một tạm thời để chúng tôi có thể sau đó 574 00:30:26,200 --> 00:30:28,820 thay đổi giá trị của nó và sau đó cập nhật b. 575 00:30:28,820 --> 00:30:32,870 >> Nhưng chức năng này, chúng tôi đã nói, hoặc này chương trình trong chức năng này là 576 00:30:32,870 --> 00:30:35,670 viết là sai và thiếu sót, tại sao? 577 00:30:35,670 --> 00:30:38,870 578 00:30:38,870 --> 00:30:39,090 Có? 579 00:30:39,090 --> 00:30:42,471 >> ĐỐI TƯỢNG: [nghe được]. 580 00:30:42,471 --> 00:30:44,940 >> SPEAKER 1: Chính xác, khi bạn gọi swap - 581 00:30:44,940 --> 00:30:47,820 hay rộng hơn, khi bạn gọi hầu hết mọi chức năng - 582 00:30:47,820 --> 00:30:51,210 nếu các đối số chức năng mà nguyên thủy, có thể nói, số nguyên và ký tự 583 00:30:51,210 --> 00:30:56,740 và tăng gấp đôi và phao nổi, điều mà không sao, bạn đang đi qua trong một bản sao của 584 00:30:56,740 --> 00:30:57,540 các đối số. 585 00:30:57,540 --> 00:31:01,580 Vì vậy, nếu x là 1 và y là 2, sẽ là 1 và b là có được 2. 586 00:31:01,580 --> 00:31:05,250 Nhưng họ sẽ có những phần khác nhau bit, khối khác nhau 587 00:31:05,250 --> 00:31:07,540 bộ nhớ điều đó xảy ra được lưu trữ giá trị giống nhau. 588 00:31:07,540 --> 00:31:12,160 >> Vì vậy, mã này là siêu hoàn hảo tại trao đổi a và b. 589 00:31:12,160 --> 00:31:13,850 Đó là không tốt trao đổi - 590 00:31:13,850 --> 00:31:15,290 Ví dụ trong tuần trước - 591 00:31:15,290 --> 00:31:16,390 x và y. 592 00:31:16,390 --> 00:31:18,780 Bởi vì một lần nữa, họ trong phạm vi sai. 593 00:31:18,780 --> 00:31:21,310 >> Bây giờ, làm thế nào chúng tôi đi về sửa chữa này? 594 00:31:21,310 --> 00:31:23,140 Chúng tôi phải làm cho chức năng trông xấu hơn chút. 595 00:31:23,140 --> 00:31:25,250 Nhưng một lần nữa, hãy xem xét những gì điều này chỉ có nghĩa là. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> Và trên thực tế, cho tôi, cho nhất quán, thay đổi một điều để nó giống y hệt 598 00:31:31,500 --> 00:31:33,200 những gì chúng ta đã làm. 599 00:31:33,200 --> 00:31:35,690 Như tôi đã đề cập tuần trước, nó không quan trọng, nơi nó đi. 600 00:31:35,690 --> 00:31:38,120 Trong thực tế, thường bạn sẽ đặt các ngôi sao bên cạnh tên biến. 601 00:31:38,120 --> 00:31:40,750 Nhưng tôi nghĩ rằng nó sẽ là một chút dễ dàng hơn để xem xét * bên cạnh 602 00:31:40,750 --> 00:31:44,910 kiểu dữ liệu như có nghĩa là nó là một con trỏ đến một int trong trường hợp này. 603 00:31:44,910 --> 00:31:46,270 >> Vì vậy, những gì tôi làm ở đây? 604 00:31:46,270 --> 00:31:49,590 Tôi nói không cho tôi một int tiếp theo int khác, 605 00:31:49,590 --> 00:31:50,810 gọi họ là a và b. 606 00:31:50,810 --> 00:31:52,460 Cung cấp cho tôi địa chỉ của một int. 607 00:31:52,460 --> 00:31:53,960 Cho tôi địa chỉ của int khác. 608 00:31:53,960 --> 00:31:56,330 Gọi những địa chỉ a và b. 609 00:31:56,330 --> 00:32:00,860 >> Và sau đó sử dụng các kí hiệu * xuống dưới đây, đi với nhau của những địa chỉ 610 00:32:00,860 --> 00:32:05,290 khi cần thiết hoặc là có được hoặc thiết lập giá trị của nó. 611 00:32:05,290 --> 00:32:07,400 Nhưng có một ngoại lệ ở đây. 612 00:32:07,400 --> 00:32:11,130 Tại sao tôi không có * bên cạnh tmp? 613 00:32:11,130 --> 00:32:15,070 Tại sao tôi không làm điều này, chẳng hạn? 614 00:32:15,070 --> 00:32:19,370 Nó cảm thấy như tôi chỉ nên đi tất cả ra và sửa chữa toàn bộ điều. 615 00:32:19,370 --> 00:32:19,752 Yeah? 616 00:32:19,752 --> 00:32:21,002 >> ĐỐI TƯỢNG: [nghe được]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> SPEAKER 1: Tôi đã không tuyên bố tmp như một chuỗi. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Vì vậy, đây sẽ tuyên bố, trong trường hợp này, một tmp là địa chỉ của một int. 621 00:32:34,950 --> 00:32:37,380 Nhưng đó không phải là hoàn toàn những gì tôi muốn, cho một vài lý do. 622 00:32:37,380 --> 00:32:38,616 >> ĐỐI TƯỢNG: Bạn không muốn trao đổi chúng. 623 00:32:38,616 --> 00:32:41,800 >> SPEAKER 1: Chính xác, tôi không muốn trao đổi bất cứ điều gì với tmp. tmp chỉ là 624 00:32:41,800 --> 00:32:42,790 tuần-một công cụ. 625 00:32:42,790 --> 00:32:45,150 Tất cả tôi muốn là một biến để lưu trữ một số lượng. 626 00:32:45,150 --> 00:32:47,330 Tôi thậm chí không quan tâm đến địa chỉ tại thời điểm này. 627 00:32:47,330 --> 00:32:50,530 >> Tôi chỉ cần 32 bit hoặc do đó, để lưu trữ một số nguyên. 628 00:32:50,530 --> 00:32:56,690 Và tôi muốn để đưa vào những 32 bit bất cứ điều gì không phải là trong một, có thể nói, nhưng 629 00:32:56,690 --> 00:33:01,260 những gì đang có một, chỉ để được chính xác hơn. 630 00:33:01,260 --> 00:33:06,420 Bởi vì nếu một là một địa chỉ, một phương tiện * đến đó và nhận được giá trị 1. 631 00:33:06,420 --> 00:33:10,560 Ví dụ, trong ví dụ tuần trước hoặc trong trường hợp b, có được giá trị của 2. 632 00:33:10,560 --> 00:33:11,750 >> Vì vậy, những gì đang thực sự xảy ra? 633 00:33:11,750 --> 00:33:15,070 Hãy để tôi vẽ một bức tranh ở đây là sẽ chỉ trêu chọc nhau một phần của ngày hôm nay. 634 00:33:15,070 --> 00:33:18,580 Nhưng điều này sẽ tiếp tục xuất hiện trong một thời gian. 635 00:33:18,580 --> 00:33:22,430 >> Này, tôi khẳng định, là những gì máy tính của bạn bộ nhớ trông giống như khi bạn chạy một 636 00:33:22,430 --> 00:33:24,060 chương trình, bất kỳ chương trình. 637 00:33:24,060 --> 00:33:28,340 Khi bạn chạy một chương trình ở đầu RAM máy tính của bạn - vì vậy suy nghĩ của 638 00:33:28,340 --> 00:33:33,530 hình chữ nhật này, thực sự, như của bạn RAM hoặc bộ nhớ máy tính, tất cả 101 639 00:33:33,530 --> 00:33:36,920 tỷ byte của nó, tất cả hai tỷ byte, tất cả hai gigabyte của nó, 640 00:33:36,920 --> 00:33:39,910 bất kể số lượng bạn có được, hãy vẽ nó như một hình chữ nhật. 641 00:33:39,910 --> 00:33:43,260 Và tôi cho rằng khi bạn chạy một chương trình như Microsoft Word hoặc Chrome 642 00:33:43,260 --> 00:33:49,220 hoặc bất cứ điều gì như thế, các bit Microsoft hoặc Google viết - 643 00:33:49,220 --> 00:33:50,910 trong các trường hợp của các chương trình này - 644 00:33:50,910 --> 00:33:54,490 được nạp vào bộ nhớ máy tính của bạn nơi họ có thể được thực thi hơn 645 00:33:54,490 --> 00:33:57,520 nhanh chóng và đưa vào các CPU, là bộ não của máy tính. 646 00:33:57,520 --> 00:34:00,940 >> Và trong TAM chúng được lưu trữ ở rất đầu chương trình của bạn, do đó, để nói chuyện. 647 00:34:00,940 --> 00:34:03,300 Nói cách khác, nếu điều này là một đoạn bộ nhớ, khi bạn kích đúp vào 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, các bit đến ra khỏi ổ đĩa cứng. 649 00:34:05,740 --> 00:34:06,680 Họ có được nạp vào bộ nhớ RAM. 650 00:34:06,680 --> 00:34:10,330 Và chúng tôi sẽ xô chúng ở đầu của hình chữ nhật này khái niệm. 651 00:34:10,330 --> 00:34:13,010 >> Vâng, phần còn lại của bộ nhớ của bạn sử dụng cho những thứ khác nhau. 652 00:34:13,010 --> 00:34:16,460 Ở phía trên bạn sẽ thấy khởi tạo dữ liệu và uninitialize dữ liệu. 653 00:34:16,460 --> 00:34:20,500 Điều này đã làm cho hầu hết các phần, với hằng hoặc biến toàn cầu 654 00:34:20,500 --> 00:34:21,340 có giá trị. 655 00:34:21,340 --> 00:34:22,980 Nhưng nhiều hơn về những thời điểm khác. 656 00:34:22,980 --> 00:34:25,150 >> Sau đó, bạn có đống, mà chúng tôi sẽ quay trở lại. 657 00:34:25,150 --> 00:34:28,420 Nhưng ở phía dưới là phần đó là đặc biệt là Gecman ngay bây giờ. 658 00:34:28,420 --> 00:34:30,210 Đó là cái gọi là chồng. 659 00:34:30,210 --> 00:34:33,850 Vì vậy, giống như trong hầu hết mọi trường D đây trên khuôn viên trường, bạn có những khay đó 660 00:34:33,850 --> 00:34:37,210 chỉ chồng lên nhau mà bạn có thể đặt thức ăn và những thứ linh tinh. 661 00:34:37,210 --> 00:34:40,139 Ngăn xếp trong một hệ thống máy tính là rất giống nhau. 662 00:34:40,139 --> 00:34:42,679 Ngoại trừ trong khi khay, như chúng tôi sử dụng trong phòng ăn, tất nhiên, có nghĩa là 663 00:34:42,679 --> 00:34:45,710 để mang đồ vật các khay hoặc khung - 664 00:34:45,710 --> 00:34:49,469 như chúng tôi sẽ gọi cho họ - trong một máy tính bộ nhớ được sử dụng để giữ 665 00:34:49,469 --> 00:34:51,610 biến và giá trị. 666 00:34:51,610 --> 00:34:53,929 >> Vì vậy, những gì thực sự diễn ra bên dưới mui xe? 667 00:34:53,929 --> 00:34:55,820 Vâng, hãy để tôi lật qua để màn hình ở đây. 668 00:34:55,820 --> 00:34:58,370 Và chúng ta hãy chỉ tập trung vào các phần dưới cùng một lúc. 669 00:34:58,370 --> 00:35:02,770 Nếu điều này là phần dưới của tôi bộ nhớ máy tính của nó quay ra khi tôi 670 00:35:02,770 --> 00:35:05,350 gọi chức năng chính - trong đó xảy ra, thẳng thắn, 671 00:35:05,350 --> 00:35:06,950 tự động cho tôi - 672 00:35:06,950 --> 00:35:10,510 Tôi nhận được một đoạn bộ nhớ tại dưới cùng của bộ nhớ RAM của tôi có thể nói. 673 00:35:10,510 --> 00:35:13,390 Và đây là nơi mà chính là các biến địa phương đi. 674 00:35:13,390 --> 00:35:16,770 Đó là nơi argc và argv có thể đi, và bất kỳ biến tôi 675 00:35:16,770 --> 00:35:18,170 tuyên bố bên trong chính. 676 00:35:18,170 --> 00:35:20,260 Họ kết thúc ở phía dưới RAM máy tính của tôi. 677 00:35:20,260 --> 00:35:25,040 >> Bây giờ giả sử rằng các cuộc gọi một chức năng chính như trao đổi, giống như nó đã làm tuần trước? 678 00:35:25,040 --> 00:35:30,620 Vâng, chúng tôi chủ yếu đặt một khay mới, một khung mới, lên đoạn của tôi về bộ nhớ. 679 00:35:30,620 --> 00:35:34,160 Và tôi sẽ mô tả điều này như thuộc chức năng trao đổi. 680 00:35:34,160 --> 00:35:35,770 >> Bây giờ bên trong trao đổi là gì? 681 00:35:35,770 --> 00:35:39,240 Vâng, dựa trên chương trình tuần trước và mà chúng ta chỉ thấy một đoạn trích từ, 682 00:35:39,240 --> 00:35:46,590 bên trong khung trao đổi, hoặc trên trao đổi của khay, những gì đang có biến? 683 00:35:46,590 --> 00:35:47,970 Vâng, a và b. 684 00:35:47,970 --> 00:35:51,850 Bởi vì đó là những đối số địa phương, cộng với một phần ba, tmp. 685 00:35:51,850 --> 00:35:54,470 Vì vậy, thực sự, tôi có thể vẽ này một chút sạch hơn. 686 00:35:54,470 --> 00:35:56,680 Hãy để tôi đi về phía trước và quay lại nhãn. 687 00:35:56,680 --> 00:35:58,520 Và cho tôi cho rằng bạn biết những gì? 688 00:35:58,520 --> 00:36:00,560 >> một có lẽ sẽ kết thúc ở đây. 689 00:36:00,560 --> 00:36:02,160 B sẽ kết thúc ở đây. 690 00:36:02,160 --> 00:36:03,810 Tmp và sẽ kết thúc ở đây. 691 00:36:03,810 --> 00:36:05,160 Bây giờ, đặt hàng might là một chút khác nhau. 692 00:36:05,160 --> 00:36:06,840 Nhưng khái niệm này là ý tưởng. 693 00:36:06,840 --> 00:36:11,490 >> Và chỉ chung, đây là những gì chúng tôi sẽ gọi cho khung trao đổi, hoặc 694 00:36:11,490 --> 00:36:12,136 khay ăn uống, hội họp. 695 00:36:12,136 --> 00:36:13,150 Và cùng thỏa thuận với chính. 696 00:36:13,150 --> 00:36:14,040 Nhưng tôi sẽ không vẽ lại đó. 697 00:36:14,040 --> 00:36:17,810 Nhưng đó là nơi argc và argv và bất kỳ các biến địa phương như x và y 698 00:36:17,810 --> 00:36:18,940 có thể là tốt. 699 00:36:18,940 --> 00:36:22,170 >> Vì vậy, bây giờ xem xét những gì đang thực sự xảy ra khi bạn gọi trao đổi. 700 00:36:22,170 --> 00:36:26,370 Khi bạn gọi điện trao đổi, thực thi mã như này, bạn đang đi qua trong, trong 701 00:36:26,370 --> 00:36:30,670 lỗi phiên bản, a và b như bản sao của x và y. 702 00:36:30,670 --> 00:36:34,300 Vì vậy, nếu tôi làm bây giờ vẽ này trên màn hình - 703 00:36:34,300 --> 00:36:36,700 có để có được tốt hơn lúc này - 704 00:36:36,700 --> 00:36:40,850 để những câu chuyện tôi đã nói với bản thân mình là trong phiên bản lỗi này, khi chúng tôi 705 00:36:40,850 --> 00:36:46,130 gọi trao đổi đi qua trong nghĩa đen a và b là số nguyên, những gì đang thực sự xảy ra? 706 00:36:46,130 --> 00:36:48,250 >> Vâng, những gì thực sự xảy ra này là. 707 00:36:48,250 --> 00:36:52,850 Hãy để tôi đi về phía trước và quay lại chỉ để làm sáng tỏ một số không gian ở đây. 708 00:36:52,850 --> 00:36:54,720 Vì vậy, đây là bộ nhớ máy tính của tôi. 709 00:36:54,720 --> 00:36:57,510 >> Vì vậy, nếu tôi có, ví dụ - 710 00:36:57,510 --> 00:36:58,910 thực sự chúng ta hãy làm theo cách này - 711 00:36:58,910 --> 00:37:02,690 nếu tôi cho rằng đây là x, lưu trữ giá trị 1 chỉ như tuần trước. 712 00:37:02,690 --> 00:37:05,930 Và điều này là y, lưu trữ các giá trị 2 giống như tuần trước. 713 00:37:05,930 --> 00:37:11,370 Và điều này là chính, khi tôi gọi trao đổi, do đó cho bản thân mình truy cập vào một và 714 00:37:11,370 --> 00:37:15,150 b và tmp, tôi sẽ cho rằng đây là một và đây là 1. 715 00:37:15,150 --> 00:37:16,080 >> Đây là b. 716 00:37:16,080 --> 00:37:17,010 Đây là 2. 717 00:37:17,010 --> 00:37:18,370 Điều này được gọi là tmp. 718 00:37:18,370 --> 00:37:23,360 >> Và ban đầu, nó có một số giá trị rác cho đến khi tôi thực sự lưu trữ trong nó một, 719 00:37:23,360 --> 00:37:24,450 đó là 1. 720 00:37:24,450 --> 00:37:28,320 Sau đó, tôi đi trước và thay đổi một là những gì? 721 00:37:28,320 --> 00:37:29,720 Giá trị của B. 722 00:37:29,720 --> 00:37:31,980 >> Và vì vậy bây giờ tôi có hai đây. 723 00:37:31,980 --> 00:37:34,050 Và sau đó chúng tôi đã nói b được tmp. 724 00:37:34,050 --> 00:37:37,670 Một lần nữa, giống như kiểm tra một sự tỉnh táo, thứ ba dòng mã ở đây chỉ đơn giản là này 725 00:37:37,670 --> 00:37:39,440 một, b được tmp. 726 00:37:39,440 --> 00:37:41,730 >> Và vì vậy cuối cùng, tôi phải làm gì? 727 00:37:41,730 --> 00:37:46,800 Tôi đi trước và thay đổi b được bất cứ điều gì giá trị của tmp là, đó là 1. 728 00:37:46,800 --> 00:37:48,390 Tôi không liên lạc tmp một lần nữa. 729 00:37:48,390 --> 00:37:54,100 >> Nhưng bây giờ, vấn đề là ngay khi trao đổi lợi nhuận, bởi vì nó không bàn giao 730 00:37:54,100 --> 00:37:57,540 sao một số giá trị, không có trở lại tuyên bố một cách rõ ràng trong đó. 731 00:37:57,540 --> 00:37:59,080 Có gì thực sự xảy ra? 732 00:37:59,080 --> 00:38:03,480 Vâng, về cơ bản tất cả các bộ nhớ này - 733 00:38:03,480 --> 00:38:07,410 OK, rõ ràng tẩy thích chỉ có một ngón tay tại một thời điểm - 734 00:38:07,410 --> 00:38:08,180 chỉ biến mất. 735 00:38:08,180 --> 00:38:10,070 >> Bây giờ trong thực tế nó không đi bất cứ nơi nào. 736 00:38:10,070 --> 00:38:11,810 Nhưng bạn có thể nghĩ về nó bây giờ là dấu hỏi. 737 00:38:11,810 --> 00:38:14,040 Bởi vì nó không còn thực tế sử dụng. 738 00:38:14,040 --> 00:38:17,470 Và không có gì được thực hiện với những giá trị. 739 00:38:17,470 --> 00:38:21,920 >> Vì vậy, trong trường hợp của phiên bản màu xanh lá cây của mã này, thay vì những gì đang được 740 00:38:21,920 --> 00:38:24,640 thông qua vào trao đổi? 741 00:38:24,640 --> 00:38:25,770 Vì vậy, giải quyết. 742 00:38:25,770 --> 00:38:28,520 Vì vậy, địa chỉ của x và địa chỉ của y. 743 00:38:28,520 --> 00:38:35,790 Vì vậy, nếu chúng tôi lại kể câu chuyện này cuối cùng thời gian, và tôi thực sự rút ra trao đổi một lần nữa, 744 00:38:35,790 --> 00:38:44,620 nhưng với con trỏ, đây là một, điều này là b, và là tmp này, những gì là 745 00:38:44,620 --> 00:38:49,080 thực sự được lưu trữ trong một màu xanh lá cây này phiên bản của mã của tôi, nơi tôi đang đi qua 746 00:38:49,080 --> 00:38:52,110 trong địa chỉ? 747 00:38:52,110 --> 00:38:53,780 >> Nó sẽ là một con trỏ đến x. 748 00:38:53,780 --> 00:38:54,890 Vì vậy, tôi có thể rút ra một mũi tên. 749 00:38:54,890 --> 00:38:57,310 Nhưng chúng ta hãy sử dụng cùng một tùy ý Ví dụ như trước đây. 750 00:38:57,310 --> 00:39:01,220 Chúng ta hãy nói rằng đây là một cái gì đó như Ox123. 751 00:39:01,220 --> 00:39:04,970 Và điều này là có được Ox127 vì đó là bốn byte đi bởi vì nó là một 752 00:39:04,970 --> 00:39:07,370 int, vì vậy Ox127. 753 00:39:07,370 --> 00:39:09,080 >> Và một lần nữa, tôi sẽ lấy một số quyền tự do với các con số. 754 00:39:09,080 --> 00:39:11,430 Chúng nhỏ hơn là họ sẽ nhiều thực sự được và theo một thứ tự khác nhau. 755 00:39:11,430 --> 00:39:14,350 Nhưng đó là cách hình ảnh bây giờ khác nhau. 756 00:39:14,350 --> 00:39:19,060 >> Nhưng khi tôi sử dụng mã màu xanh lá cây này và tôi int tmp được * a. 757 00:39:19,060 --> 00:39:25,010 * Một phương tiện để làm như sau, đi giải quyết đó là trong một và đi với nó, 758 00:39:25,010 --> 00:39:26,190 đó là 1. 759 00:39:26,190 --> 00:39:28,480 Và đó là những gì tôi sau đó đặt trong tmp. 760 00:39:28,480 --> 00:39:32,480 Trong khi đó, các dòng tiếp theo của mã đây, được một * b, điều đó không có nghĩa là gì? 761 00:39:32,480 --> 00:39:36,910 >> Vâng, * a, để đi đây được * b, có nghĩa là đi đến đó. 762 00:39:36,910 --> 00:39:39,310 Và đó có nghĩa là đưa giá trị đó. 763 00:39:39,310 --> 00:39:43,670 Cuối cùng, dòng cuối cùng của mã chỉ đơn giản là nói * b được tmp. 764 00:39:43,670 --> 00:39:48,900 >> Vì vậy, b nói đến đó và ghi đè lên nó với tmp, trong trường hợp này, sẽ 765 00:39:48,900 --> 00:39:51,520 là, một lần nữa, 1. 766 00:39:51,520 --> 00:39:54,920 Và đây là lý do tại sao các phiên bản màu xanh lá cây của công trình mã của chúng tôi, trong khi màu đỏ 767 00:39:54,920 --> 00:39:56,010 phiên bản không bao giờ làm. 768 00:39:56,010 --> 00:39:59,020 Tất cả chỉ là để nắm như thế nào bộ nhớ được quản lý và nơi mà nó 769 00:39:59,020 --> 00:40:02,580 thực sự được đặt trong của bạn RAM của máy tính. 770 00:40:02,580 --> 00:40:07,270 Và bây giờ, đó là một trong những điều rằng ngăn xếp được sử dụng cho. 771 00:40:07,270 --> 00:40:09,225 >> Các câu hỏi về bố trí không? 772 00:40:09,225 --> 00:40:10,380 Trên con trỏ? 773 00:40:10,380 --> 00:40:11,630 Hoặc trao đổi? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> Được rồi, vậy malloc, thu hồi, đã làm một cái gì đó như thế này. 776 00:40:17,043 --> 00:40:18,260 Đây là một ví dụ siêu đơn giản. 777 00:40:18,260 --> 00:40:20,550 Và đây là một trong những Binky giới thiệu chúng tôi, mặc dù khá 778 00:40:20,550 --> 00:40:21,870 nhanh chóng, ở cuối lớp. 779 00:40:21,870 --> 00:40:24,480 Chết tiệt, có chúng tôi đi một lần nữa. 780 00:40:24,480 --> 00:40:28,780 >> Vì vậy, nhớ lại rằng đây là ví dụ về một Binky giới thiệu chúng tôi, mặc dù 781 00:40:28,780 --> 00:40:30,360 phần nào một cách nhanh chóng vào cuối lớp. 782 00:40:30,360 --> 00:40:33,640 Và ở đây chúng tôi sử dụng malloc thực sự lần thứ hai. 783 00:40:33,640 --> 00:40:37,330 Bởi vì lần đầu tiên chúng tôi sử dụng nó để tạo ra đủ RAM, bố trí đủ RAM 784 00:40:37,330 --> 00:40:38,340 để lưu trữ một chuỗi. 785 00:40:38,340 --> 00:40:40,250 >> Thời gian này Binky giữ nó đơn giản. 786 00:40:40,250 --> 00:40:42,465 Vì vậy, nó để lưu trữ chỉ một int, rõ ràng. 787 00:40:42,465 --> 00:40:43,510 Và đó là hoàn toàn tốt. 788 00:40:43,510 --> 00:40:46,560 Đó là một chút lạ, thẳng thắn, để sử dụng malloc để cấp phát một int. 789 00:40:46,560 --> 00:40:50,650 Nhưng điểm claymation của Nick là thực sự chỉ kể lại câu chuyện về những gì 790 00:40:50,650 --> 00:40:53,830 xảy ra hoặc không xảy ra khi bạn ngược đãi bộ nhớ. 791 00:40:53,830 --> 00:40:56,520 >> Vì vậy, trong trường hợp này, chương trình này đã làm một vài điều. 792 00:40:56,520 --> 00:41:01,580 Trong trường hợp đầu tiên ở đây, nó tuyên bố một con trỏ được gọi là x đến một int. 793 00:41:01,580 --> 00:41:04,480 Sau đó nó tuyên bố một con trỏ gọi y đến một int. 794 00:41:04,480 --> 00:41:06,150 Sau đó nó lưu trong x, những gì? 795 00:41:06,150 --> 00:41:07,110 Người khác bây giờ. 796 00:41:07,110 --> 00:41:09,685 Những gì được lưu trữ trong x theo dòng thứ ba của chương trình này? 797 00:41:09,685 --> 00:41:12,380 >> ĐỐI TƯỢNG: [nghe được]. 798 00:41:12,380 --> 00:41:14,130 >> SPEAKER 1: Vâng, không khá byte, mỗi nói. 799 00:41:14,130 --> 00:41:16,760 Được chính xác hơn bây giờ. 800 00:41:16,760 --> 00:41:18,325 Những gì được lưu trữ trong x? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 Một địa chỉ, tôi nghĩ rằng tôi nghe nó. 803 00:41:22,060 --> 00:41:23,570 >> Vì vậy, những gì malloc trở lại? 804 00:41:23,570 --> 00:41:26,030 malloc đến hành vi phân bổ một đoạn bộ nhớ. 805 00:41:26,030 --> 00:41:27,850 Nhưng làm thế nào nó cung cấp cho bạn truy cập vào nó? 806 00:41:27,850 --> 00:41:29,460 Nó sẽ trả về những gì? 807 00:41:29,460 --> 00:41:32,000 Địa chỉ của byte đầu tiên trong các đoạn bộ nhớ. 808 00:41:32,000 --> 00:41:33,020 >> Bây giờ, đây là siêu đơn giản. 809 00:41:33,020 --> 00:41:35,380 Nó chỉ là một byte, có nghĩa là giải quyết chúng tôi nhận được trở lại là 810 00:41:35,380 --> 00:41:37,300 địa chỉ của toàn bộ điều. 811 00:41:37,300 --> 00:41:42,070 Vì vậy, được lưu trữ trong x sau đó, là địa chỉ trong đó đoạn bộ nhớ. 812 00:41:42,070 --> 00:41:43,400 Trong khi đó, những gì xảy ra tiếp theo? 813 00:41:43,400 --> 00:41:45,890 Vì vậy, trên thực tế, chúng ta hãy đi trước và rút ra nhanh chóng ra khỏi thực này. 814 00:41:45,890 --> 00:41:52,490 >> Vì vậy, nếu chúng ta đi qua màn hình ở đây và chúng tôi chơi này ra int * x, int * y 815 00:41:52,490 --> 00:41:53,740 sẽ làm những gì cho tôi? 816 00:41:53,740 --> 00:41:58,280 Tôi cho rằng nó chỉ cần đi làm một cái gì đó như thế này và gọi nó là x, và 817 00:41:58,280 --> 00:42:00,010 và điều này gọi là y. 818 00:42:00,010 --> 00:42:03,110 Trong khi đó, dòng thứ ba của mã là sẽ phân bổ kích thước của một int, 819 00:42:03,110 --> 00:42:06,160 mà sẽ xảy ra là - xin lỗi nếu tôi nói một trước khi tôi có nghĩa là một int - 820 00:42:06,160 --> 00:42:08,280 bốn byte trên một máy tính điển hình. 821 00:42:08,280 --> 00:42:09,720 Ít nhất là với các thiết bị CS50. 822 00:42:09,720 --> 00:42:11,490 >> Vì vậy, điều này sẽ phân bổ nó, ai biết được? 823 00:42:11,490 --> 00:42:12,800 Một nơi nào đó ở đây. 824 00:42:12,800 --> 00:42:15,780 Và điều này được lưu trữ tại một số địa chỉ Sửu, ai biết được? 825 00:42:15,780 --> 00:42:18,330 Nhưng những gì sẽ được trả lại là địa chỉ đó. 826 00:42:18,330 --> 00:42:22,270 Nhưng chúng tôi sẽ vẽ những bức tranh này như chỉ là một mũi tên như thế. 827 00:42:22,270 --> 00:42:25,430 >> Bây giờ các dòng tiếp theo * x được 42. 828 00:42:25,430 --> 00:42:29,400 Không * x có ý nghĩa gì trong cách hiểu thông thường? 829 00:42:29,400 --> 00:42:30,040 Chỉ cần đến đó. 830 00:42:30,040 --> 00:42:30,960 Đi đến địa chỉ đó. 831 00:42:30,960 --> 00:42:35,900 Hay nói cách khác, hãy làm theo các mũi tên và đặt 42 có. 832 00:42:35,900 --> 00:42:38,140 Nhưng sau đó một cái gì đó không hay xảy ra để Binky, phải không? 833 00:42:38,140 --> 00:42:43,950 >> Nhớ lại dòng năm ở đây, * y được 13, thực sự là một con số không may mắn, 834 00:42:43,950 --> 00:42:44,760 đã làm những gì cho chúng ta? 835 00:42:44,760 --> 00:42:47,320 Vâng, * y phương tiện đến đó. 836 00:42:47,320 --> 00:42:50,460 Vâng, điều này đã không được trao một giá trị nào, phải không? 837 00:42:50,460 --> 00:42:54,090 Các mã không có y là khởi tạo để bất cứ điều gì. 838 00:42:54,090 --> 00:42:56,120 Chúng tôi đã x được khởi tạo đến một địa chỉ. 839 00:42:56,120 --> 00:42:57,640 Nhưng y đã được tuyên bố lên hàng đầu. 840 00:42:57,640 --> 00:43:00,250 Nhưng sau đó một dấu chấm phẩy, không có giá trị đã thực sự đặt vào nó. 841 00:43:00,250 --> 00:43:02,330 Vì vậy, nó là công bằng để gọi đây một giá trị rác. 842 00:43:02,330 --> 00:43:03,430 Ai biết được những gì đang có? 843 00:43:03,430 --> 00:43:07,160 Đó là dấu tích còn lại của các bit đã được sử dụng bởi một số dòng trước mã trong 844 00:43:07,160 --> 00:43:08,300 chương trình của tôi. 845 00:43:08,300 --> 00:43:13,250 >> Vì vậy, nếu tôi nói đến đó, điều này là như thế, Tôi không có ý tưởng mũi tên này là 846 00:43:13,250 --> 00:43:14,490 sẽ kết thúc. 847 00:43:14,490 --> 00:43:17,720 Và đó là khi bạn thường nhận được một lỗi phân khúc. 848 00:43:17,720 --> 00:43:22,430 Nếu bạn vô tình tới đích, vì vậy để nói chuyện, hoặc đi đến một địa chỉ đó là không 849 00:43:22,430 --> 00:43:25,400 thực sự là một địa chỉ hợp pháp, điều xấu xảy ra. 850 00:43:25,400 --> 00:43:27,550 >> Và đó là chính xác những gì đã xảy ra suy nghĩ Binky. 851 00:43:27,550 --> 00:43:31,060 Vì vậy, nhớ lại rằng những câu chuyện đó Nick nói đây là ý tưởng giống như những gì 852 00:43:31,060 --> 00:43:34,050 Tôi đã rút ra một sự ảo tưởng của phấn trên bảng đó. 853 00:43:34,050 --> 00:43:35,960 X và y được khai báo. 854 00:43:35,960 --> 00:43:39,690 >> Sau đó chúng tôi phân bổ kích thước của một int và lưu trữ nó trong x. 855 00:43:39,690 --> 00:43:42,130 Sau đó, các dòng tiếp theo chúng tôi đã làm * x. 856 00:43:42,130 --> 00:43:46,070 Đây là cây đũa thần của Nick của dereferencing. 857 00:43:46,070 --> 00:43:49,780 Khiến 42 trong bộ nhớ chỉ ra bởi x. 858 00:43:49,780 --> 00:43:51,600 >> Nhưng đây là nơi mà mọi thứ đi sai lầm khủng khiếp. 859 00:43:51,600 --> 00:43:51,820 Phải không? 860 00:43:51,820 --> 00:43:53,550 Chúng tôi đã cố gắng để tới đích của y. 861 00:43:53,550 --> 00:43:55,620 Nhưng y đã có một số giá trị không có thật, phải không? 862 00:43:55,620 --> 00:43:57,720 >> Mà mũi tên ở dưới cùng bên trái góc, không phải là 863 00:43:57,720 --> 00:43:58,950 thực sự chỉ vào bất cứ điều gì. 864 00:43:58,950 --> 00:44:01,520 Đó là loại làm những gì tôi đã làm ở đây trên diễn đàn. 865 00:44:01,520 --> 00:44:05,900 Vì vậy, những điều xấu xảy ra, phân khúc lỗi, hoặc Binky lỗi, trong trường hợp này. 866 00:44:05,900 --> 00:44:10,800 >> Nhưng nếu chúng ta sau đó sửa chữa rằng bằng cách làm x được y như thế nào thay đổi câu chuyện? 867 00:44:10,800 --> 00:44:15,760 Vâng, nếu tôi làm được x y, đó là hiệu quả giống như nói 868 00:44:15,760 --> 00:44:19,235 đây là bất cứ điều gì, Sửu-một cái gì đó là có được như vậy ở đây, 869 00:44:19,235 --> 00:44:20,080 Bò một cái gì đó. 870 00:44:20,080 --> 00:44:22,970 Hoặc những bức tranh chúng ta sẽ vẽ một mũi tên. 871 00:44:22,970 --> 00:44:25,530 >> Vì vậy, ở đây trên diễn đàn với Binky, với các dòng tiếp theo của 872 00:44:25,530 --> 00:44:28,350 mã, * y có nghĩa là đi đến đó. 873 00:44:28,350 --> 00:44:29,400 Ở đâu có? 874 00:44:29,400 --> 00:44:30,820 Nó có nghĩa là ở đây. 875 00:44:30,820 --> 00:44:36,050 >> Và khi chúng tôi cập nhật đó là 13 nó chỉ liên quan đến việc đi và 876 00:44:36,050 --> 00:44:39,470 viết 13 ở đây bây giờ. 877 00:44:39,470 --> 00:44:44,130 Vì vậy, có lẽ không hoàn toàn đơn giản ở cái nhìn đầu tiên. 878 00:44:44,130 --> 00:44:47,740 Nhưng tóm lại và sử dụng các thuật ngữ tương tự mà Binky đã được sử dụng ở đây, vì vậy 879 00:44:47,740 --> 00:44:50,485 lần đầu tiên hai bố con trỏ, x và y, nhưng không phải là pointees. 880 00:44:50,485 --> 00:44:54,750 Và pointees không phải là một thường được sử dụng hạn. 881 00:44:54,750 --> 00:44:56,120 Nhưng con trỏ hoàn toàn. 882 00:44:56,120 --> 00:44:59,200 Nhưng đó là những gì đang được chỉ tại trong danh mục Binky của. 883 00:44:59,200 --> 00:45:01,660 >> Này dòng tiếp theo, tất nhiên, phân bổ một pointee int. 884 00:45:01,660 --> 00:45:04,840 Vì vậy, một đoạn bộ nhớ - như tôi đã thu hút hơn trên các bên phải có - và thiết lập 885 00:45:04,840 --> 00:45:06,470 x bằng trỏ đến nó. 886 00:45:06,470 --> 00:45:11,350 Này dereferences x để lưu trữ 42 bộ nhớ rằng nó chỉ vào. 887 00:45:11,350 --> 00:45:13,380 Và sau đó điều này, tất nhiên, là một điều xấu. 888 00:45:13,380 --> 00:45:15,600 Bởi vì y không chỉ tại bất cứ điều gì được nêu ra. 889 00:45:15,600 --> 00:45:16,530 Điều này sửa chữa nó. 890 00:45:16,530 --> 00:45:18,240 Vì vậy, đây vẫn là chương trình lỗi. 891 00:45:18,240 --> 00:45:21,580 Chỉ vì chúng ta đang thổi qua dòng code của dòng và nói, ồ được thôi, 892 00:45:21,580 --> 00:45:22,690 để cho nó sụp đổ đó. 893 00:45:22,690 --> 00:45:23,420 Đó là một điều xấu. 894 00:45:23,420 --> 00:45:26,790 Tỷ lệ cược là chương trình chỉ là sẽ hủy bỏ hoàn toàn tại dòng đó. 895 00:45:26,790 --> 00:45:30,550 Nhưng nếu bạn đã gỡ bỏ rơi xếp hàng và thay thế nó bằng cuối cùng hai 896 00:45:30,550 --> 00:45:32,470 dòng có bạn chỉ định - 897 00:45:32,470 --> 00:45:35,310 sử dụng giao con trỏ - y để trỏ đến x là điểm t. 898 00:45:35,310 --> 00:45:39,280 Và sau đó bạn tới đích y một cách rất an toàn. 899 00:45:39,280 --> 00:45:41,520 >> Vì vậy, nơi vấn đề này thì chúng ta? 900 00:45:41,520 --> 00:45:45,350 Vâng, chỉ ra rằng bên dưới mui xe trong thư viện CS50, con trỏ 901 00:45:45,350 --> 00:45:46,320 sử dụng trong suốt. 902 00:45:46,320 --> 00:45:48,910 Và chúng tôi sẽ thực sự bắt đầu vỏ lại rằng lớp trước khi dài. 903 00:45:48,910 --> 00:45:51,740 Nhưng nó quay quá, một biểu thức một số bạn có thể quen thuộc với, 904 00:45:51,740 --> 00:45:54,580 đặc biệt là thoải mái hơn, thực sự là của một rất phổ biến 905 00:45:54,580 --> 00:45:56,390 trang web, hoặc ngăn xếp tràn, những ngày này. 906 00:45:56,390 --> 00:45:58,720 >> Nhưng điều này thực sự có rất ý nghĩa kỹ thuật. 907 00:45:58,720 --> 00:46:00,160 Bây giờ chúng tôi biết những gì một chồng là. 908 00:46:00,160 --> 00:46:02,550 Nó giống như một chồng khay bên trong một phòng ăn. 909 00:46:02,550 --> 00:46:05,140 >> Hoặc bên trong máy tính của bạn bộ nhớ của nó những khung hình 910 00:46:05,140 --> 00:46:06,900 được sử dụng bởi các chức năng. 911 00:46:06,900 --> 00:46:10,760 Vâng, nó quay ra rằng vì lý do đó thực hiện rất đơn giản 912 00:46:10,760 --> 00:46:14,970 bộ nhớ và các khung hình trên cái gọi là ngăn xếp, bạn thực sự có thể kiểm soát 913 00:46:14,970 --> 00:46:17,050 của một hệ thống máy tính một cách dễ dàng. 914 00:46:17,050 --> 00:46:22,180 Bạn có thể hack vào một hệ thống nếu người như chúng tôi đã không viết mã của chúng tôi 915 00:46:22,180 --> 00:46:23,300 đặc biệt tốt. 916 00:46:23,300 --> 00:46:26,670 >> Nếu những người như chúng ta sử dụng khối bộ nhớ hoặc sử dụng mảng - 917 00:46:26,670 --> 00:46:27,810 thậm chí còn phổ biến hơn - 918 00:46:27,810 --> 00:46:31,800 nhưng đôi khi quên kiểm tra ranh giới mảng của chúng tôi như bạn có thể 919 00:46:31,800 --> 00:46:38,470 có cho mình đôi khi, và lặp cách quá xa quá khứ kết thúc một mảng. 920 00:46:38,470 --> 00:46:40,520 Trong trường hợp tốt nhất, chương trình của bạn chỉ có thể sụp đổ. 921 00:46:40,520 --> 00:46:42,280 Lỗi phân khúc, loại xấu hổ. 922 00:46:42,280 --> 00:46:45,480 Không lớn, nhưng nó không nhất thiết một điều cực kỳ xấu. 923 00:46:45,480 --> 00:46:49,480 >> Nhưng nếu chương trình của bạn thực sự là trên thực tế máy tính của người sử dụng, nếu nó đang chạy 924 00:46:49,480 --> 00:46:53,070 trên một trang web mà mọi người ngẫu nhiên thực tế trên internet đang đánh, cho phép 925 00:46:53,070 --> 00:46:56,690 người gây ra những điều xấu trên mã của bạn nói chung không phải là một điều tốt vì 926 00:46:56,690 --> 00:46:59,930 nó có nghĩa là một cơ hội để có kiểm soát của máy tính. 927 00:46:59,930 --> 00:47:01,350 Và điều này sẽ xem xét một chút khó hiểu. 928 00:47:01,350 --> 00:47:04,570 Nhưng tôi nghĩ rằng tôi muốn scare bạn với ví dụ này cuối cùng ở đây. 929 00:47:04,570 --> 00:47:05,650 >> Dưới đây là một ví dụ về mã. 930 00:47:05,650 --> 00:47:07,370 Và có một Wikipedia tốt bài viết đó đi qua 931 00:47:07,370 --> 00:47:08,530 này chi tiết hơn. 932 00:47:08,530 --> 00:47:13,890 Tôi có chính trên gọi dưới foo, đi qua trong argv của 1. 933 00:47:13,890 --> 00:47:15,750 Và đó chỉ là để bạn có thể chạy chương trình và vượt qua 934 00:47:15,750 --> 00:47:17,080 một đầu vào tùy ý. 935 00:47:17,080 --> 00:47:20,180 >> Và sau đó foo được tuyên bố lên hàng đầu như chấp nhận một chuỗi, hoặc nhiều hơn 936 00:47:20,180 --> 00:47:21,700 chính xác, một *. 937 00:47:21,700 --> 00:47:23,860 Sau đó nó tuyên bố một loạt các ký tự. 938 00:47:23,860 --> 00:47:27,130 Gọi nó là một bộ đệm, nói chung, kích thước 12. 939 00:47:27,130 --> 00:47:30,900 Vì vậy, 12 ký tự có thể phù hợp trong của mảng được gọi là c. 940 00:47:30,900 --> 00:47:33,510 >> Và sau đó nó sử dụng chức năng mới này, đó là mới nhưng không khó 941 00:47:33,510 --> 00:47:34,930 hiểu, bản sao bộ nhớ. 942 00:47:34,930 --> 00:47:39,290 Nó sao chép các bộ nhớ từ thanh, đó là n qua biến, bất cứ điều gì 943 00:47:39,290 --> 00:47:42,080 người sử dụng gõ vào argv 1 vào c. 944 00:47:42,080 --> 00:47:43,090 Bao nhiêu byte? 945 00:47:43,090 --> 00:47:44,260 Chiều dài chuỗi các quán bar. 946 00:47:44,260 --> 00:47:48,380 >> Vì vậy, nói cách khác, nếu loại người sử dụng trong h-e-l-l-o enter, chiều dài chuỗi 947 00:47:48,380 --> 00:47:49,260 của hello là năm. 948 00:47:49,260 --> 00:47:52,790 Vì vậy, năm trong số những byte là sẽ nhận được sao chép vào mảng gọi là c, mà 949 00:47:52,790 --> 00:47:54,110 có kích thước 12. 950 00:47:54,110 --> 00:47:58,710 Nhưng những gì loại người sử dụng trong một lâu hơn nữa từ đó là 13 ký tự hoặc 14 951 00:47:58,710 --> 00:48:01,250 ký tự hoặc 100 ký tự hoặc nhiều hơn? 952 00:48:01,250 --> 00:48:02,660 >> Mà là họ sẽ đi đâu? 953 00:48:02,660 --> 00:48:06,090 Vâng, khung, mà khay trong ăn uống, hội họp chồng, 954 00:48:06,090 --> 00:48:06,930 họ sẽ đến đó. 955 00:48:06,930 --> 00:48:10,080 Và nó chỉ sẽ bắt đầu ghi đè lên công cụ khác đó là đã có 956 00:48:10,080 --> 00:48:12,880 trên ngăn xếp, tràn ngăn xếp, vậy để nói chuyện. 957 00:48:12,880 --> 00:48:14,780 >> Vì vậy, những bức tranh, nghĩ về nó theo cách này. 958 00:48:14,780 --> 00:48:17,970 Đây chỉ là một phiên bản đầy màu sắc của hình ảnh chúng tôi đã được vẽ. 959 00:48:17,970 --> 00:48:20,060 Ở phía dưới, chúng ta hãy nói, là chính. 960 00:48:20,060 --> 00:48:24,690 Và trên đầu, những gì bạn đang thấy bây giờ là khung hình, màu sắc mã hóa bây giờ, cho một 961 00:48:24,690 --> 00:48:26,090 chức năng gọi là foo. 962 00:48:26,090 --> 00:48:30,170 Nhưng điều thú vị ở đây về foo là đây là khung của nó. 963 00:48:30,170 --> 00:48:32,860 Vì vậy, nó được vẽ giống như tôi đã làm nhưng trong ánh sáng màu xanh. 964 00:48:32,860 --> 00:48:35,220 Và bây giờ đây là nơi mà c khung 0 đi. 965 00:48:35,220 --> 00:48:37,410 Và đây là nơi mà c khung 11 sẽ kết thúc. 966 00:48:37,410 --> 00:48:39,670 >> Nói cách khác, nó sẽ xảy ra được biểu diễn như là một hình vuông. 967 00:48:39,670 --> 00:48:42,320 Nhưng nếu bạn chỉ cần giữ nhúng cả byte xuống - hoặc ký tự - họ sẽ kết thúc 968 00:48:42,320 --> 00:48:46,070 tại vị trí 0 tất cả các con đường lên đến 11 bởi vì nó 0 lập chỉ mục. 969 00:48:46,070 --> 00:48:49,170 >> Nhưng mà là nhân vật thứ 13 sẽ kết thúc? 970 00:48:49,170 --> 00:48:50,310 Trường hợp của 14? 971 00:48:50,310 --> 00:48:52,430 Đâu là nhân vật thứ 50 sẽ kết thúc? 972 00:48:52,430 --> 00:48:54,070 >> Nó sẽ tiếp tục đi xuống. 973 00:48:54,070 --> 00:48:57,350 Bởi vì mặc dù chúng tôi đã thu hút được sự hình ảnh với chồng ngày càng tăng lên, 974 00:48:57,350 --> 00:48:59,920 địa chỉ, nó quay ra, đi từ địa chỉ nhỏ, nhỏ 975 00:48:59,920 --> 00:49:01,830 con trỏ, đến các địa chỉ lớn. 976 00:49:01,830 --> 00:49:03,540 Vì vậy, nó chỉ tiếp tục đi lên và lên. 977 00:49:03,540 --> 00:49:05,660 >> Vì vậy, nếu loại người sử dụng trong xin chào, đó là tuyệt vời. 978 00:49:05,660 --> 00:49:08,650 Không có lỗi, không có vấn đề, an toàn của tất cả mọi người. 979 00:49:08,650 --> 00:49:11,940 Nhưng nếu loại người sử dụng trong những gì chúng tôi sẽ gọi mã đối lập, đại diện 980 00:49:11,940 --> 00:49:16,040 quát như một, tấn công, tấn công, tấn công, tấn công, những gì có thể xảy ra? 981 00:49:16,040 --> 00:49:19,760 >> Vâng, nếu tất cả các đầu vào mà người sử dụng gõ vào là không chỉ là một số thân thiện 982 00:49:19,760 --> 00:49:21,540 hoặc chuỗi tấn công của nhân vật. 983 00:49:21,540 --> 00:49:24,050 Nó thực sự là một chuỗi các ký tự rằng nếu bạn biên dịch nó, 984 00:49:24,050 --> 00:49:26,050 nó thực sự là mã. 985 00:49:26,050 --> 00:49:29,570 Có thể đó là mã xóa tất cả các các tập tin trên ổ đĩa cứng của bạn hoặc gửi thư rác 986 00:49:29,570 --> 00:49:30,810 hoặc một cái gì đó như thế. 987 00:49:30,810 --> 00:49:35,110 Chú ý rằng chính là những gì ở đây là nếu kẻ xấu có đủ may mắn để 988 00:49:35,110 --> 00:49:37,830 ghi đè lên các đoạn màu đỏ của bộ nhớ - 989 00:49:37,830 --> 00:49:41,080 mà tôi đã không vẽ trên hình ảnh của tôi, nhưng này hình ảnh Wikipedia đây có - 990 00:49:41,080 --> 00:49:42,890 cái gọi là địa chỉ trở lại của mình. 991 00:49:42,890 --> 00:49:47,470 >> Khi trở về thực phẩm, khi trở về trao đổi, làm thế nào để máy tính biết đi từ 992 00:49:47,470 --> 00:49:49,790 lên đây để xuống đây? 993 00:49:49,790 --> 00:49:52,920 Hoặc trong phân khúc công nghệ cao lên trên, làm thế nào nó biết đi từ trao đổi 994 00:49:52,920 --> 00:49:54,870 mã - 0 và 1 của mà soạn trao đổi - 995 00:49:54,870 --> 00:49:56,020 trở lại chính? 996 00:49:56,020 --> 00:50:00,450 Có một địa chỉ trả lại cái gọi là được lưu trữ trong cùng một khung ngăn xếp, trên 997 00:50:00,450 --> 00:50:02,140 các khay ăn cùng. 998 00:50:02,140 --> 00:50:06,080 >> Vì vậy, nếu kẻ xấu là đủ thông minh để đặt mã tấn công, mã tấn công, tấn công 999 00:50:06,080 --> 00:50:07,960 mã, và có đủ may mắn - 1000 00:50:07,960 --> 00:50:11,630 thường là thông qua thử và sai - để ghi đè lên địa chỉ trả lại màu đỏ, 1001 00:50:11,630 --> 00:50:14,360 với địa chỉ và thông báo phần trên. 1002 00:50:14,360 --> 00:50:16,830 Chú ý 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Nó được viết ngược lên hàng đầu cho lý do chúng tôi sẽ có thể xem lại. 1004 00:50:20,650 --> 00:50:22,050 Đây là con số đó. 1005 00:50:22,050 --> 00:50:25,790 >> Vì vậy, nếu kẻ xấu được may mắn hoặc là đủ thông minh để ghi đè lên các màu đỏ 1006 00:50:25,790 --> 00:50:29,480 dải bộ nhớ với địa chỉ của mã mà người đó có bằng cách nào đó 1007 00:50:29,480 --> 00:50:34,980 tiêm vào máy tính của bạn, đoán có mã được sẽ được trả lại cho 1008 00:50:34,980 --> 00:50:38,260 ngay sau khi foo được thực hiện thực hiện? 1009 00:50:38,260 --> 00:50:39,440 >> Mã của kẻ xấu. 1010 00:50:39,440 --> 00:50:43,610 Vì vậy, mã tấn công này, AAA, một lần nữa, năng gửi thư rác, có thể xóa tất cả các file 1011 00:50:43,610 --> 00:50:44,500 trên ổ cứng của bạn. 1012 00:50:44,500 --> 00:50:48,740 Nhưng đó là những gì thực sự là một chồng tràn là, hoặc tràn bộ đệm, hoặc một 1013 00:50:48,740 --> 00:50:51,060 đệm tấn công tràn. 1014 00:50:51,060 --> 00:50:54,400 >> Và nó vô cùng, vô cùng phổ biến cho đến ngày nay với các chương trình viết bằng 1015 00:50:54,400 --> 00:50:58,220 C, C + +, và thậm chí một số ngôn ngữ khác. 1016 00:50:58,220 --> 00:51:02,275 Trên đó ghi chú đáng sợ, chúng tôi sẽ kết thúc với một trò đùa. 1017 00:51:02,275 --> 00:51:03,230 >> [Cười] 1018 00:51:03,230 --> 00:51:04,550 >> Hẹn gặp lại vào thứ Tư. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 Ở bên cạnh CS50 - 1021 00:51:10,310 --> 00:51:15,920 Vì vậy, tôi là tất cả ra khỏi đèn đĩa nhưng hôm nay chờ đợi, không có chất béo sữa, một nửa điện thoại 1022 00:51:15,920 --> 00:51:17,850 cuốn sách, các nước cam mà tôi uống hôm nay. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 Cáp USB, một chìa khoá. 1025 00:51:22,780 --> 00:51:24,800 >> [Chơi nhạc]