1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID Malan: Được rồi, chào đón trở lại. 3 00:00:12,580 --> 00:00:13,290 Đây là CS50. 4 00:00:13,290 --> 00:00:15,130 Đây là khởi đầu của tuần bảy. 5 00:00:15,130 --> 00:00:18,890 Vì vậy, nó được một thời gian, vì vậy tôi nghĩ chúng tôi có một tour du lịch cơn lốc của nơi mà chúng tôi 6 00:00:18,890 --> 00:00:20,760 rời đi và nơi chúng tôi bây giờ đi. 7 00:00:20,760 --> 00:00:23,310 >> Vì vậy, điều này ở đây có thể có gây ra một số lo lắng lúc đầu. 8 00:00:23,310 --> 00:00:27,680 Nhưng hy vọng, bạn đang bắt đầu thích nghi với những gì điều này biểu thị ở đây - 9 00:00:27,680 --> 00:00:32,670 ngôi sao đại diện cho một con trỏ, đó là chỉ là những gì, trong nhiều điều kiện hơn của giáo dân? 10 00:00:32,670 --> 00:00:33,400 Vì vậy, nó là một địa chỉ. 11 00:00:33,400 --> 00:00:35,490 >> Vì vậy, nó là địa chỉ của một cái gì đó trong bộ nhớ. 12 00:00:35,490 --> 00:00:38,260 Và chúng tôi bắt đầu bóc lớp một vài tuần trước đây, những thứ như 13 00:00:38,260 --> 00:00:41,800 GetString và các chức năng khác như tất cả các thời gian này đã được trở về 14 00:00:41,800 --> 00:00:46,010 địa chỉ của sự vật trong bộ nhớ, như các địa chỉ của ký tự đầu tiên trong 15 00:00:46,010 --> 00:00:46,990 một số thứ tự. 16 00:00:46,990 --> 00:00:50,360 >> Vì vậy, chúng tôi cũng giới thiệu valgrind, mà bạn sẽ bắt đầu sử dụng cho vấn đề này 17 00:00:50,360 --> 00:00:53,380 thiết lập, đặc biệt là cho các tiếp theo vấn đề thiết lập là tốt. 18 00:00:53,380 --> 00:00:54,980 Và valgrind làm những gì cho chúng ta? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Nó sẽ kiểm tra xem có rò rỉ bộ nhớ, và nó cũng kiểm tra tình trạng lạm dụng bộ nhớ. 21 00:01:01,020 --> 00:01:05,890 >> Nó có thể, với một số xác suất, nếu phát hiện mã của bạn sẽ chạm vào bộ nhớ 22 00:01:05,890 --> 00:01:07,100 nó chỉ đơn giản là không nên. 23 00:01:07,100 --> 00:01:10,410 Vì vậy, không nhất thiết phải là một rò rỉ, nhưng nếu bạn vượt ra ngoài ranh giới của một số 24 00:01:10,410 --> 00:01:14,730 mảng, và bạn thực sự chạy valgrind và gây ra hành vi đó trong khi 25 00:01:14,730 --> 00:01:17,870 valgrind đang chạy trong chương trình của bạn chạy bên trong của nó, bạn sẽ nhận được 26 00:01:17,870 --> 00:01:21,460 tin nhắn như thế này - "không hợp lệ viết của kích thước 4 ", mà, nhớ lại một vài 27 00:01:21,460 --> 00:01:25,880 tuần trước có nghĩa là tôi đã vô tình giống như trên một int quá xa 28 00:01:25,880 --> 00:01:27,250 vượt ra ngoài ranh giới của một mảng. 29 00:01:27,250 --> 00:01:30,790 Và vì vậy kích thước 4 có nghĩa là ở đây kích thước đó int cụ thể. 30 00:01:30,790 --> 00:01:35,260 >> Vì vậy hãy bảo đảm trong thực tế là đầu ra valgrind của, định dạng của nó, 31 00:01:35,260 --> 00:01:36,170 chỉ là tàn bạo. 32 00:01:36,170 --> 00:01:40,180 Nó thực sự khó để nhìn thấy thông qua sự lộn xộn những thông tin thú vị. 33 00:01:40,180 --> 00:01:42,910 Vì vậy, những gì chúng tôi đã làm ở đây chỉ là trích đoạn một số các cặp vợ chồng của hơn 34 00:01:42,910 --> 00:01:43,850 dòng thú vị. 35 00:01:43,850 --> 00:01:46,760 Nhưng nhận ra rằng 80% của valgrind đầu ra là có được một chút của một 36 00:01:46,760 --> 00:01:47,650 mất tập trung. 37 00:01:47,650 --> 00:01:52,820 >> Chỉ cần tìm kiếm các mẫu như thế này - không hợp lệ rồi, không hợp lệ đọc, 40 byte 38 00:01:52,820 --> 00:01:56,690 và một số số khối chắc chắn bị mất, các từ khóa như thế. 39 00:01:56,690 --> 00:02:01,920 Và những gì hy vọng bạn sẽ thấy một số loại dấu vết của những gì các chức năng 40 00:02:01,920 --> 00:02:03,340 sai lầm là thực sự nhập 41 00:02:03,340 --> 00:02:07,195 Trong trường hợp này đây, trong những dòng mã của tôi là lỗi rõ ràng? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 trong một tập tin gọi là memory.c, đó là ví dụ chúng tôi đã chơi với 44 00:02:14,130 --> 00:02:14,890 vào thời điểm đó. 45 00:02:14,890 --> 00:02:16,460 Vì vậy, nó có lẽ không phải trong malloc. 46 00:02:16,460 --> 00:02:18,630 Nó có thể là trong mã của tôi để thay thế. 47 00:02:18,630 --> 00:02:20,910 Vì vậy, chúng ta sẽ thấy điều này một lần nữa và một lần nữa trước khi dài. 48 00:02:20,910 --> 00:02:24,080 >> Vì vậy, scanf, điều này đã đưa ra trong một vài hình thức cho đến nay. 49 00:02:24,080 --> 00:02:26,410 Chúng ta đã thấy sscanf một thời gian ngắn. 50 00:02:26,410 --> 00:02:28,330 Đó là một cái gì đó một số bạn chui vào trong của bạn 51 00:02:28,330 --> 00:02:29,535 chuẩn bị cho các bài kiểm tra. 52 00:02:29,535 --> 00:02:33,130 Và scanf thực sự là những gì CS50 thư viện đã được sử dụng bên dưới 53 00:02:33,130 --> 00:02:36,560 mui xe một thời gian khá để để có được đầu vào từ người sử dụng. 54 00:02:36,560 --> 00:02:40,420 >> Ví dụ, nếu tôi di chuyển qua các CS50 thiết bị ở đây, hãy để tôi mở ra một 55 00:02:40,420 --> 00:02:45,315 Ví dụ hôm nay đó được gọi là scanf-0.c Và đó là siêu đơn giản. 56 00:02:45,315 --> 00:02:46,590 Nó chỉ là một vài dòng mã. 57 00:02:46,590 --> 00:02:50,880 Nhưng nó thể hiện thực sự như thế nào getInt đã làm việc tất cả thời gian này. 58 00:02:50,880 --> 00:02:54,710 >> Trong chương trình này đây, trong dòng 16 , Thông báo rằng tôi tuyên bố một int. 59 00:02:54,710 --> 00:02:57,270 Vì vậy, không có con trỏ, không có gì huyền diệu có, chỉ là một int. 60 00:02:57,270 --> 00:03:00,330 Sau đó trong dòng 17, tôi nhắc nhở người người sử dụng đối với một số, xin vui lòng. 61 00:03:00,330 --> 00:03:02,930 Sau đó, vào cuối năm 18, tôi sử dụng scanf đây. 62 00:03:02,930 --> 00:03:06,910 Và tôi đã chỉ định, giống như printf, mà tôi hy vọng báo 63 00:03:06,910 --> 00:03:08,110 unquote phần trăm tôi. 64 00:03:08,110 --> 00:03:10,920 >> Vì vậy, phần trăm tôi, tất nhiên, biểu thị một int. 65 00:03:10,920 --> 00:03:14,580 Nhưng hãy chú ý những gì các thứ hai đối số là scanf. 66 00:03:14,580 --> 00:03:17,350 Làm thế nào bạn sẽ mô tả thứ hai tham số sau dấu phẩy? 67 00:03:17,350 --> 00:03:19,450 Đó là những gì? 68 00:03:19,450 --> 00:03:20,670 >> Đó là địa chỉ của x. 69 00:03:20,670 --> 00:03:25,490 Vì vậy, điều này rất hữu ích vì bằng cách cung cấp scanf với địa chỉ của x, những gì hiện 70 00:03:25,490 --> 00:03:29,560 mà trao quyền cho chức năng đó để làm gì? 71 00:03:29,560 --> 00:03:33,010 Không chỉ đến đó, nhưng cũng làm những gì? 72 00:03:33,010 --> 00:03:34,060 >> Thực hiện thay đổi nó. 73 00:03:34,060 --> 00:03:38,080 Bởi vì bạn có thể đến đó, đó là loại như một bản đồ đến một vị trí trong bộ nhớ. 74 00:03:38,080 --> 00:03:41,900 Và miễn là bạn cung cấp scanf, hoặc bất kỳ chức năng với một bản đồ như vậy, mà 75 00:03:41,900 --> 00:03:45,840 chức năng có thể đến đó, và không chỉ nhìn vào giá trị, nhưng nó cũng có thể 76 00:03:45,840 --> 00:03:49,670 thay đổi giá trị đó, đó là hữu ích nếu mục đích trong cuộc sống của scanf là 77 00:03:49,670 --> 00:03:53,060 quét đầu vào từ người sử dụng, đặc biệt từ bàn phím. 78 00:03:53,060 --> 00:03:57,830 Và f biểu thị định dạng, giống như printf, f biểu thị một định dạng 79 00:03:57,830 --> 00:03:58,930 chuỗi mà bạn muốn in. 80 00:03:58,930 --> 00:04:04,430 >> Vì vậy, trong ngắn hạn, dòng 18 này chỉ đơn giản nói, cố gắng đọc một int từ của người sử dụng 81 00:04:04,430 --> 00:04:10,420 bàn phím và lưu trữ nó bên trong của x, tại bất cứ điều gì xảy ra với địa chỉ x sống tại. 82 00:04:10,420 --> 00:04:14,860 Và sau đó cuối cùng, dòng 19 chỉ nói, cảm ơn cho int, trong trường hợp này. 83 00:04:14,860 --> 00:04:15,940 >> Vì vậy, hãy để tôi đi trước và thực hiện điều này. 84 00:04:15,940 --> 00:04:18,570 Vì vậy, hãy scanf 0. 85 00:04:18,570 --> 00:04:20,130 Hãy để tôi đi trước và zoom in 86 00:04:20,130 --> 00:04:22,960 Tôi sẽ đi và chạy với chấm giảm scanf 0. 87 00:04:22,960 --> 00:04:24,020 Số, xin vui lòng? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Cảm ơn cho 50. 90 00:04:25,730 --> 00:04:27,270 Vì vậy, nó khá đơn giản. 91 00:04:27,270 --> 00:04:28,160 >> Bây giờ những gì là nó không làm? 92 00:04:28,160 --> 00:04:29,940 Nó không phải làm một bó toàn bộ kiểm tra lỗi. 93 00:04:29,940 --> 00:04:33,000 Ví dụ, nếu tôi không hợp tác, và tôi không nhập vào một số, nhưng 94 00:04:33,000 --> 00:04:37,860 thay vào đó tôi viết một cái gì đó như "xin chào" đó chỉ là một chuyện lạ. 95 00:04:37,860 --> 00:04:41,130 Và như vậy một trong những điều các CS50 thư viện đã làm cho chúng tôi một số 96 00:04:41,130 --> 00:04:43,440 thời gian là reprompting mà và reprompting. 97 00:04:43,440 --> 00:04:49,320 >> Thử lại cụm từ thu hồi là trong cs50.c, và đó là lý do mà trong getInt 98 00:04:49,320 --> 00:04:51,670 thư viện CS50 thực sự là một toàn bộ loạt các hàng dài, bởi vì chúng ta 99 00:04:51,670 --> 00:04:53,190 kiểm tra cho các công cụ ngu ngốc như thế này. 100 00:04:53,190 --> 00:04:55,730 Đã không cung cấp cho người sử dụng chúng tôi, trên thực tế, một int? 101 00:04:55,730 --> 00:04:57,910 Anh ấy hoặc cô ấy cho chúng ta một cái gì đó như một chữ cái? 102 00:04:57,910 --> 00:05:01,410 Nếu như vậy, chúng tôi muốn phát hiện đó và hét vào mặt họ. 103 00:05:01,410 --> 00:05:03,915 >> Nhưng những thứ có được thú vị hơn trong ví dụ tiếp theo này. 104 00:05:03,915 --> 00:05:09,840 Nếu tôi đi đến scanf-1.c, là những gì mà một điều đó là thay đổi cơ bản trong 105 00:05:09,840 --> 00:05:11,135 ví dụ này tiếp theo? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Tôi đang sử dụng char *, tất nhiên, thay vì int. 108 00:05:16,010 --> 00:05:19,210 >> Vì vậy, đây là thú vị, bởi vì char * nhớ lại, thực sự chỉ là 109 00:05:19,210 --> 00:05:20,190 điều tương tự như chuỗi. 110 00:05:20,190 --> 00:05:23,840 Vì vậy, nó cảm thấy như có lẽ đây là một siêu thực hiện đơn giản của GetString. 111 00:05:23,840 --> 00:05:26,010 Nhưng tôi đã bóc vỏ trở lại lớp của thư viện CS50, vì vậy tôi 112 00:05:26,010 --> 00:05:27,550 gọi char * này ngay bây giờ. 113 00:05:27,550 --> 00:05:30,070 Vì vậy, chúng ta hãy xem ở đâu, nếu bất cứ nơi nào, chúng ta đi sai. 114 00:05:30,070 --> 00:05:30,840 >> Line 17 - 115 00:05:30,840 --> 00:05:33,950 Tôi lại nói, xin vui lòng cho tôi một cái gì đó, trong trường hợp này, một chuỗi. 116 00:05:33,950 --> 00:05:37,940 Và sau đó trong dòng tiếp theo, tôi gọi scanf, một lần nữa, cho nó một mã định dạng, 117 00:05:37,940 --> 00:05:39,310 nhưng lần này phần trăm s. 118 00:05:39,310 --> 00:05:41,900 Và sau đó thời gian này, tôi cho nó bộ đệm. 119 00:05:41,900 --> 00:05:43,550 >> Bây giờ nhận thấy, tôi không sử dụng các ký hiệu. 120 00:05:43,550 --> 00:05:47,120 Nhưng tại sao là có thể OK đây? 121 00:05:47,120 --> 00:05:49,760 Bởi vì là những gì bộ đệm đã? 122 00:05:49,760 --> 00:05:50,770 Nó đã là một con trỏ. 123 00:05:50,770 --> 00:05:51,650 Nó đã là một địa chỉ. 124 00:05:51,650 --> 00:05:54,510 >> Và cho phép của từ này "nhầm lẫn" cho tôi chỉ cần gọi nó s, ví dụ, cho 125 00:05:54,510 --> 00:05:55,050 đơn giản. 126 00:05:55,050 --> 00:05:58,250 Nhưng tôi đã gọi nó là đệm bởi vì trong Nhìn chung, trong lập trình, nếu bạn có một 127 00:05:58,250 --> 00:06:02,130 đoạn bộ nhớ, đó là một chuỗi thực sự chỉ là, bạn có thể gọi nó là một bộ đệm. 128 00:06:02,130 --> 00:06:04,460 Đó là một nơi để lưu trữ thông tin. 129 00:06:04,460 --> 00:06:07,400 >> Tương tự như những thứ như YouTube, khi họ đang đệm, có thể nói, đó 130 00:06:07,400 --> 00:06:10,270 chỉ có nghĩa là nó tải về các bit từ internet và lưu trữ chúng trong một 131 00:06:10,270 --> 00:06:14,160 mảng địa phương, một đoạn địa phương của bộ nhớ để bạn có thể xem nó sau này mà không 132 00:06:14,160 --> 00:06:16,830 nó bỏ qua hoặc treo trên bạn trong khi chơi lại. 133 00:06:16,830 --> 00:06:20,930 >> Vì vậy, có một vấn đề ở đây mặc dù, bởi vì tôi đang nói với scanf, mong đợi một 134 00:06:20,930 --> 00:06:22,320 chuỗi từ người sử dụng. 135 00:06:22,320 --> 00:06:24,410 Đây là địa chỉ của một đoạn bộ nhớ. 136 00:06:24,410 --> 00:06:26,180 Đặt rằng chuỗi đó. 137 00:06:26,180 --> 00:06:31,230 Tại sao là ràng buộc cho chúng tôi gặp khó khăn, mặc dù? 138 00:06:31,230 --> 00:06:33,490 >> Đó là những gì? 139 00:06:33,490 --> 00:06:35,510 Tôi có được phép truy cập một phần của bộ nhớ? 140 00:06:35,510 --> 00:06:36,250 Bạn biết đấy, tôi không biết. 141 00:06:36,250 --> 00:06:39,210 Vì đã đệm được khởi tạo để bất cứ điều gì? 142 00:06:39,210 --> 00:06:39,820 Không thực sự. 143 00:06:39,820 --> 00:06:43,090 Và vì vậy đó là những gì chúng tôi đã gọi một giá trị rác, mà 144 00:06:43,090 --> 00:06:44,040 không phải là một từ chính thức. 145 00:06:44,040 --> 00:06:49,200 Nó chỉ có nghĩa là chúng tôi không có ý tưởng những gì bit là bên trong của bốn byte 146 00:06:49,200 --> 00:06:51,240 Tôi đã được phân bổ như đệm. 147 00:06:51,240 --> 00:06:52,450 >> Tôi đã không gọi malloc. 148 00:06:52,450 --> 00:06:53,940 Tôi đã chắc chắn không gọi là GetString. 149 00:06:53,940 --> 00:06:56,380 Vì vậy, ai biết điều gì là thực sự bên trong bộ đệm? 150 00:06:56,380 --> 00:07:00,550 Nhưng nói scanf một cách mù quáng, đến đó và đặt bất cứ điều gì người dùng gõ. 151 00:07:00,550 --> 00:07:04,460 >> Vì vậy, những gì có thể gây ra trong mã của chúng tôi nếu chúng tôi chạy nó? 152 00:07:04,460 --> 00:07:05,700 Có thể là một segfault. 153 00:07:05,700 --> 00:07:07,970 Có lẽ không, nhưng có thể là một segfault. 154 00:07:07,970 --> 00:07:10,620 Và tôi nói có lẽ không phải vì đôi khi bạn làm gì, đôi khi 155 00:07:10,620 --> 00:07:11,380 bạn không có được một segfault. 156 00:07:11,380 --> 00:07:14,280 Đôi khi bạn chỉ nhận được may mắn, nhưng nó dù sao sẽ 157 00:07:14,280 --> 00:07:15,340 một lỗi trong chương trình của chúng tôi. 158 00:07:15,340 --> 00:07:17,060 >> Vì vậy, hãy để tôi đi trước và biên dịch này. 159 00:07:17,060 --> 00:07:18,280 Tôi sẽ làm điều đó một cách trường học cũ. 160 00:07:18,280 --> 00:07:23,825 Vì vậy, kêu vang dấu gạch ngang 0, scanf-1, scanf-1.c, Enter. 161 00:07:23,825 --> 00:07:24,720 Rất tiếc, trường học quá cũ. 162 00:07:24,720 --> 00:07:26,550 Chúng ta hãy xem. 163 00:07:26,550 --> 00:07:28,440 Tôi đã đi đâu? 164 00:07:28,440 --> 00:07:29,700 Oh, char * đệm. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 Oh, cảm ơn bạn - 167 00:07:35,130 --> 00:07:36,930 Tiết kiệm, OK - 168 00:07:36,930 --> 00:07:37,690 trường rất cũ. 169 00:07:37,690 --> 00:07:38,900 Được rồi, được một lúc. 170 00:07:38,900 --> 00:07:41,720 >> Vì vậy, tôi đã chỉ cần lưu lại các tập tin sau khi làm cho rằng tạm thời 171 00:07:41,720 --> 00:07:42,700 thay đổi một thời điểm trước đây. 172 00:07:42,700 --> 00:07:46,090 Và bây giờ tôi đã biên dịch nó tay với Clang. 173 00:07:46,090 --> 00:07:49,500 Và bây giờ tôi sẽ đi trước và chạy scanf-1, Enter. 174 00:07:49,500 --> 00:07:50,290 Chuỗi xin. 175 00:07:50,290 --> 00:07:51,600 Tôi sẽ gõ "hello". 176 00:07:51,600 --> 00:07:54,070 >> Và bây giờ, đây là nơi mà, thẳng thắn, printf có thể là một chút khó chịu. 177 00:07:54,070 --> 00:07:56,020 Nó không thực sự đi vào segfault trong trường hợp này. 178 00:07:56,020 --> 00:07:59,860 Printf là một chút đặc biệt vì nó rất siêu thường được sử dụng 179 00:07:59,860 --> 00:08:03,570 về cơ bản printf đang làm chúng tôi ủng hộ và thực hiện, 180 00:08:03,570 --> 00:08:04,830 đó không phải là một con trỏ hợp lệ. 181 00:08:04,830 --> 00:08:09,080 Hãy để tôi mang nó theo mình chỉ cần in trong ngoặc vô giá trị, thậm chí 182 00:08:09,080 --> 00:08:13,340 mặc dù nó không nhất thiết những gì chính chúng ta mong đợi. 183 00:08:13,340 --> 00:08:16,940 >> Vì vậy, chúng ta có thể không thực sự dễ dàng tạo ra một segfault với điều này, nhưng rõ ràng điều này 184 00:08:16,940 --> 00:08:18,600 không phải là hành vi của tôi muốn. 185 00:08:18,600 --> 00:08:19,800 Vì vậy, các giải pháp đơn giản là những gì? 186 00:08:19,800 --> 00:08:25,650 Vâng, trong scanf-2, hãy để tôi đề nghị thay vì thực sự chỉ phân bổ một 187 00:08:25,650 --> 00:08:30,100 char *, hãy để tôi được một chút thông minh hơn về này, và để cho tôi phân bổ đệm 188 00:08:30,100 --> 00:08:32,940 như là một chuỗi 16 ký tự. 189 00:08:32,940 --> 00:08:34,200 >> Vì vậy, tôi có thể làm điều này trong một vài cách. 190 00:08:34,200 --> 00:08:35,610 Tôi hoàn toàn có thể sử dụng malloc. 191 00:08:35,610 --> 00:08:38,980 Nhưng tôi có thể quay trở lại tuần hai khi Tôi cần một đống 192 00:08:38,980 --> 00:08:39,620 ký tự. 193 00:08:39,620 --> 00:08:40,860 Đó chỉ là một mảng. 194 00:08:40,860 --> 00:08:44,870 Vì vậy, hãy để tôi thay vì xác định lại đệm là một mảng 16 ký tự. 195 00:08:44,870 --> 00:08:47,340 >> Và bây giờ, khi tôi vượt qua bộ đệm trong - 196 00:08:47,340 --> 00:08:49,940 và điều này là một cái gì đó chúng tôi đã không nói về trong tuần hai - 197 00:08:49,940 --> 00:08:53,730 nhưng bạn có thể điều trị một mảng như mặc dù nó là một địa chỉ. 198 00:08:53,730 --> 00:08:56,390 Về mặt kỹ thuật, như chúng ta đã thấy, họ một chút khác nhau. 199 00:08:56,390 --> 00:09:01,290 Nhưng scanf sẽ không nhớ nếu bạn vượt qua nó tên của một mảng, bởi vì những gì 200 00:09:01,290 --> 00:09:05,030 Kêu vang sẽ làm cho chúng ta về cơ bản là xử lý tên của mảng đó là 201 00:09:05,030 --> 00:09:08,280 địa chỉ của đoạn 16 byte. 202 00:09:08,280 --> 00:09:09,550 >> Vì vậy, điều này là tốt. 203 00:09:09,550 --> 00:09:12,110 Điều này có nghĩa là bây giờ mà tôi có thể hy vọng làm như sau. 204 00:09:12,110 --> 00:09:16,800 Hãy để tôi thu nhỏ cho một thời điểm và làm cho scanf-2, biên soạn OK. 205 00:09:16,800 --> 00:09:19,390 Bây giờ chúng tôi không có dấu gạch chéo scanf-2. 206 00:09:19,390 --> 00:09:22,430 Chuỗi xin. "Xin chào." Và nó dường như làm việc thời gian này. 207 00:09:22,430 --> 00:09:26,020 >> Nhưng ai đó có thể đề xuất một kịch bản trong đó nó có thể không còn hoạt động? 208 00:09:26,020 --> 00:09:28,550 Yeah? 209 00:09:28,550 --> 00:09:30,640 Một cái gì đó dài hơn 16 ký tự. 210 00:09:30,640 --> 00:09:32,020 Và thực sự, chúng ta có thể một chút chính xác hơn. 211 00:09:32,020 --> 00:09:36,540 Một cái gì đó dài hơn 15 ký tự, bởi vì thực sự chúng ta cần phải ghi nhớ 212 00:09:36,540 --> 00:09:39,920 rằng chúng ta cần có dấu gạch chéo ngược không ngầm ở cuối chuỗi, 213 00:09:39,920 --> 00:09:42,950 đó là một sang một bên scanf sẽ thường chăm sóc cho chúng tôi. 214 00:09:42,950 --> 00:09:46,210 >> Vì vậy, hãy để tôi làm một cái gì đó như - 215 00:09:46,210 --> 00:09:48,040 đôi khi chúng ta chỉ có thể để nó như thế. 216 00:09:48,040 --> 00:09:50,630 OK, vì vậy chúng tôi đã gây ra tại lỗi phân khúc của chúng tôi. 217 00:09:50,630 --> 00:09:51,000 Tại sao? 218 00:09:51,000 --> 00:09:54,940 Bởi vì tôi đã gõ đến hơn 15 ký tự, và vì vậy chúng tôi đã thực sự 219 00:09:54,940 --> 00:09:58,280 bộ nhớ xúc động mà tôi thực sự không nên có. 220 00:09:58,280 --> 00:10:00,180 >> Vì vậy, những gì thực sự là giải pháp ở đây? 221 00:10:00,180 --> 00:10:02,210 Vâng, nếu chúng ta cần một chuỗi dài hơn? 222 00:10:02,210 --> 00:10:03,960 Vâng, chúng tôi có thể làm cho nó 32 byte. 223 00:10:03,960 --> 00:10:05,160 Vâng, những gì nếu đó là không đủ dài? 224 00:10:05,160 --> 00:10:06,040 Làm thế nào về 64 byte? 225 00:10:06,040 --> 00:10:07,080 Nếu đó là không đủ dài? 226 00:10:07,080 --> 00:10:09,640 Làm thế nào về 128 hoặc 200 byte? 227 00:10:09,640 --> 00:10:12,660 Điều gì thực sự là giải pháp ở đây trường hợp tổng quát, nếu chúng ta không biết 228 00:10:12,660 --> 00:10:14,460 tiến những gì người dùng sẽ gõ? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> Nó chỉ là loại một nỗi đau lớn trong ass, phải trung thực, đó là lý do 231 00:10:23,050 --> 00:10:29,050 CS50 thư viện có một vài chục dòng mã thực hiện chung 232 00:10:29,050 --> 00:10:32,390 GetString chuỗi trong một cách mà chúng tôi làm không phải biết trước những gì các 233 00:10:32,390 --> 00:10:33,430 người sử dụng sẽ gõ. 234 00:10:33,430 --> 00:10:37,370 Đặc biệt, nếu bạn nhìn lại cs50.c từ cách đây hai tuần, bạn sẽ thấy 235 00:10:37,370 --> 00:10:40,480 GetString mà thực sự không không sử dụng scanf theo cách này. 236 00:10:40,480 --> 00:10:43,720 Thay vào đó, nó đọc một ký tự tại một thời điểm. 237 00:10:43,720 --> 00:10:46,010 >> Bởi vì một trong những điều tốt đẹp về đọc một ký tự là chúng ta có thể 238 00:10:46,010 --> 00:10:48,490 đảm bảo chính mình để luôn luôn có ít nhất một ký tự. 239 00:10:48,490 --> 00:10:51,740 Tôi chỉ có thể tuyên bố một char, và sau đó đi các bước thực sự em bé chỉ 240 00:10:51,740 --> 00:10:54,380 đọc một ký tự trong một thời gian từ bàn phím. 241 00:10:54,380 --> 00:10:58,240 Và sau đó, những gì bạn sẽ thấy GetString hiện là mỗi lần nó chạy ra khỏi, 242 00:10:58,240 --> 00:11:02,280 nói, 16 byte bộ nhớ, nó sử dụng malloc, hoặc một người anh em họ của nó, để 243 00:11:02,280 --> 00:11:06,810 cấp phát bộ nhớ hơn, sao chép cũ nhớ vào mới, và sau đó bò 244 00:11:06,810 --> 00:11:09,900 cùng, nhận được một ký tự tại một thời gian, và khi nó chạy ra khỏi đó 245 00:11:09,900 --> 00:11:13,370 đoạn bộ nhớ, ném nó đi, gầu ngoạm một phần lớn của bộ nhớ, bản sao cũ 246 00:11:13,370 --> 00:11:14,750 vào mới, và lặp đi lặp lại. 247 00:11:14,750 --> 00:11:18,480 Và nó thực sự là một nỗi đau thực sự thực hiện một cái gì đó đơn giản như 248 00:11:18,480 --> 00:11:19,710 nhận được thông tin từ một người sử dụng. 249 00:11:19,710 --> 00:11:21,090 >> Vì vậy, bạn có thể sử dụng scanf. 250 00:11:21,090 --> 00:11:22,430 Bạn có thể sử dụng chức năng tương tự khác. 251 00:11:22,430 --> 00:11:25,420 Và rất nhiều sách giáo khoa và trực tuyến ví dụ làm, nhưng tất cả đều 252 00:11:25,420 --> 00:11:27,210 dễ bị tổn thương với các vấn đề như thế này. 253 00:11:27,210 --> 00:11:29,550 Và cuối cùng, bị một segfault là loại gây phiền nhiễu. 254 00:11:29,550 --> 00:11:30,680 Nó không tốt cho người sử dụng. 255 00:11:30,680 --> 00:11:33,560 >> Nhưng trong trường hợp xấu nhất, những gì hiện nó về cơ bản đặt của bạn 256 00:11:33,560 --> 00:11:37,160 đang có nguy cơ? 257 00:11:37,160 --> 00:11:39,250 Một số loại tấn công, có khả năng. 258 00:11:39,250 --> 00:11:41,680 Chúng tôi đã nói về một cuộc tấn công như vậy - tràn stack. 259 00:11:41,680 --> 00:11:44,660 Nhưng nói chung, nếu bạn được phép tràn bộ đệm, như chúng tôi đã làm một 260 00:11:44,660 --> 00:11:48,070 vài tuần trước đây, chỉ với văn bản hơn "hello" trên ngăn xếp, bạn 261 00:11:48,070 --> 00:11:52,330 thực sự có thể đi qua, có khả năng, một máy tính, hoặc ít nhất là có được ít dữ liệu 262 00:11:52,330 --> 00:11:53,510 không thuộc về bạn. 263 00:11:53,510 --> 00:11:55,970 >> Vì vậy, trong ngắn hạn, đây là lý do tại sao chúng tôi có những bánh xe đào tạo. 264 00:11:55,970 --> 00:11:59,090 Nhưng bây giờ, chúng ta bắt đầu đưa họ ra, như các chương trình của chúng tôi không còn cần, 265 00:11:59,090 --> 00:12:00,610 nhất thiết phải, đầu vào từ người sử dụng. 266 00:12:00,610 --> 00:12:03,960 Nhưng trong trường hợp của vấn đề thiết lập sáu, đầu vào của bạn sẽ đến từ một lớn 267 00:12:03,960 --> 00:12:07,520 tập tin từ điển với 150 số lẻ ngàn chữ. 268 00:12:07,520 --> 00:12:10,330 >> Vì vậy, bạn sẽ không phải lo lắng về đầu vào tùy ý của người dùng. 269 00:12:10,330 --> 00:12:13,720 Chúng tôi sẽ cung cấp cho bạn một số giả định về tập tin đó. 270 00:12:13,720 --> 00:12:20,340 Bất kỳ câu hỏi về con trỏ hoặc scanf hoặc người sử dụng đầu vào nói chung? 271 00:12:20,340 --> 00:12:24,450 >> Được rồi, do đó, một cái nhìn nhanh chóng sau đó tại một theo sau chủ đề từ hai tuần trước. 272 00:12:24,450 --> 00:12:28,590 Và đó là khái niệm về một cấu trúc. 273 00:12:28,590 --> 00:12:34,180 Không phải là - khái niệm này của một cấu trúc, đó là những gì? 274 00:12:34,180 --> 00:12:35,430 Điều gì đã làm cấu trúc làm cho chúng ta? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Xác định - 277 00:12:39,860 --> 00:12:41,710 xin lỗi? 278 00:12:41,710 --> 00:12:42,820 Xác định một kiểu biến. 279 00:12:42,820 --> 00:12:44,410 Vì vậy, sắp xếp của. 280 00:12:44,410 --> 00:12:46,180 Chúng tôi đang thực sự kết hợp hai chủ đề. 281 00:12:46,180 --> 00:12:49,510 Vì vậy, với typedef, nhớ lại rằng chúng ta có thể khai báo một kiểu riêng của chúng tôi, như một 282 00:12:49,510 --> 00:12:51,500 từ đồng nghĩa, như chuỗi cho char *. 283 00:12:51,500 --> 00:12:56,200 Nhưng sử dụng typedef và cấu trúc, chúng ta có thể tạo ra sự cấu trúc dữ liệu của chúng ta. 284 00:12:56,200 --> 00:12:59,600 >> Ví dụ, nếu tôi quay trở lại vào gedit đây chỉ là một thời điểm, và tôi đi trước 285 00:12:59,600 --> 00:13:08,230 và làm điều gì đó như thế, hãy để tôi tiết kiệm này, chúng ta hãy nói, structs.c 286 00:13:08,230 --> 00:13:10,840 tạm thời, tôi chỉ cần đi đi trước và bao gồm 287 00:13:10,840 --> 00:13:14,360 standardio.h, int chính hiệu. 288 00:13:14,360 --> 00:13:18,960 Và sau đó trong đây, giả sử tôi muốn viết một chương trình mà các cửa hàng 289 00:13:18,960 --> 00:13:21,840 nhiều sinh viên đến từ nhiều nhà ở, ví dụ. 290 00:13:21,840 --> 00:13:24,430 Vì vậy, nó giống như một registrarial cơ sở dữ liệu của một số loại. 291 00:13:24,430 --> 00:13:29,550 >> Vì vậy, nếu tôi cần tên một sinh viên, tôi có thể làm một cái gì đó như char tên *, 292 00:13:29,550 --> 00:13:31,570 và tôi sẽ làm một cái gì đó như - 293 00:13:31,570 --> 00:13:34,410 trên thực tế, chúng ta hãy sử dụng thư viện CS50 chỉ một chút thời gian để thực hiện điều này 294 00:13:34,410 --> 00:13:38,380 chút đơn giản, vì vậy chúng tôi có thể vay những hàng chục dòng mã. 295 00:13:38,380 --> 00:13:39,340 Và chúng ta chỉ là giữ nó đơn giản. 296 00:13:39,340 --> 00:13:42,610 Chúng tôi sẽ giữ nó chuỗi, và bây giờ GetString. 297 00:13:42,610 --> 00:13:47,420 >> Vì vậy, tôi khẳng định bây giờ mà tôi đã được lưu trữ tên của một số sinh viên, và nhà 298 00:13:47,420 --> 00:13:50,240 một số sinh viên, chỉ đơn giản là sử dụng các biến như chúng tôi đã làm và trong một tuần. 299 00:13:50,240 --> 00:13:52,370 Nhưng giả sử bây giờ tôi muốn hỗ trợ nhiều sinh viên. 300 00:13:52,370 --> 00:13:58,460 Được rồi, bản năng của tôi là làm chuỗi name2, được GetString, chuỗi 301 00:13:58,460 --> 00:14:01,370 House2 được GetString. 302 00:14:01,370 --> 00:14:05,850 Và sau đó sinh viên thứ ba của chúng tôi, chúng ta hãy làm NAME3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> Được rồi, vì vậy đây là hy vọng nổi bật bạn là ngu ngốc, 304 00:14:09,170 --> 00:14:11,580 bởi vì quá trình này là thực sự không bao giờ sẽ kết thúc, và nó chỉ cần đi để 305 00:14:11,580 --> 00:14:13,130 làm cho mã của tôi trông tệ hơn và tồi tệ hơn và tồi tệ hơn. 306 00:14:13,130 --> 00:14:14,810 Nhưng chúng tôi giải quyết này trong quá hai tuần. 307 00:14:14,810 --> 00:14:19,450 Giải pháp tương đối sạch sẽ của chúng tôi là gì khi chúng tôi đã có nhiều biến của 308 00:14:19,450 --> 00:14:23,580 kiểu dữ liệu được tất cả các liên quan, nhưng chúng tôi không muốn lộn xộn tồi tệ này 309 00:14:23,580 --> 00:14:26,870 các biến có tên tương tự? 310 00:14:26,870 --> 00:14:30,060 Chúng tôi đã làm gì để thay thế? 311 00:14:30,060 --> 00:14:31,260 >> Vì vậy, tôi nghĩ rằng tôi nghe một vài nơi. 312 00:14:31,260 --> 00:14:32,590 Chúng tôi đã có một mảng. 313 00:14:32,590 --> 00:14:37,110 Nếu bạn muốn có nhiều trường hợp của một cái gì đó, tại sao chúng ta không làm sạch tất cả điều này 314 00:14:37,110 --> 00:14:39,540 và chỉ nói, cho tôi mảng gọi tên? 315 00:14:39,540 --> 00:14:41,640 >> Và bây giờ, chúng ta hãy cứng mã 3. 316 00:14:41,640 --> 00:14:44,450 Và sau đó cung cấp cho tôi một mảng khác được gọi là nhà, và cho tôi cho 317 00:14:44,450 --> 00:14:45,800 bây giờ đang khó khăn 3. 318 00:14:45,800 --> 00:14:49,220 Và tôi đã ồ ạt làm sạch các gây rối mà tôi vừa tạo ra. 319 00:14:49,220 --> 00:14:52,400 Bây giờ, tôi vẫn còn cứng mã hoá 3, nhưng thậm chí 3 động có thể đến từ các 320 00:14:52,400 --> 00:14:54,350 người sử dụng, hoặc argv, hoặc tương tự. 321 00:14:54,350 --> 00:14:55,720 Vì vậy, đây là đã sạch hơn. 322 00:14:55,720 --> 00:15:00,100 >> Nhưng những gì khó chịu về điều này có nghĩa là bây giờ, mặc dù một tên là bằng cách nào đó 323 00:15:00,100 --> 00:15:02,280 về cơ bản liên quan đến nhà của học sinh - 324 00:15:02,280 --> 00:15:04,720 đó là một sinh viên mà tôi thực sự muốn đại diện cho - 325 00:15:04,720 --> 00:15:08,080 Bây giờ tôi có hai mảng mà song song trong ý nghĩa rằng họ là 326 00:15:08,080 --> 00:15:13,930 cùng kích thước, tên và khung 0 có lẽ là bản đồ đến nhà khung 0, 327 00:15:13,930 --> 00:15:16,600 và tên khung 1 bản đồ nhà ở khung 1. 328 00:15:16,600 --> 00:15:19,280 Nói cách khác, sinh viên sống trong ngôi nhà, và sinh viên khác 329 00:15:19,280 --> 00:15:20,530 cuộc sống trong căn nhà khác. 330 00:15:20,530 --> 00:15:23,720 Nhưng chắc chắn điều này có thể thực hiện thậm chí sạch hơn. 331 00:15:23,720 --> 00:15:24,990 >> Vâng, nó có thể, trong thực tế. 332 00:15:24,990 --> 00:15:28,730 Và để cho tôi đi trước và mở structs.h lên, và bạn sẽ 333 00:15:28,730 --> 00:15:31,130 thấy ý tưởng này đây. 334 00:15:31,130 --> 00:15:34,905 Chú ý rằng tôi đã sử dụng typedef, như bạn ám chỉ một khoảnh khắc trước tuyên bố của chúng tôi 335 00:15:34,905 --> 00:15:35,570 kiểu dữ liệu riêng. 336 00:15:35,570 --> 00:15:39,660 Nhưng tôi cũng sử dụng từ khóa khác này được gọi là cấu trúc mang đến cho tôi một mới 337 00:15:39,660 --> 00:15:40,790 cấu trúc dữ liệu. 338 00:15:40,790 --> 00:15:43,980 >> Và cấu trúc dữ liệu này, tôi khẳng định sẽ có hai điều bên trong 339 00:15:43,980 --> 00:15:47,060 nó - một chuỗi gọi tên, và một chuỗi được gọi là nhà. 340 00:15:47,060 --> 00:15:49,820 Và tên tôi sẽ cung cấp cho cấu trúc dữ liệu này sẽ 341 00:15:49,820 --> 00:15:51,005 được gọi là sinh viên. 342 00:15:51,005 --> 00:15:54,030 Tôi có thể gọi nó là bất cứ điều gì tôi muốn, nhưng điều này làm cho ngữ nghĩa 343 00:15:54,030 --> 00:15:55,810 cảm nhận với tôi trong tâm trí của tôi. 344 00:15:55,810 --> 00:15:59,160 >> Vì vậy, bây giờ, nếu tôi mở ra một phiên bản tốt hơn của chương trình tôi bắt đầu viết 345 00:15:59,160 --> 00:16:00,390 có, hãy để tôi di chuyển đến đầu trang. 346 00:16:00,390 --> 00:16:03,190 Và có dòng một số chi tiết của mã ở đây, nhưng hãy để tôi tập trung cho 347 00:16:03,190 --> 00:16:04,160 thời điểm trên một. 348 00:16:04,160 --> 00:16:07,790 Tôi đã tuyên bố một hằng số gọi là sinh viên và cứng mã hoá 3 cho giờ. 349 00:16:07,790 --> 00:16:11,110 Nhưng bây giờ, chú ý cách sạch mã của tôi bắt đầu để có được. 350 00:16:11,110 --> 00:16:15,030 >> Trong dòng 22, tôi tuyên bố mảng của học sinh. 351 00:16:15,030 --> 00:16:18,760 Và nhận thấy rằng sinh viên là rõ ràng bây giờ là một kiểu dữ liệu. 352 00:16:18,760 --> 00:16:23,360 Bởi vì ở trên cùng của tập tin này, thông báo Tôi đã bao gồm tập tin tiêu đề 353 00:16:23,360 --> 00:16:24,820 mà tôi kéo lên chỉ là một thời điểm trước đây. 354 00:16:24,820 --> 00:16:28,820 Và rằng tập tin tiêu đề khá đơn giản có định nghĩa này của một học sinh. 355 00:16:28,820 --> 00:16:32,470 >> Vì vậy, bây giờ, tôi đã tạo ra dữ liệu riêng của tôi loại mà các tác giả của C năm 356 00:16:32,470 --> 00:16:33,890 trước đã không nghĩ đến trước. 357 00:16:33,890 --> 00:16:34,570 Nhưng không có vấn đề. 358 00:16:34,570 --> 00:16:35,870 Tôi có thể làm cho bản thân mình. 359 00:16:35,870 --> 00:16:39,050 Vì vậy, đây là một mảng gọi là sinh viên, mỗi thành viên có 360 00:16:39,050 --> 00:16:41,100 là một cấu trúc sinh viên. 361 00:16:41,100 --> 00:16:44,270 Và tôi muốn ba của những trong mảng. 362 00:16:44,270 --> 00:16:46,030 >> Và bây giờ, những gì hiện phần còn lại của chương trình này làm gì? 363 00:16:46,030 --> 00:16:47,550 Tôi cần một chút gì đó tùy ý. 364 00:16:47,550 --> 00:16:51,450 Vì vậy, từ trực tuyến 24 trở đi, Tôi lặp lại 0-3. 365 00:16:51,450 --> 00:16:54,000 Sau đó tôi yêu cầu người dùng tên của học sinh. 366 00:16:54,000 --> 00:16:56,110 Và sau đó tôi sử dụng GetString như trước. 367 00:16:56,110 --> 00:16:59,410 Sau đó, tôi yêu cầu nhà của học sinh, và tôi sử dụng GetString như trước. 368 00:16:59,410 --> 00:17:01,780 >> Nhưng thông báo - một chút mới mảnh cú pháp - 369 00:17:01,780 --> 00:17:07,010 Tôi vẫn có thể chỉ cho học sinh thứ i, nhưng làm thế nào để có được các dữ liệu cụ thể 370 00:17:07,010 --> 00:17:08,354 lĩnh vực bên trong các cấu trúc? 371 00:17:08,354 --> 00:17:11,770 Tốt, những gì là rõ ràng là đoạn mới của cú pháp? 372 00:17:11,770 --> 00:17:13,339 Nó chỉ là dấu chấm. 373 00:17:13,339 --> 00:17:14,510 >> Chúng tôi đã không thực sự thấy trước đây. 374 00:17:14,510 --> 00:17:17,819 Bạn đã nhìn thấy nó trong pset năm nếu bạn đã lặn trong đã có file bitmap. 375 00:17:17,819 --> 00:17:22,372 Nhưng dấu chấm chỉ có nghĩa là bên trong này cấu trúc hoặc nhiều lĩnh vực, cho dấu chấm 376 00:17:22,372 --> 00:17:24,510 tên, hoặc cho tôi chấm nhà. 377 00:17:24,510 --> 00:17:28,690 Điều đó có nghĩa đi bên trong các cấu trúc và nhận được những lĩnh vực cụ thể. 378 00:17:28,690 --> 00:17:30,200 >> Những gì còn lại của chương trình này làm gì? 379 00:17:30,200 --> 00:17:31,190 Nó không phải là tất cả những gì gợi cảm. 380 00:17:31,190 --> 00:17:34,640 Chú ý rằng tôi lặp 0-3 một lần nữa, và tôi chỉ đơn giản là tạo ra một tiếng Anh 381 00:17:34,640 --> 00:17:40,500 cụm từ như vậy và như vậy là trong đó và một ngôi nhà như vậy, đi qua trong dấu chấm tên từ 382 00:17:40,500 --> 00:17:43,320 học sinh thứ i và họ nhà là tốt. 383 00:17:43,320 --> 00:17:47,560 >> Và sau đó cuối cùng, bây giờ chúng tôi sẽ bắt đầu để có được hậu môn về điều này, bây giờ mà chúng tôi 384 00:17:47,560 --> 00:17:49,580 quen thuộc với những gì malloc và các chức năng khác đã được 385 00:17:49,580 --> 00:17:50,570 làm tất cả những thời gian này. 386 00:17:50,570 --> 00:17:54,220 Tại sao tôi phải để giải phóng cả hai tên và ngôi nhà, mặc dù tôi 387 00:17:54,220 --> 00:17:56,960 không gọi malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString đã làm. 389 00:17:58,020 --> 00:18:00,930 Và đó là bí mật nhỏ bẩn cho vài tuần, nhưng có GetString 390 00:18:00,930 --> 00:18:03,530 bị rò rỉ bộ nhớ trên tất cả các đặt tất cả các học kỳ cho đến nay. 391 00:18:03,530 --> 00:18:05,990 Và valgrand sẽ cuối cùng tiết lộ này cho chúng tôi. 392 00:18:05,990 --> 00:18:10,730 >> Nhưng nó không phải là một vấn đề lớn, bởi vì tôi biết rằng tôi chỉ đơn giản là có thể giải phóng các tên 393 00:18:10,730 --> 00:18:15,750 và ngôi nhà, mặc dù về mặt kỹ thuật, để được siêu, siêu an toàn, tôi sẽ có 394 00:18:15,750 --> 00:18:17,890 làm một số kiểm tra lỗi ở đây. 395 00:18:17,890 --> 00:18:19,040 Được bản năng của bạn nói cho bạn những gì? 396 00:18:19,040 --> 00:18:22,480 Tôi cần được kiểm tra để làm gì trước khi tôi giải phóng là những gì một 397 00:18:22,480 --> 00:18:25,470 chuỗi, hay còn gọi mà một char *? 398 00:18:25,470 --> 00:18:33,460 >> Tôi thực sự cần được kiểm tra nếu học sinh khung tôi chấm tên không 399 00:18:33,460 --> 00:18:34,840 vô giá trị như nhau. 400 00:18:34,840 --> 00:18:40,400 Sau đó nó sẽ được OK để đi trước và miễn phí con trỏ đó, và cùng hay khác 401 00:18:40,400 --> 00:18:41,160 một là tốt. 402 00:18:41,160 --> 00:18:46,860 Nếu học sinh khung tôi chấm nhà không phải là bằng vô giá trị, điều này bây giờ sẽ bảo vệ 403 00:18:46,860 --> 00:18:52,520 đối với trường hợp góc trong đó GetString trả về một cái gì đó như vô giá trị. 404 00:18:52,520 --> 00:18:57,310 Và chúng ta đã thấy một thời điểm trước đây, sẽ printf bảo vệ chúng ta lên đây bằng cách nói 405 00:18:57,310 --> 00:18:58,990 null, mà là sẽ xem xét lạ. 406 00:18:58,990 --> 00:19:02,340 Nhưng ít nhất nó sẽ không segfault, như chúng ta đã thấy. 407 00:19:02,340 --> 00:19:05,990 >> Vâng, hãy để tôi làm một việc khác ở đây. cấu trúc-0 là loại một chương trình ngu ngốc 408 00:19:05,990 --> 00:19:09,700 bởi vì tôi nhập tất cả các dữ liệu này, và sau đó nó bị mất một khi chương trình kết thúc. 409 00:19:09,700 --> 00:19:10,940 Nhưng hãy để tôi đi trước và làm điều này. 410 00:19:10,940 --> 00:19:12,830 Hãy để tôi làm cho các thiết bị đầu cuối cửa sổ lớn hơn một chút. 411 00:19:12,830 --> 00:19:17,000 Hãy để tôi làm cho cấu trúc-1, là một phiên bản mới này. 412 00:19:17,000 --> 00:19:18,520 >> Tôi sẽ phóng to một chút. 413 00:19:18,520 --> 00:19:21,620 Và bây giờ cho phép tôi chạy dot cắt giảm cấu trúc-1. 414 00:19:21,620 --> 00:19:22,590 Tên học sinh - 415 00:19:22,590 --> 00:19:31,500 David Mather, chúng ta hãy làm Rob Kirkland, chúng ta hãy làm Lauren Leverett. 416 00:19:31,500 --> 00:19:33,650 Điều thú vị bây giờ là thông báo - 417 00:19:33,650 --> 00:19:35,540 và tôi chỉ biết điều này vì Tôi đã viết chương trình - 418 00:19:35,540 --> 00:19:38,930 có một tập tin bây giờ hiện tại của tôi thư mục gọi là students.csv. 419 00:19:38,930 --> 00:19:40,420 Một số bạn có thể đã thấy những trong thế giới thực. 420 00:19:40,420 --> 00:19:42,980 >> Một tập tin CSV là những gì? 421 00:19:42,980 --> 00:19:44,170 Bằng dấu phẩy giá trị. 422 00:19:44,170 --> 00:19:46,670 Đó là loại giống như một người đàn ông của người nghèo phiên bản của một tập tin Excel. 423 00:19:46,670 --> 00:19:50,580 Đó là một bảng các hàng và cột bạn có thể mở trong một chương trình như Excel, 424 00:19:50,580 --> 00:19:51,800 hoặc số trên máy Mac. 425 00:19:51,800 --> 00:19:55,180 >> Và nếu tôi mở tập tin này đây trên gedit, thông báo - và con số này không có. 426 00:19:55,180 --> 00:19:57,360 Đó chỉ là gedit nói tôi số dòng. 427 00:19:57,360 --> 00:19:59,740 Thông báo trên dòng đầu tiên của này tập tin là David và Mather. 428 00:19:59,740 --> 00:20:01,450 Dòng tiếp theo là Rob dấu phẩy Kirkland. 429 00:20:01,450 --> 00:20:04,170 Và dòng thứ ba là Lauren Leverett dấu phẩy. 430 00:20:04,170 --> 00:20:05,480 >> Vì vậy, những gì tôi đã tạo ra? 431 00:20:05,480 --> 00:20:09,580 Bây giờ tôi đã viết một chương trình C hiệu quả có thể tạo ra các bảng tính 432 00:20:09,580 --> 00:20:11,840 có thể được mở trong một chương trình như Excel. 433 00:20:11,840 --> 00:20:15,520 Không phải tất cả mà hấp dẫn một bộ dữ liệu, nhưng nếu bạn có khối lớn hơn nhiều 434 00:20:15,520 --> 00:20:18,440 dữ liệu mà bạn thực sự muốn thao tác và làm cho đồ thị của và 435 00:20:18,440 --> 00:20:21,260 thích, đây có lẽ là một cách để tạo ra dữ liệu đó. 436 00:20:21,260 --> 00:20:25,370 Hơn nữa, CSVs thực sự siêu chung chỉ để lưu trữ dữ liệu đơn giản - 437 00:20:25,370 --> 00:20:28,940 Yahoo Tài chính, ví dụ, nếu bạn nhận được giá cổ phiếu thông qua cái gọi là của họ 438 00:20:28,940 --> 00:20:33,180 API, các dịch vụ miễn phí cho phép bạn có được hiện tại cổ phiếu up-to-the-ngày 439 00:20:33,180 --> 00:20:35,650 báo giá cho các công ty, họ cung cấp cho các dữ liệu trở lại trong 440 00:20:35,650 --> 00:20:37,800 siêu định dạng CSV đơn giản. 441 00:20:37,800 --> 00:20:39,380 >> Vì vậy, làm thế nào chúng tôi làm điều đó? 442 00:20:39,380 --> 00:20:42,530 Cũng nhận thấy, hầu hết các chương trình của này gần như giống nhau. 443 00:20:42,530 --> 00:20:46,870 Nhưng nhận thấy ở đây, chứ không phải in các sinh viên ra ngoài, trên đường 35 444 00:20:46,870 --> 00:20:51,040 trở đi, tôi cho rằng tôi đang tiết kiệm sinh viên vào đĩa, do đó tiết kiệm một tập tin. 445 00:20:51,040 --> 00:20:53,630 >> Vì vậy, nhận thấy tôi đang tuyên bố một FILE * - 446 00:20:53,630 --> 00:20:57,260 bây giờ, đây là loại một sự bất thường trong C. Vì lý do gì, tập tin là tất cả các mũ, 447 00:20:57,260 --> 00:21:00,690 mà không giống như hầu hết các loại dữ liệu khác trong C. Tuy nhiên, đây là một built-in 448 00:21:00,690 --> 00:21:02,320 kiểu dữ liệu, FILE *. 449 00:21:02,320 --> 00:21:05,900 Và tôi tuyên bố một con trỏ đến một tập tin, là làm thế nào bạn có thể nghĩ rằng. 450 00:21:05,900 --> 00:21:08,070 >> fopen có nghĩa là tập tin mở. 451 00:21:08,070 --> 00:21:09,470 Tập tin làm những gì bạn muốn mở? 452 00:21:09,470 --> 00:21:12,620 Tôi muốn mở một tập tin mà tôi sẽ tùy tiện gọi students.csv. 453 00:21:12,620 --> 00:21:14,480 Tôi có thể gọi đó là bất cứ điều gì tôi muốn. 454 00:21:14,480 --> 00:21:15,200 >> Và sau đó có nhiều phán đoán. 455 00:21:15,200 --> 00:21:18,960 Những gì hiện các số thứ hai để fopen có thể nghĩa là gì? 456 00:21:18,960 --> 00:21:21,480 Phải, w cho viết, có thể là r để đọc. 457 00:21:21,480 --> 00:21:24,120 Có một cho nối thêm nếu bạn muốn thêm hàng và không 458 00:21:24,120 --> 00:21:25,200 ghi đè lên toàn bộ sự việc. 459 00:21:25,200 --> 00:21:28,005 >> Nhưng tôi chỉ muốn tạo ra tập tin này một lần, vì vậy tôi sẽ sử dụng trích dẫn unquote w. 460 00:21:28,005 --> 00:21:31,880 Và tôi biết rằng chỉ từ khi đọc các tài liệu, hoặc các trang người đàn ông. 461 00:21:31,880 --> 00:21:35,100 Nếu tập tin không phải là null - nói cách khác, nếu không có gì đã xảy ra ở đó - 462 00:21:35,100 --> 00:21:37,820 hãy để tôi lặp qua sinh viên 0-3. 463 00:21:37,820 --> 00:21:40,410 >> Và bây giờ nhận thấy có điều gì đó bao giờ nên hơi khác nhau 464 00:21:40,410 --> 00:21:42,110 về dòng 41 đây. 465 00:21:42,110 --> 00:21:42,960 Nó không phải là printf. 466 00:21:42,960 --> 00:21:46,530 Đó là fprintf cho tập tin printf. 467 00:21:46,530 --> 00:21:47,790 Vì vậy, nó sẽ ghi vào tập tin. 468 00:21:47,790 --> 00:21:48,860 Tập tin đó? 469 00:21:48,860 --> 00:21:53,630 Một con trỏ mà bạn chỉ định như là đối số đầu tiên. 470 00:21:53,630 --> 00:21:55,940 >> Sau đó, chúng tôi chỉ định một chuỗi định dạng. 471 00:21:55,940 --> 00:21:59,660 Sau đó, chúng tôi xác định những chuỗi chúng ta muốn plug in cho tỷ lệ đầu tiên, và 472 00:21:59,660 --> 00:22:04,320 sau đó một biến hoặc s phần trăm giây. 473 00:22:04,320 --> 00:22:06,760 Sau đó chúng tôi đóng tập tin với fclose. 474 00:22:06,760 --> 00:22:09,380 Hơn tôi miễn phí bộ nhớ như trước đây, mặc dù Tôi nên đi trở lại và thêm 475 00:22:09,380 --> 00:22:10,540 một số kiểm tra cho null. 476 00:22:10,540 --> 00:22:12,090 >> Và đó là nó. 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, fclose mang lại cho tôi khả năng tạo ra tập tin văn bản. 478 00:22:16,960 --> 00:22:19,640 Bây giờ, bạn sẽ thấy trong vấn đề thiết lập năm, trong đó bao gồm hình ảnh, bạn sẽ được sử dụng 479 00:22:19,640 --> 00:22:20,990 tập tin nhị phân để thay thế. 480 00:22:20,990 --> 00:22:24,200 Nhưng về cơ bản, ý tưởng là như nhau, mặc dù các chức năng bạn sẽ 481 00:22:24,200 --> 00:22:28,710 thấy có một chút khác nhau. 482 00:22:28,710 --> 00:22:32,580 >> Vì vậy, du lịch cơn lốc, nhưng bạn sẽ nhận được tất cả các quá quen thuộc với các tập tin I/O-- 483 00:22:32,580 --> 00:22:34,960 đầu vào và đầu ra - với pset năm. 484 00:22:34,960 --> 00:22:38,607 Và bất kỳ câu hỏi về vấn đề cơ bản ban đầu đây? 485 00:22:38,607 --> 00:22:39,857 Yeah? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Nếu bạn cố gắng để giải phóng một giá trị null? 488 00:22:43,710 --> 00:22:48,880 Tôi tin rằng, nếu miễn phí đã nhận được một ít sử dụng, bạn có thể 489 00:22:48,880 --> 00:22:49,890 có khả năng segfault. 490 00:22:49,890 --> 00:22:54,160 Đi qua nó vô giá trị là xấu bởi vì tôi không tin miễn phí phiền để kiểm tra cho bạn, 491 00:22:54,160 --> 00:22:57,330 bởi vì nó có khả năng sẽ là một sự lãng phí thời gian cho nó để làm cho bản thân 492 00:22:57,330 --> 00:22:59,022 tất cả mọi người trên thế giới. 493 00:22:59,022 --> 00:23:00,590 Tốt câu hỏi, mặc dù. 494 00:23:00,590 --> 00:23:04,300 >> Được rồi, vì vậy loại này được chúng ta đến một chủ đề thú vị. 495 00:23:04,300 --> 00:23:07,010 Chủ đề của bộ vấn đề năm là pháp y. 496 00:23:07,010 --> 00:23:08,420 Ít nhất đó là một phần của bộ vấn đề. 497 00:23:08,420 --> 00:23:12,030 Pháp y thường dùng để chỉ phục hồi các thông tin có thể có hoặc 498 00:23:12,030 --> 00:23:14,110 có thể không đã bị xóa cố ý. 499 00:23:14,110 --> 00:23:18,680 Và vì vậy tôi nghĩ rằng tôi muốn cung cấp cho bạn một cách nhanh chóng hương vị của những gì thực sự đang diễn ra trên tất cả các 500 00:23:18,680 --> 00:23:21,230 thời gian này bên dưới mui xe của máy tính của bạn. 501 00:23:21,230 --> 00:23:23,960 >> Ví dụ, nếu bạn có bên trong của bạn máy tính xách tay hoặc máy tính để bàn của bạn một 502 00:23:23,960 --> 00:23:28,040 ổ cứng, nó hoặc là một cơ khí thiết bị thực sự quay - 503 00:23:28,040 --> 00:23:31,650 có những vòng tròn được gọi là đĩa cứng mà nhìn khá giống như những gì tôi 504 00:23:31,650 --> 00:23:34,540 chỉ có trên màn hình ở đây, mặc dù đây là trường ngày càng cũ. 505 00:23:34,540 --> 00:23:37,370 Đây là một ba-và-một-nửa-inch ổ cứng. 506 00:23:37,370 --> 00:23:40,070 Và ba và một nửa inch dùng của với những điều khi bạn cài đặt nó 507 00:23:40,070 --> 00:23:40,890 trong một máy tính. 508 00:23:40,890 --> 00:23:44,890 >> Nhiều người trong số các bạn trong máy tính xách tay của bạn bây giờ có ổ đĩa cứng SSD, hoặc ổ SSD, 509 00:23:44,890 --> 00:23:46,260 mà không có bộ phận chuyển động. 510 00:23:46,260 --> 00:23:49,170 Họ giống như bộ nhớ RAM và ít như các thiết bị cơ khí. 511 00:23:49,170 --> 00:23:51,450 Tuy nhiên, ý tưởng này vẫn như nhau, chắc chắn có liên quan 512 00:23:51,450 --> 00:23:52,790 cho vấn đề thiết lập năm. 513 00:23:52,790 --> 00:23:57,400 >> Và nếu bạn nghĩ về hiện tại một ổ đĩa cứng đại diện là một vòng tròn, mà 514 00:23:57,400 --> 00:23:58,930 Tôi sẽ vẽ như thế này đây. 515 00:23:58,930 --> 00:24:02,290 Khi bạn tạo một tập tin trên máy tính của bạn, cho dù đó là một ổ SSD, hoặc trong 516 00:24:02,290 --> 00:24:06,610 trường hợp này, một ổ đĩa cứng trường cũ, tập tin đó bao gồm nhiều bit. 517 00:24:06,610 --> 00:24:10,510 Hãy nói rằng đó là này 0 và 1, một bó toàn bộ các số 0 và 1. 518 00:24:10,510 --> 00:24:11,660 Vì vậy, đây là toàn bộ ổ đĩa cứng của tôi. 519 00:24:11,660 --> 00:24:13,225 Điều này rõ ràng là một tập tin khá lớn. 520 00:24:13,225 --> 00:24:18,080 Và nó được sử dụng các số 0 và 1 ở đó phần của đĩa vật lý. 521 00:24:18,080 --> 00:24:19,750 >> Vâng, đó là phần vật lý là gì? 522 00:24:19,750 --> 00:24:25,310 Vâng, nó quay ra rằng trên một ổ đĩa cứng, ít nhất thuộc loại này, có 523 00:24:25,310 --> 00:24:27,340 các hạt từ tính nhỏ bé. 524 00:24:27,340 --> 00:24:32,630 Và họ chủ yếu có ở phía bắc và cực nam cho họ, do đó nếu bạn 525 00:24:32,630 --> 00:24:35,710 biến một trong những hạt từ tính Bằng cách này, bạn có thể nói rằng đó là 526 00:24:35,710 --> 00:24:36,720 đại diện cho một 1. 527 00:24:36,720 --> 00:24:39,340 Và nếu nó lộn ngược về phía nam tới phía bắc, bạn có thể nói rằng đó là 528 00:24:39,340 --> 00:24:40,390 đại diện cho một 0. 529 00:24:40,390 --> 00:24:43,660 >> Vì vậy, trong thế giới vật chất thực tế, đó là làm thế nào bạn có thể đại diện cho một cái gì đó trong 530 00:24:43,660 --> 00:24:45,670 trạng thái nhị phân 0 và 1. 531 00:24:45,670 --> 00:24:46,720 Vì vậy, đó là tất cả một tập tin. 532 00:24:46,720 --> 00:24:49,300 Có một bó toàn bộ các từ hạt có cách này hay của họ 533 00:24:49,300 --> 00:24:51,920 Bằng cách này, các mô hình tạo của 0 và 1. 534 00:24:51,920 --> 00:24:56,760 >> Nhưng nó quay ra khi bạn lưu một tập tin, một số thông tin được lưu riêng. 535 00:24:56,760 --> 00:25:00,000 Vì vậy, đây là một bảng nhỏ, một thư mục, do đó, để nói chuyện. 536 00:25:00,000 --> 00:25:05,810 Và tôi sẽ gọi tên cột này, và Tôi sẽ gọi vị trí cột này. 537 00:25:05,810 --> 00:25:08,850 >> Và tôi sẽ nói, giả sử đây là hồ sơ của tôi. 538 00:25:08,850 --> 00:25:14,050 Resume.doc tôi được lưu trữ tại vị trí, chúng ta hãy nói 123. 539 00:25:14,050 --> 00:25:15,390 Tôi luôn luôn đi cho số đó. 540 00:25:15,390 --> 00:25:18,810 Nhưng nó đủ để nói rằng giống như trong bộ nhớ RAM, bạn có thể mất một ổ đĩa cứng 541 00:25:18,810 --> 00:25:22,350 đó là một GB hoặc 200 GB hoặc một terabyte, và bạn có thể 542 00:25:22,350 --> 00:25:23,750 số tất cả các byte. 543 00:25:23,750 --> 00:25:26,480 Bạn có thể đếm tất cả các khối của 8 bit. 544 00:25:26,480 --> 00:25:29,030 >> Vì vậy, chúng tôi sẽ nói rằng điều này là vị trí 123. 545 00:25:29,030 --> 00:25:32,070 Vì vậy, thư mục bên trong này điều hành của tôi hệ thống nhớ rằng tôi 546 00:25:32,070 --> 00:25:34,250 sơ yếu lý lịch là ở vị trí 123. 547 00:25:34,250 --> 00:25:36,850 Nhưng nó được thú vị khi bạn xóa một tập tin. 548 00:25:36,850 --> 00:25:37,820 >> Vì vậy, ví dụ - 549 00:25:37,820 --> 00:25:40,790 và may mắn thay, hầu hết trên thế giới có bị bắt vào này - những gì sẽ xảy ra khi 550 00:25:40,790 --> 00:25:45,040 bạn kéo một tập tin vào hệ điều hành Mac Thùng rác của bạn hoặc Windows Recycle Bin? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Mục đích của việc đó là những gì? 553 00:25:50,510 --> 00:25:53,860 Đó rõ ràng là để thoát khỏi các tập tin, nhưng những gì hiện các hành động kéo và 554 00:25:53,860 --> 00:25:57,550 rơi vào Thùng rác hoặc bạn của bạn Recycle Bin làm trên một máy tính? 555 00:25:57,550 --> 00:25:59,230 >> Hoàn toàn không có gì, thực sự. 556 00:25:59,230 --> 00:26:00,320 Nó giống như một thư mục. 557 00:26:00,320 --> 00:26:01,800 Đó là một thư mục đặc biệt, để đảm bảo. 558 00:26:01,800 --> 00:26:04,460 Nhưng nó thực sự xóa các tập tin? 559 00:26:04,460 --> 00:26:06,780 >> Vâng, không có, bởi vì một số bạn có thể đã được như thế, oh damn, bạn đã làm không 560 00:26:06,780 --> 00:26:07,420 có nghĩa là để làm điều đó. 561 00:26:07,420 --> 00:26:09,130 Vì vậy, bạn nhấn đúp chuột vào Thùng rác hoặc thùng rác. 562 00:26:09,130 --> 00:26:11,630 Bạn đã chọc xung quanh và bạn đã phục hồi các tập tin chỉ bằng cách kéo nó 563 00:26:11,630 --> 00:26:12,110 ra khỏi đó. 564 00:26:12,110 --> 00:26:14,420 Vì vậy, rõ ràng, nó không nhất thiết xóa nó. 565 00:26:14,420 --> 00:26:15,990 >> OK, bạn thông minh hơn. 566 00:26:15,990 --> 00:26:18,860 Bạn có biết rằng chỉ cần kéo nó vào trong Thùng rác Recycle Bin hoặc không có nghĩa là 567 00:26:18,860 --> 00:26:19,930 bạn đang đổ vào thùng rác. 568 00:26:19,930 --> 00:26:24,110 Vì vậy, bạn đi đến trình đơn, và bạn nói Thùng rác có sản phẩm nào hoặc Empty Recycle Bin. 569 00:26:24,110 --> 00:26:25,360 Sau đó điều gì sẽ xảy ra? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Yeah, vì vậy nó sẽ bị xóa nhiều hơn như vậy. 572 00:26:32,530 --> 00:26:37,660 Nhưng tất cả những gì xảy ra là điều này. 573 00:26:37,660 --> 00:26:45,350 Máy tính quên nơi resume.doc là. 574 00:26:45,350 --> 00:26:47,400 >> Nhưng những gì đã không thay đổi rõ ràng trong hình ảnh? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 Các bit, các số 0 và số 1 mà tôi khẳng định là trên trang web của một số khía cạnh vật lý của 577 00:26:55,570 --> 00:26:56,280 phần cứng. 578 00:26:56,280 --> 00:26:57,110 Họ vẫn còn đó. 579 00:26:57,110 --> 00:26:58,930 Nó chỉ là máy tính có quên những gì họ đang có. 580 00:26:58,930 --> 00:27:03,160 >> Vì vậy, nó về cơ bản giải phóng của tập tin bit để họ có thể được tái sử dụng. 581 00:27:03,160 --> 00:27:06,940 Nhưng không cho đến khi bạn tạo ra các tập tin nhiều hơn, và nhiều tập tin, và nhiều tập tin sẽ 582 00:27:06,940 --> 00:27:12,150 xác suất, những số 0 và 1, những hạt từ tính, được tái sử dụng, 583 00:27:12,150 --> 00:27:16,220 ngược hoặc bên phải lên, cho các file khác, 0 và 1. 584 00:27:16,220 --> 00:27:17,980 >> Vì vậy, bạn có cửa sổ này thời gian. 585 00:27:17,980 --> 00:27:19,860 Và nó không phải của dự đoán chiều dài, thực sự. 586 00:27:19,860 --> 00:27:22,240 Nó phụ thuộc vào kích thước của đĩa cứng của bạn ổ đĩa và bao nhiêu dữ liệu mà bạn có và 587 00:27:22,240 --> 00:27:23,490 nhanh như thế nào bạn làm cho những người mới. 588 00:27:23,490 --> 00:27:27,050 Nhưng có cửa sổ này thời gian trong mà tập tin đó vẫn còn hoàn toàn 589 00:27:27,050 --> 00:27:27,770 thu hồi. 590 00:27:27,770 --> 00:27:31,050 >> Vì vậy, nếu bạn đã bao giờ sử dụng các chương trình như McAfee hoặc Norton để cố gắng phục hồi 591 00:27:31,050 --> 00:27:35,680 dữ liệu, tất cả họ đang làm là cố gắng phục hồi này được gọi là thư mục 592 00:27:35,680 --> 00:27:37,340 tìm ra nơi tập tin của bạn được. 593 00:27:37,340 --> 00:27:40,605 Và đôi khi Norton và sẽ nói, tập tin là 93% thu hồi. 594 00:27:40,605 --> 00:27:42,020 Vâng, điều đó không có nghĩa là gì? 595 00:27:42,020 --> 00:27:45,690 Điều đó chỉ có nghĩa là một số file khác tình cờ đã kết thúc bằng cách sử dụng, nói, 596 00:27:45,690 --> 00:27:48,920 các bit ra của tập tin ban đầu của bạn. 597 00:27:48,920 --> 00:27:51,950 >> Vì vậy, những gì đang thực sự tham gia trong việc khôi phục dữ liệu? 598 00:27:51,950 --> 00:27:55,720 Vâng, nếu bạn không có một cái gì đó như Norton cài đặt sẵn trên máy tính của bạn, 599 00:27:55,720 --> 00:27:59,510 tốt nhất bạn đôi khi có thể làm là nhìn tại toàn bộ ổ đĩa cứng tìm kiếm 600 00:27:59,510 --> 00:28:00,510 mô hình của các bit. 601 00:28:00,510 --> 00:28:05,350 Và một trong những chủ đề của bộ vấn đề năm là bạn sẽ tìm kiếm 602 00:28:05,350 --> 00:28:09,570 tương đương với một ổ đĩa cứng, một pháp y hình ảnh của một thẻ flash nhỏ gọn từ một 603 00:28:09,570 --> 00:28:13,660 máy ảnh kỹ thuật số, tìm kiếm các số 0 và số 1 mà thông thường, với cao 604 00:28:13,660 --> 00:28:16,720 xác suất, đại diện cho bắt đầu của một hình ảnh JPEG. 605 00:28:16,720 --> 00:28:21,120 >> Và các bạn có thể khôi phục lại những hình ảnh bằng cách giả sử, nếu tôi thấy mô hình này 606 00:28:21,120 --> 00:28:24,380 bit trên hình ảnh pháp y, với xác suất cao, đánh dấu 607 00:28:24,380 --> 00:28:25,650 khởi đầu của một JPEG. 608 00:28:25,650 --> 00:28:29,520 Và nếu tôi thấy mô hình tương tự một lần nữa, mà có lẽ là điểm bắt đầu của 609 00:28:29,520 --> 00:28:32,440 khác JPEG, và một JPEG, và một JPEG. 610 00:28:32,440 --> 00:28:34,970 Và điều này là thường làm thế nào phục hồi dữ liệu sẽ làm việc. 611 00:28:34,970 --> 00:28:37,870 Mặc dù những gì tốt đẹp về hình ảnh JPEG là các định dạng tập tin chính nó là hơi 612 00:28:37,870 --> 00:28:44,400 phức tạp, đầu mỗi như vậy tập tin thực sự mang tính chất tương đối 613 00:28:44,400 --> 00:28:47,370 và đơn giản, như bạn sẽ thấy, nếu bạn đã không đã. 614 00:28:47,370 --> 00:28:50,270 >> Vì vậy, chúng ta hãy xem xét kỹ hơn bên dưới mui xe là chính xác những gì đang được 615 00:28:50,270 --> 00:28:53,360 xảy ra, và những gì các số 0 và 1 là, để cung cấp cho bạn nhiều hơn một chút 616 00:28:53,360 --> 00:28:55,330 bối cảnh thách thức đặc biệt này. 617 00:28:55,330 --> 00:28:55,510 >> [VIDEO xem lại] 618 00:28:55,510 --> 00:28:58,700 >> -Trong trường hợp máy tính của bạn lưu trữ tất của dữ liệu vĩnh viễn của nó. 619 00:28:58,700 --> 00:29:03,390 Để làm điều đó, các dữ liệu đi từ bộ nhớ RAM cùng với các tín hiệu phần mềm cho 620 00:29:03,390 --> 00:29:06,110 ổ cứng như thế nào để lưu trữ dữ liệu đó. 621 00:29:06,110 --> 00:29:09,410 Các mạch ổ cứng dịch những tín hiệu vào điện áp 622 00:29:09,410 --> 00:29:10,870 biến động. 623 00:29:10,870 --> 00:29:14,970 Này, đến lượt nó, điều khiển của ổ đĩa cứng bộ phận chuyển động, một số trong số ít 624 00:29:14,970 --> 00:29:17,910 bộ phận chuyển động còn lại trong máy tính hiện đại. 625 00:29:17,910 --> 00:29:22,130 >> Một số của các tín hiệu điều khiển động cơ mà quay đĩa cứng kim loại tráng. 626 00:29:22,130 --> 00:29:25,470 Dữ liệu của bạn là thực sự được lưu trữ trên những đĩa cứng. 627 00:29:25,470 --> 00:29:28,610 Các tín hiệu khác di chuyển đầu đọc / ghi đầu đọc hoặc 628 00:29:28,610 --> 00:29:30,710 ghi dữ liệu trên đĩa cứng. 629 00:29:30,710 --> 00:29:35,450 Máy móc này chính xác như vậy mà một con người tóc thậm chí không thể vượt qua giữa 630 00:29:35,450 --> 00:29:37,280 người đứng đầu và đĩa cứng quay. 631 00:29:37,280 --> 00:29:40,316 Tuy nhiên, tất cả hoạt động ở tốc độ tuyệt vời. 632 00:29:40,316 --> 00:29:40,660 >> [END xem video] 633 00:29:40,660 --> 00:29:42,190 >> DAVID Malan: Phóng to một chút sâu hơn tại những gì 634 00:29:42,190 --> 00:29:44,360 thực sự trên những đĩa cứng. 635 00:29:44,360 --> 00:29:44,720 >> [VIDEO xem lại] 636 00:29:44,720 --> 00:29:47,660 >> -Chúng ta hãy nhìn vào những gì chúng tôi chỉ thấy trong chuyển động chậm. 637 00:29:47,660 --> 00:29:51,710 Khi một xung ngắn gọn về điện gửi đến các đầu đọc / ghi, nếu làm bật 638 00:29:51,710 --> 00:29:54,650 trên một điện nhỏ cho một phần nhỏ của một giây. 639 00:29:54,650 --> 00:29:58,970 Nam châm tạo ra một lĩnh vực, trong đó thay đổi tính phân cực của một nhỏ bé, nhỏ bé 640 00:29:58,970 --> 00:30:02,850 phần của các hạt kim loại áo mỗi bề mặt đĩa. 641 00:30:02,850 --> 00:30:05,940 >> Một loạt mô hình của những nhỏ, khu vực tính lên trên đĩa 642 00:30:05,940 --> 00:30:08,470 đại diện cho một chút thời gian dữ liệu trong các số nhị phân 643 00:30:08,470 --> 00:30:10,530 hệ thống được sử dụng bởi máy tính. 644 00:30:10,530 --> 00:30:13,775 Bây giờ, nếu hiện tại được gửi một cách thông qua việc đọc / ghi đầu, khu vực này 645 00:30:13,775 --> 00:30:15,970 bị phân cực theo một hướng. 646 00:30:15,970 --> 00:30:17,950 Nếu hiện tại được gửi trong hướng ngược lại, 647 00:30:17,950 --> 00:30:19,930 phân cực đảo ngược. 648 00:30:19,930 --> 00:30:22,370 >> Làm thế nào bạn nhận được dữ liệu từ đĩa cứng? 649 00:30:22,370 --> 00:30:24,090 Chỉ cần đảo ngược quá trình này. 650 00:30:24,090 --> 00:30:26,550 Vì vậy, các hạt trên đĩa mà có được hiện tại trong 651 00:30:26,550 --> 00:30:27,960 đọc / ghi đầu di chuyển. 652 00:30:27,960 --> 00:30:30,700 Đặt cùng hàng triệu những đoạn từ hóa, và 653 00:30:30,700 --> 00:30:32,160 bạn đã có một tập tin. 654 00:30:32,160 --> 00:30:36,060 >> Bây giờ, các mảnh của một tập tin duy nhất có thể được rải rác trên một ổ đĩa của tất cả 655 00:30:36,060 --> 00:30:39,970 đĩa cứng, giống như sự lộn xộn các giấy tờ trên bàn làm việc của bạn. 656 00:30:39,970 --> 00:30:43,500 Vì vậy, một tập tin thêm đặc biệt theo dõi nơi tất cả mọi thứ. 657 00:30:43,500 --> 00:30:45,985 Anh không muốn bạn có một cái gì đó như thế? 658 00:30:45,985 --> 00:30:46,470 >> [END xem video] 659 00:30:46,470 --> 00:30:47,820 >> DAVID Malan: OK, có thể là không. 660 00:30:47,820 --> 00:30:52,070 Vì vậy, bao nhiêu người trong các bạn lớn lên với những? 661 00:30:52,070 --> 00:30:53,970 OK, vì vậy nó càng ít tay mỗi năm. 662 00:30:53,970 --> 00:30:56,550 Nhưng tôi rất vui vì bạn ít nhất quen thuộc với họ, bởi vì điều này và của chính chúng ta 663 00:30:56,550 --> 00:31:00,520 giới thiệu cuốn sách, thật đáng buồn, đang chết rất chậm cái chết ở đây quen thuộc. 664 00:31:00,520 --> 00:31:04,010 >> Nhưng đây là những gì tôi, ít nhất, trở lại trong học cao, sử dụng được sử dụng để sao lưu. 665 00:31:04,010 --> 00:31:08,110 Và nó là tuyệt vời, bởi vì bạn có thể lưu trữ 1,4 MB trên 666 00:31:08,110 --> 00:31:08,930 đĩa đặc biệt này. 667 00:31:08,930 --> 00:31:12,260 Và đây là phiên bản mật độ cao, như được chỉ ra bởi HD, trong đó có 668 00:31:12,260 --> 00:31:14,240 có nghĩa là trước khi video HD hiện nay. 669 00:31:14,240 --> 00:31:16,400 >> Mật độ tiêu chuẩn là 800 kilobyte. 670 00:31:16,400 --> 00:31:18,640 Và trước đó, đã có Đĩa 400 kilobyte. 671 00:31:18,640 --> 00:31:23,120 Và trước đó, đã có 5 và 1/4 đĩa inch, mà đã thực sự mềm, 672 00:31:23,120 --> 00:31:25,680 và một chút rộng hơn và cao hơn hơn những điều này ở đây. 673 00:31:25,680 --> 00:31:29,150 Nhưng bạn có thể nhìn thấy cái gọi là khía cạnh mềm của các ổ đĩa. 674 00:31:29,150 --> 00:31:32,630 >> Và chức năng, họ đang thực sự khá giống với ổ đĩa cứng tại 675 00:31:32,630 --> 00:31:33,570 ít nhất là loại này. 676 00:31:33,570 --> 00:31:37,270 Một lần nữa, ổ SSD trong máy tính mới hơn làm việc một chút khác nhau. 677 00:31:37,270 --> 00:31:41,530 Nhưng nếu bạn di chuyển mà tab kim loại nhỏ, bạn thực sự có thể nhìn thấy một cookie nhỏ, 678 00:31:41,530 --> 00:31:42,560 hoặc platter. 679 00:31:42,560 --> 00:31:43,830 >> Nó không phải là kim loại như thế này. 680 00:31:43,830 --> 00:31:46,000 Điều này thực sự là một số rẻ hơn nhựa nguyên liệu. 681 00:31:46,000 --> 00:31:46,750 Và bạn có thể loại lung nó. 682 00:31:46,750 --> 00:31:50,310 Và bạn đã trully chỉ xóa khỏi một số số bit hoặc các hạt từ tính 683 00:31:50,310 --> 00:31:51,220 từ đĩa này. 684 00:31:51,220 --> 00:31:52,710 >> Vì vậy, may mắn thay, không có gì trên đó. 685 00:31:52,710 --> 00:31:55,790 Nếu điều đó là trong cách - và bao gồm mắt và những người hàng xóm của bạn của bạn - 686 00:31:55,790 --> 00:31:58,865 bạn có thể chỉ cần loại kéo này toàn bộ vỏ ra như thế. 687 00:31:58,865 --> 00:32:01,900 Nhưng có một chút mùa xuân, vì vậy hãy nhận thức được rằng với đôi mắt của bạn. 688 00:32:01,900 --> 00:32:03,620 Vì vậy, bây giờ bạn có thực sự là một đĩa mềm. 689 00:32:03,620 --> 00:32:07,090 >> Và những gì đáng chú ý về điều này là trong nhiều như đây là một 690 00:32:07,090 --> 00:32:10,830 đại diện quy mô nhỏ của một lớn hơn ổ cứng, những điều này là siêu, 691 00:32:10,830 --> 00:32:11,590 siêu đơn giản. 692 00:32:11,590 --> 00:32:15,170 Nếu bạn pinch dưới cùng của nó, bây giờ mà rằng điều kim loại là giảm, và vỏ 693 00:32:15,170 --> 00:32:20,990 họ mở cửa, tất cả có là hai mảnh cảm thấy và đĩa mềm được gọi là 694 00:32:20,990 --> 00:32:22,930 với một miếng kim loại ở bên trong. 695 00:32:22,930 --> 00:32:25,990 >> Và có đi một nửa nội dung đĩa của tôi. 696 00:32:25,990 --> 00:32:27,540 Thêm một chiếc nữa một nửa trong số họ. 697 00:32:27,540 --> 00:32:31,375 Nhưng đó là tất cả những gì đã được quay bên trong máy tính của bạn trong trước đây. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> Và một lần nữa, để đưa điều này vào quan điểm, làm thế nào lớn là hầu hết các bạn 700 00:32:38,310 --> 00:32:39,560 ổ đĩa cứng những ngày này? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 GB, một terabyte, có thể trong một máy tính để bàn, 2 terabyte, 3 703 00:32:46,230 --> 00:32:47,630 terabyte, 4 terabyte, phải không? 704 00:32:47,630 --> 00:32:52,480 Đây là một trong megabyte, cho hay phải mất, mà thậm chí không thể phù hợp với một MP3 điển hình 705 00:32:52,480 --> 00:32:55,310 nữa những ngày này, hoặc một số tập tin âm nhạc tương tự. 706 00:32:55,310 --> 00:32:59,500 >> Vì vậy, một chút quà lưu niệm cho bạn ngày hôm nay, và cũng để giúp bối cảnh những gì 707 00:32:59,500 --> 00:33:03,570 chúng tôi sẽ được tham gia cho các cấp bây giờ trong vấn đề thiết lập năm. 708 00:33:03,570 --> 00:33:04,820 Vì vậy, những người đang có của bạn để giữ. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Vì vậy, hãy để tôi chuyển đến nơi sẽ được dành pset tiếp theo là tốt. 711 00:33:13,370 --> 00:33:18,470 Vì vậy, bây giờ chúng tôi đã thiết lập trang này để - oh, một vài thông báo một cách nhanh chóng. 712 00:33:18,470 --> 00:33:21,730 >> Thứ sáu này, nếu bạn muốn tham gia CS50 ăn trưa, đi đến nơi bình thường, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 Và dự án cuối cùng - 715 00:33:25,100 --> 00:33:28,520 để mỗi giáo trình, chúng tôi đã đăng đặc điểm kỹ thuật dự án cuối cùng đã. 716 00:33:28,520 --> 00:33:31,410 Nhận ra rằng đó không có nghĩa là đó là do đặc biệt sớm. 717 00:33:31,410 --> 00:33:33,990 Được đăng, thực sự, chỉ để có được các bạn suy nghĩ về nó. 718 00:33:33,990 --> 00:33:37,620 Và thực sự, một siêu đáng kể tỷ lệ phần trăm của bạn sẽ được giải quyết 719 00:33:37,620 --> 00:33:40,780 dự án cuối cùng về tài liệu mà chúng thậm chí còn không nhận được để trong lớp, 720 00:33:40,780 --> 00:33:42,730 nhưng sẽ là vào đầu tuần tới. 721 00:33:42,730 --> 00:33:45,530 >> Thông báo, mặc dù, rằng các spec kêu gọi một vài thành phần khác nhau của 722 00:33:45,530 --> 00:33:46,190 dự án cuối cùng. 723 00:33:46,190 --> 00:33:49,590 Đầu tiên, trong một vài tuần, là một trước khi đề nghị, một email khá giản dị để 724 00:33:49,590 --> 00:33:52,760 TF của bạn để nói cho anh ta hoặc những gì bạn đang suy nghĩ về dự án của bạn, với 725 00:33:52,760 --> 00:33:53,650 không cam kết. 726 00:33:53,650 --> 00:33:56,710 Đề nghị sẽ được cụ thể của bạn cam kết, nói rằng, ở đây, đây là những gì 727 00:33:56,710 --> 00:33:57,770 Tôi muốn làm cho dự án của tôi. 728 00:33:57,770 --> 00:33:58,250 Bạn nghĩ gì? 729 00:33:58,250 --> 00:33:58,650 Quá lớn? 730 00:33:58,650 --> 00:33:59,145 Quá nhỏ? 731 00:33:59,145 --> 00:34:00,330 Là nó dễ quản lý? 732 00:34:00,330 --> 00:34:02,230 Và bạn thấy spec cho biết thêm chi tiết. 733 00:34:02,230 --> 00:34:05,060 >> Vài tuần sau đó là tình trạng báo cáo, mà là một tương tự 734 00:34:05,060 --> 00:34:08,260 email thường để TF của bạn để nói như thế nào xa phía sau bạn đang ở cuối cùng của bạn 735 00:34:08,260 --> 00:34:12,360 thực hiện của dự án, tiếp theo các CS50 Hackathon mà tất cả mọi người 736 00:34:12,360 --> 00:34:17,520 là mời, đó sẽ là một sự kiện từ 20:00 vào một buổi tối cho đến 07:00 737 00:34:17,520 --> 00:34:19,150 AM sáng hôm sau. 738 00:34:19,150 --> 00:34:22,560 Pizza, như tôi có thể đã được đề cập trong tuần bằng không, wil được phục vụ tại 9:00, 739 00:34:22,560 --> 00:34:24,120 Thực phẩm Trung Quốc lúc 1:00 AM. 740 00:34:24,120 --> 00:34:27,929 Và nếu bạn vẫn còn tỉnh táo vào 5:00, chúng tôi sẽ đưa bạn đến IHOP cho bữa ăn sáng. 741 00:34:27,929 --> 00:34:31,310 >> Vì vậy, các Hackathon là một trong những hơn kinh nghiệm đáng nhớ trong lớp. 742 00:34:31,310 --> 00:34:35,290 Sau đó thực hiện là do, và sau đó Hội chợ gay cấn CS50. 743 00:34:35,290 --> 00:34:38,070 Thêm chi tiết về tất cả các trong những tuần tới. 744 00:34:38,070 --> 00:34:40,739 >> Nhưng chúng ta hãy quay trở lại một cái gì đó trường học cũ - 745 00:34:40,739 --> 00:34:41,920 một lần nữa, một mảng. 746 00:34:41,920 --> 00:34:45,040 Vì vậy, một mảng đã được tốt đẹp, bởi vì nó giải quyết các vấn đề như chúng ta đã thấy chỉ là một 747 00:34:45,040 --> 00:34:49,290 thời điểm trước đây với các cấu trúc sinh viên nhận được một trong số ít kiểm soát nếu chúng ta 748 00:34:49,290 --> 00:34:52,405 muốn có một sinh viên, sinh viên hai, sinh ba, sinh viên chấm chấm chấm, 749 00:34:52,405 --> 00:34:54,400 một số tùy ý của học sinh. 750 00:34:54,400 --> 00:34:58,850 >> Vì vậy, mảng, một vài tuần trước, nhào trong và giải quyết tất cả các vấn đề của chúng ta về không 751 00:34:58,850 --> 00:35:03,340 biết trước bao nhiêu thứ của một số loại mà chúng ta muốn. 752 00:35:03,340 --> 00:35:07,390 Và chúng tôi đã nhìn thấy rằng cấu trúc có thể giúp chúng tôi tổ chức thêm mã của chúng tôi và giữ 753 00:35:07,390 --> 00:35:11,660 biến khái niệm tương tự, như một tên và một ngôi nhà, cùng nhau, để chúng ta 754 00:35:11,660 --> 00:35:15,570 có thể đối xử với họ như một thực thể, trong trong đó có phần nhỏ hơn. 755 00:35:15,570 --> 00:35:17,810 >> Nhưng mảng có một số nhược điểm. 756 00:35:17,810 --> 00:35:19,780 Một số nhược điểm là gì chúng tôi đã gặp phải 757 00:35:19,780 --> 00:35:22,320 với mảng cho đến nay? 758 00:35:22,320 --> 00:35:23,450 Đó là những gì? 759 00:35:23,450 --> 00:35:28,130 Kích thước cố định - vì vậy mặc dù em có thể có thể cấp phát bộ nhớ cho một 760 00:35:28,130 --> 00:35:32,310 mảng, một khi bạn biết có bao nhiêu sinh viên bạn có, bao nhiêu ký tự mà bạn có 761 00:35:32,310 --> 00:35:35,460 từ người sử dụng, một khi bạn đã phân bổ mảng, bạn đã loại sơn 762 00:35:35,460 --> 00:35:36,740 mình vào một góc. 763 00:35:36,740 --> 00:35:40,600 >> Bởi vì bạn không thể chèn các phần tử mới vào giữa một mảng. 764 00:35:40,600 --> 00:35:43,660 Bạn không thể chèn các yếu tố khác ở phần cuối của một mảng. 765 00:35:43,660 --> 00:35:47,750 Thực sự, bạn phải nghỉ mát để tạo ra một toàn bộ mảng mới, như chúng ta đã thảo luận, 766 00:35:47,750 --> 00:35:49,320 sao chép cũ thành mới. 767 00:35:49,320 --> 00:35:52,610 Và một lần nữa, đó là nhức đầu GetString giao dịch với bạn. 768 00:35:52,610 --> 00:35:56,170 >> Nhưng một lần nữa, bạn có thể thậm chí không chèn một cái gì đó vào giữa mảng 769 00:35:56,170 --> 00:35:58,200 nếu tỷ lệ không hoàn toàn đầy. 770 00:35:58,200 --> 00:36:03,010 Ví dụ, nếu mảng này đây kích thước Sáu chỉ có năm điều trong nó, 771 00:36:03,010 --> 00:36:06,080 tốt, bạn có thể chỉ là chiến thuật một cái gì đó vào cuối cùng. 772 00:36:06,080 --> 00:36:08,200 Nhưng nếu bạn muốn chèn một cái gì đó vào giữa 773 00:36:08,200 --> 00:36:11,280 mảng, mặc dù nó có thể có năm trong số sáu thứ trong nó? 774 00:36:11,280 --> 00:36:14,250 >> Vâng, những gì chúng tôi đã làm khi chúng ta đã có tất cả của những người tình nguyện của chúng tôi trên sân khấu trong 775 00:36:14,250 --> 00:36:15,110 tuần qua? 776 00:36:15,110 --> 00:36:18,710 Nếu chúng ta muốn đặt một người nào đó ở đây, hoặc những người này như thế nào để di chuyển này 777 00:36:18,710 --> 00:36:22,540 cách, hoặc những người này như thế nào để di chuyển này cách, và trở nên đắt đỏ. 778 00:36:22,540 --> 00:36:26,950 Việc chuyển dịch của người bên trong của một mảng kết thúc thêm lên và chi phí 779 00:36:26,950 --> 00:36:31,240 chúng tôi thời gian, do đó rất nhiều n bình phương của chúng tôi lần chạy như sắp xếp chèn, cho 780 00:36:31,240 --> 00:36:32,550 Ví dụ, trong trường hợp xấu nhất. 781 00:36:32,550 --> 00:36:36,520 Vì vậy, mảng là rất lớn, nhưng bạn phải biết trước lớn như thế nào bạn muốn họ. 782 00:36:36,520 --> 00:36:38,030 >> Vì vậy, OK, đây là một giải pháp. 783 00:36:38,030 --> 00:36:43,860 Nếu tôi không biết trước bao nhiêu sinh viên tôi có thể có, và tôi biết một lần 784 00:36:43,860 --> 00:36:47,870 Tôi quyết định, tuy nhiên, tôi bị mắc kẹt với nhiều sinh viên, tại sao không tôi chỉ luôn luôn 785 00:36:47,870 --> 00:36:51,740 phân bổ gấp đôi không gian như tôi có thể nghĩ rằng tôi cần? 786 00:36:51,740 --> 00:36:54,450 Là không phải là một giải pháp hợp lý? 787 00:36:54,450 --> 00:36:58,240 >> Thực tế, tôi không nghĩ rằng chúng tôi sẽ cần nhiều hơn 50 khe cắm 788 00:36:58,240 --> 00:37:02,190 trong một mảng cho một lớp học cỡ trung bình, vì vậy hãy chỉ làm tròn. 789 00:37:02,190 --> 00:37:07,040 Tôi sẽ làm cho 100 khe trong mảng của tôi, chỉ cần để chúng tôi chắc chắn có thể nhận được 790 00:37:07,040 --> 00:37:10,330 số lượng sinh viên tôi mong đợi để có trong một số lớp học vừa. 791 00:37:10,330 --> 00:37:14,320 Vì vậy, tại sao không chỉ làm tròn và phân bổ bộ nhớ hơn, thông thường, một mảng 792 00:37:14,320 --> 00:37:16,290 hơn bạn nghĩ rằng bạn thậm chí có thể cần? 793 00:37:16,290 --> 00:37:20,190 Pushback đơn giản này là những gì ý tưởng đó? 794 00:37:20,190 --> 00:37:21,440 >> Bạn chỉ lãng phí bộ nhớ. 795 00:37:21,440 --> 00:37:25,350 Nghĩa là tất cả các chương trình bạn viết sau đó là có thể sử dụng hai lần như nhiều bộ nhớ như 796 00:37:25,350 --> 00:37:26,680 bạn thực sự cần. 797 00:37:26,680 --> 00:37:28,990 Và rằng chỉ cần không cảm thấy giống như một đặc biệt là giải pháp thanh lịch. 798 00:37:28,990 --> 00:37:31,990 Hơn nữa, nó chỉ làm giảm xác suất của một vấn đề. 799 00:37:31,990 --> 00:37:35,300 Nếu bạn xảy ra để có một khóa học phổ biến một học kỳ và bạn có 101 800 00:37:35,300 --> 00:37:39,610 sinh viên, chương trình của bạn vẫn còn về cơ bản phải đối mặt với cùng một vấn đề. 801 00:37:39,610 --> 00:37:44,280 >> Vì vậy, may mắn thay, có một giải pháp để quảng cáo này tất cả các vấn đề của chúng tôi trong các hình thức 802 00:37:44,280 --> 00:37:46,790 cấu trúc dữ liệu mà phức tạp hơn so với những người 803 00:37:46,790 --> 00:37:47,970 chúng ta đã thấy cho đến nay. 804 00:37:47,970 --> 00:37:50,530 Này, tôi khẳng định, là một danh sách liên kết. 805 00:37:50,530 --> 00:37:51,920 Đây là một danh sách các số - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26, và 34 - 807 00:37:54,970 --> 00:38:00,120 đã được liên kết với nhau bằng cách về những gì tôi đã rút ra như mũi tên. 808 00:38:00,120 --> 00:38:03,580 >> Nói cách khác, nếu tôi muốn đại diện cho một mảng, tôi có thể làm 809 00:38:03,580 --> 00:38:04,910 một cái gì đó như thế này. 810 00:38:04,910 --> 00:38:07,310 Và tôi sẽ đặt này trên trên không chỉ trong một thời điểm. 811 00:38:07,310 --> 00:38:09,970 Tôi có thể làm - 812 00:38:09,970 --> 00:38:12,520 xin chào, tất cả các bên phải. 813 00:38:12,520 --> 00:38:14,470 Đứng. 814 00:38:14,470 --> 00:38:17,360 Máy tính mới đây, rõ ràng - 815 00:38:17,360 --> 00:38:18,090 Được rồi. 816 00:38:18,090 --> 00:38:21,730 >> Vì vậy, nếu tôi có những con số trong mảng - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 không nhất thiết phải mở rộng quy mô. 819 00:38:30,530 --> 00:38:33,730 Được rồi, vì vậy đây là mảng của tôi - 820 00:38:33,730 --> 00:38:34,980 oh my god. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Được rồi, vì vậy đây là mảng của tôi. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 Oh my god. 825 00:38:45,050 --> 00:38:48,820 >> [Cười] 826 00:38:48,820 --> 00:38:49,440 >> DAVID Malan: Giả vờ. 827 00:38:49,440 --> 00:38:52,330 Đó là quá nhiều nỗ lực để quay trở lại và khắc phục điều đó, vì vậy - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 Vì vậy, chúng ta có mảng này 9, 17, 22, 26, và 34. 830 00:38:57,650 --> 00:39:00,260 Đối với những người bạn sẽ nhìn thấy sai lầm đáng xấu hổ tôi chỉ cần thực hiện, 831 00:39:00,260 --> 00:39:00,830 có nó được. 832 00:39:00,830 --> 00:39:04,490 >> Vì vậy, tôi cho rằng đây là một giải pháp rất hiệu quả. 833 00:39:04,490 --> 00:39:07,310 Tôi đã được phân bổ như nhiều số nguyên như Tôi cần - một, hai, ba, 834 00:39:07,310 --> 00:39:09,100 bốn, năm, hoặc sáu - 835 00:39:09,100 --> 00:39:11,660 và tôi đã sau đó lưu trữ những con số bên trong của mảng này. 836 00:39:11,660 --> 00:39:15,220 Nhưng giả sử, sau đó, tôi muốn chèn một giá trị như số 8? 837 00:39:15,220 --> 00:39:16,100 Tốt, nơi nào nó đi? 838 00:39:16,100 --> 00:39:18,530 Giả sử tôi muốn chèn một số như 20. 839 00:39:18,530 --> 00:39:19,790 Tốt, nơi nào nó đi? 840 00:39:19,790 --> 00:39:23,160 Ở nơi nào đó ở giữa, hoặc số 35 đã đi 841 00:39:23,160 --> 00:39:24,010 một nơi nào đó ở cuối. 842 00:39:24,010 --> 00:39:25,320 Nhưng tôi là tất cả ra khỏi không gian. 843 00:39:25,320 --> 00:39:29,120 >> Và do đó, đây là một thách thức cơ bản của mảng mà là giải pháp. 844 00:39:29,120 --> 00:39:32,280 Tôi tuyên bố một thời điểm trước đây, GetString giải quyết vấn đề này. 845 00:39:32,280 --> 00:39:37,380 Nếu bạn muốn chèn một số thứ sáu vào mảng này, những gì là ít nhất một 846 00:39:37,380 --> 00:39:40,090 giải pháp bạn có thể rơi trở lại cho chắc chắn, giống như chúng ta làm với GetString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Đó là những gì? 849 00:39:46,030 --> 00:39:48,190 >> Tốt, làm cho nó lớn hơn được nói dễ hơn làm. 850 00:39:48,190 --> 00:39:52,810 Chúng ta không thể nhất thiết phải làm cho mảng lớn hơn, nhưng những gì chúng tôi có thể làm gì? 851 00:39:52,810 --> 00:39:56,570 Thực hiện một mảng mới đó là lớn hơn, kích thước 6, hoặc có kích thước 10, nếu chúng ta muốn 852 00:39:56,570 --> 00:40:00,490 để có được trước mọi thứ, và sau đó sao chép mảng cũ sang mới, và sau đó 853 00:40:00,490 --> 00:40:01,680 giải phóng mảng cũ. 854 00:40:01,680 --> 00:40:05,770 >> Nhưng thời gian hoạt động là những gì tại của quá trình đó? 855 00:40:05,770 --> 00:40:09,870 Đó là O lớn của n, bởi vì việc sao chép là sẽ chi phí bạn một số đơn vị 856 00:40:09,870 --> 00:40:13,480 thời gian, vì vậy không nên lý tưởng nếu chúng ta phải cấp phát một mảng mới, mà là có 857 00:40:13,480 --> 00:40:15,610 tiêu thụ gấp đôi bộ nhớ tạm thời. 858 00:40:15,610 --> 00:40:16,660 Sao chép cũ thành mới - 859 00:40:16,660 --> 00:40:18,800 Ý tôi là, nó chỉ là một nhức đầu, mà được, một lần nữa, lý do tại sao chúng tôi đã viết 860 00:40:18,800 --> 00:40:19,920 GetString cho bạn. 861 00:40:19,920 --> 00:40:21,380 >> Vì vậy, những gì chúng tôi có thể làm gì để thay thế? 862 00:40:21,380 --> 00:40:25,000 Vâng, nếu cấu trúc dữ liệu của chúng tôi thực sự có những khoảng trống trong nó? 863 00:40:25,000 --> 00:40:30,790 Giả sử tôi thư giãn mục tiêu của tôi có khối tiếp giáp của bộ nhớ, nơi 9 864 00:40:30,790 --> 00:40:34,500 là ngay bên cạnh 17, đó là ngay bên cạnh 22, và như vậy. 865 00:40:34,500 --> 00:40:39,570 >> Và cho rằng số 9 có thể được ở đây trong Bộ nhớ RAM, và 17 có thể được ở đây trong bộ nhớ RAM, 866 00:40:39,570 --> 00:40:40,990 và 22 có thể được ở đây trong bộ nhớ RAM. 867 00:40:40,990 --> 00:40:43,610 Nói cách khác, tôi không cần họ thậm chí sao lưu để sao nữa. 868 00:40:43,610 --> 00:40:47,850 Tôi chỉ có bằng cách nào đó luồn kim qua từng con số, hoặc mỗi 869 00:40:47,850 --> 00:40:51,010 các nút này, như chúng tôi sẽ gọi hình chữ nhật như tôi đã rút ra cho họ, để 870 00:40:51,010 --> 00:40:55,670 nhớ làm thế nào để có được đến cuối cùng nút như vậy từ đầu tiên. 871 00:40:55,670 --> 00:40:59,940 >> Vì vậy, những gì là lập trình xây dựng chúng tôi đã nhìn thấy thời gian gần đây mà tôi 872 00:40:59,940 --> 00:41:03,030 có thể thực hiện chủ đề đó, hoặc rút ra ở đây, mà tôi có thể 873 00:41:03,030 --> 00:41:05,430 thực hiện những mũi tên? 874 00:41:05,430 --> 00:41:06,500 Con trỏ như vậy, phải không? 875 00:41:06,500 --> 00:41:09,560 Nếu tôi phân bổ không chỉ là một int, nhưng một nút - và 876 00:41:09,560 --> 00:41:10,810 nút, tôi chỉ có nghĩa là container. 877 00:41:10,810 --> 00:41:12,900 Và trực quan, tôi có nghĩa là một hình chữ nhật. 878 00:41:12,900 --> 00:41:16,420 Vì vậy, một nút rõ ràng cần chứa hai giá trị - 879 00:41:16,420 --> 00:41:21,490 int riêng của mình, và sau đó, như ngụ ý của nửa dưới của hình chữ nhật, 880 00:41:21,490 --> 00:41:23,010 đủ không gian cho một int. 881 00:41:23,010 --> 00:41:26,130 >> Vì vậy chỉ cần suy nghĩ trước đây, lớn như thế nào là nút này, điều này 882 00:41:26,130 --> 00:41:27,170 chứa trong câu hỏi? 883 00:41:27,170 --> 00:41:29,250 Bao nhiêu byte cho int? 884 00:41:29,250 --> 00:41:31,310 Có lẽ là 4, nếu nó giống như bình thường. 885 00:41:31,310 --> 00:41:33,270 Và sau đó bao nhiêu byte cho con trỏ? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Vì vậy, bình chứa, hoặc nút này, là sẽ là một cấu trúc 8-byte. 888 00:41:37,940 --> 00:41:41,760 Oh, và đó là một trùng hợp ngẫu nhiên hạnh phúc chúng tôi chỉ giới thiệu khái niệm này 889 00:41:41,760 --> 00:41:44,400 một cấu trúc, hoặc một cấu trúc C. 890 00:41:44,400 --> 00:41:48,890 >> Vì vậy, tôi cho rằng tôi muốn có một bước hướng này phức tạp hơn 891 00:41:48,890 --> 00:41:52,560 thực hiện một danh sách các số, một danh sách liên kết các con số, tôi cần phải làm một 892 00:41:52,560 --> 00:41:56,920 suy nghĩ nhiều hơn một chút lên phía trước và tuyên bố không chỉ là một int, nhưng một cấu trúc 893 00:41:56,920 --> 00:41:58,620 mà tôi sẽ gọi, thông thường đây, nút. 894 00:41:58,620 --> 00:42:01,630 Chúng ta có thể gọi nó là bất cứ điều gì chúng ta muốn, nhưng nút là có được chuyên đề trong rất nhiều 895 00:42:01,630 --> 00:42:03,560 trong những điều chúng tôi bắt đầu xem xét ngay bây giờ. 896 00:42:03,560 --> 00:42:06,480 >> Bên trong của nút đó là một n int. 897 00:42:06,480 --> 00:42:09,350 Và sau đó cú pháp này, một chút lạ ở cái nhìn đầu tiên - 898 00:42:09,350 --> 00:42:12,960 struct node * tiếp theo. 899 00:42:12,960 --> 00:42:16,900 Cũng những bức tranh, đó là những gì? 900 00:42:16,900 --> 00:42:21,000 Đó là nửa dưới của hình chữ nhật mà chúng ta đã thấy 901 00:42:21,000 --> 00:42:22,730 chỉ là một thời điểm trước đây. 902 00:42:22,730 --> 00:42:27,600 >> Nhưng tại sao tôi nói rằng cấu trúc nút * như trái ngược với chỉ nút *? 903 00:42:27,600 --> 00:42:31,370 Bởi vì nếu con trỏ đang trỏ tại nút khác, nó chỉ là 904 00:42:31,370 --> 00:42:32,760 địa chỉ của một nút. 905 00:42:32,760 --> 00:42:35,630 Đó là phù hợp với những gì chúng tôi đã thảo luận về con trỏ cho đến nay. 906 00:42:35,630 --> 00:42:39,690 Nhưng tại sao, nếu tôi khẳng định cấu trúc này là gọi là nút, tôi có thể nói cấu trúc 907 00:42:39,690 --> 00:42:42,660 nút trong đây? 908 00:42:42,660 --> 00:42:43,190 >> Chính xác. 909 00:42:43,190 --> 00:42:46,490 Đó là sắp xếp của một thực tế ngu ngốc của C. Typedef, có thể nói, có không 910 00:42:46,490 --> 00:42:47,220 xảy ra. 911 00:42:47,220 --> 00:42:48,510 C là siêu đen. 912 00:42:48,510 --> 00:42:51,050 Nó đọc trên mã của bạn để phía dưới, từ trái sang phải. 913 00:42:51,050 --> 00:42:54,930 Và đến khi nó chạm dấu chấm phẩy mà trên dòng dưới cùng, đoán những gì không 914 00:42:54,930 --> 00:42:57,590 tồn tại như một kiểu dữ liệu? 915 00:42:57,590 --> 00:42:59,060 Nút, nút unquote giá. 916 00:42:59,060 --> 00:43:03,050 >> Nhưng vì nhiều tiết tuyên bố tôi đã làm trên dòng đầu tiên - 917 00:43:03,050 --> 00:43:05,340 nút typedef struct - 918 00:43:05,340 --> 00:43:08,790 bởi vì đó đến đầu tiên, trước khi dấu ngoặc nhọn, đó là loại giống như 919 00:43:08,790 --> 00:43:11,800 trước giáo dục kêu vang đó, bạn biết những gì, cho tôi một cấu trúc 920 00:43:11,800 --> 00:43:13,570 gọi là nút cấu trúc. 921 00:43:13,570 --> 00:43:16,270 Thành thật mà nói, tôi không thích những thứ gọi cấu trúc nút, cấu trúc nút tất cả 922 00:43:16,270 --> 00:43:17,090 trong mã của tôi. 923 00:43:17,090 --> 00:43:20,660 Nhưng tôi sẽ chỉ sử dụng nó một lần, chỉ cần bên trong, để tôi có thể có hiệu quả 924 00:43:20,660 --> 00:43:25,010 tạo ra một loại tài liệu tham khảo thông tư, không một con trỏ đến bản thân mình cho mỗi gia nhập, nhưng một 925 00:43:25,010 --> 00:43:29,400 con trỏ đến một của một loại giống hệt nhau. 926 00:43:29,400 --> 00:43:32,330 >> Vì vậy, nó chỉ ra rằng trên một cấu trúc dữ liệu như thế này, có một vài 927 00:43:32,330 --> 00:43:34,470 hoạt động đó có thể là quan tâm đến chúng tôi. 928 00:43:34,470 --> 00:43:37,460 Chúng tôi có thể muốn chèn vào một danh sách như thế này. 929 00:43:37,460 --> 00:43:39,850 Chúng tôi có thể muốn xóa từ một danh sách như thế này. 930 00:43:39,850 --> 00:43:43,490 Chúng tôi có thể muốn tìm kiếm danh sách cho một giá trị, hay rộng hơn, đi qua. 931 00:43:43,490 --> 00:43:46,410 Và đi qua chỉ là một cách ưa thích của nói rằng bắt đầu ở bên trái và di chuyển tất cả 932 00:43:46,410 --> 00:43:47,650 các đường bên phải. 933 00:43:47,650 --> 00:43:52,640 >> Và thông báo, ngay cả với điều này hơn một chút cấu trúc dữ liệu phức tạp, chúng ta hãy 934 00:43:52,640 --> 00:43:56,510 tôi đề nghị rằng chúng ta có thể vay một số những ý tưởng của hai tuần qua và 935 00:43:56,510 --> 00:43:58,410 thực hiện một chức năng được gọi là tìm kiếm như thế này. 936 00:43:58,410 --> 00:44:01,360 Nó sẽ trở lại đúng hay sai, cho thấy, có hoặc 937 00:44:01,360 --> 00:44:03,390 không, n là trong danh sách. 938 00:44:03,390 --> 00:44:05,960 Số thứ hai của nó là một con trỏ vào danh sách riêng của mình, do đó, một 939 00:44:05,960 --> 00:44:07,920 con trỏ đến một nút. 940 00:44:07,920 --> 00:44:10,350 >> Tất cả tôi sẽ để sau đó làm là khai báo một biến tạm thời. 941 00:44:10,350 --> 00:44:12,730 Chúng tôi sẽ gọi nó là ptr theo quy ước, cho con trỏ. 942 00:44:12,730 --> 00:44:15,220 Và tôi chỉ định nó bằng đầu danh sách. 943 00:44:15,220 --> 00:44:16,680 >> Và bây giờ thông báo các vòng lặp while. 944 00:44:16,680 --> 00:44:20,640 Vì vậy, miễn là con trỏ là không bình đẳng thành vô giá trị, tôi sẽ kiểm tra. 945 00:44:20,640 --> 00:44:24,520 Là con trỏ mũi tên n bằng n được thông qua vào? 946 00:44:24,520 --> 00:44:26,410 Và chờ một phút - mới mảnh cú pháp. 947 00:44:26,410 --> 00:44:29,324 Mũi tên là tất cả những gì của một bất ngờ? 948 00:44:29,324 --> 00:44:30,574 Yeah? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Chính xác. 951 00:44:34,810 --> 00:44:38,860 Vì vậy, trong khi một vài phút trước đây, chúng tôi sử dụng các ký hiệu dấu chấm để truy cập vào một cái gì đó 952 00:44:38,860 --> 00:44:43,080 bên trong một cấu trúc, nếu biến bạn đã không phải là cấu trúc 953 00:44:43,080 --> 00:44:47,420 chính nó, nhưng một con trỏ đến một cấu trúc, may mắn thay, một phần của cú pháp 954 00:44:47,420 --> 00:44:48,620 cuối cùng có ý nghĩa trực quan. 955 00:44:48,620 --> 00:44:52,360 Mũi tên có nghĩa là theo con trỏ, như mũi tên của chúng tôi thường có nghĩa là 956 00:44:52,360 --> 00:44:56,570 những bức tranh, và đi tại trường dữ liệu bên trong. 957 00:44:56,570 --> 00:44:59,700 Vì vậy, mũi tên là điều tương tự như dấu chấm, nhưng bạn sử dụng nó khi bạn có một con trỏ. 958 00:44:59,700 --> 00:45:05,270 >> Vì vậy, tóm lại là sau đó, nếu lĩnh vực n bên trong các cấu trúc được gọi là con trỏ 959 00:45:05,270 --> 00:45:07,760 bằng bằng n, trả lại sự thật. 960 00:45:07,760 --> 00:45:11,970 Nếu không, dòng này đây - con trỏ bằng con trỏ tới. 961 00:45:11,970 --> 00:45:17,540 Vì vậy, những gì đang thực hiện, thông báo, là nếu tôi hiện đang chỉ vào các cấu trúc 962 00:45:17,540 --> 00:45:21,430 chứa 9 và 9 không phải là số Tôi đang tìm - cho rằng tôi đang tìm 963 00:45:21,430 --> 00:45:22,830 cho n bằng 50 - 964 00:45:22,830 --> 00:45:25,930 Tôi sẽ cập nhật con trỏ tạm thời của tôi không chỉ vào nút này 965 00:45:25,930 --> 00:45:31,190 nữa, nhưng con trỏ mũi tên bên cạnh, mà là sẽ đưa tôi lên đây. 966 00:45:31,190 --> 00:45:34,270 >> Bây giờ, tôi nhận ra là một cơn lốc giới thiệu. 967 00:45:34,270 --> 00:45:37,380 Thứ tư, chúng tôi thực sự sẽ làm điều này với một số người và với một số chi tiết 968 00:45:37,380 --> 00:45:38,900 mã ở một tốc độ chậm hơn. 969 00:45:38,900 --> 00:45:42,990 Nhưng nhận ra, bây giờ chúng tôi đang làm cho dữ liệu của chúng tôi cấu trúc phức tạp hơn để chúng tôi 970 00:45:42,990 --> 00:45:45,780 các thuật toán có thể nhận được hiệu quả hơn, mà sẽ là điều kiện tiên quyết cho 971 00:45:45,780 --> 00:45:50,500 pset sáu, khi chúng ta nạp vào, một lần nữa, những 150.000 từ, nhưng cần phải làm như vậy 972 00:45:50,500 --> 00:45:55,650 hiệu quả, và lý tưởng, tạo ra một chương trình chạy cho người dùng của chúng tôi không trong 973 00:45:55,650 --> 00:46:00,460 tuyến tính, không trong n bình phương, nhưng trong thời gian liên tục, trong lý tưởng. 974 00:46:00,460 --> 00:46:02,300 >> Chúng ta sẽ thấy bạn vào thứ tư. 975 00:46:02,300 --> 00:46:07,240 >> Loa: Tại CS50 tiếp theo, David quên trường hợp cơ sở của mình. 976 00:46:07,240 --> 00:46:12,770 >> DAVID Malan: Và đó là cách bạn gửi tin nhắn văn bản với C. Cái gì - 977 00:46:12,770 --> 00:46:14,020 >> [CÁC VĂN BẢN THÔNG ĐIỆP THÔNG BÁO SOUNDS] 978 00:46:14,020 --> 00:46:19,734