1 00:00:00,000 --> 00:00:10,970 >> [音樂播放] 2 00:00:10,970 --> 00:00:12,536 >> DAVID J.馬蘭所有權利。 3 00:00:12,536 --> 00:00:13,392 >> [笑] 4 00:00:13,392 --> 00:00:14,240 >> 歡迎回來。 5 00:00:14,240 --> 00:00:14,990 這是CS50。 6 00:00:14,990 --> 00:00:16,890 而本週五結束。 7 00:00:16,890 --> 00:00:20,020 到現在為止,我們已經差不多 被理所當然地認為有 8 00:00:20,020 --> 00:00:23,480 存在這個編譯器,鐺,你 被調用的方式,此 9 00:00:23,480 --> 00:00:27,100 其他工具叫,不知怎的, 神奇地轉換你的源代碼 10 00:00:27,100 --> 00:00:31,350 成目標代碼,零和一 您的電腦CPU,中央 11 00:00:31,350 --> 00:00:33,410 處理單元,真正理解。 12 00:00:33,410 --> 00:00:36,770 但事實證明,這是一個數字 在引擎蓋下 13 00:00:36,770 --> 00:00:38,690 輸入和輸出之間。 14 00:00:38,690 --> 00:00:41,800 >> 我想建議,我們的肉體 說出來的更詳細一點成 15 00:00:41,800 --> 00:00:45,130 這四個步驟,有一些所謂 前處理,這 16 00:00:45,130 --> 00:00:48,300 被稱為編譯,我們已經看到, 一些所謂的組裝, 17 00:00:48,300 --> 00:00:49,420 一種叫做連接。 18 00:00:49,420 --> 00:00:53,270 所以到現在為止,在我們的一些 計劃,我們已經包含尖銳。 19 00:00:53,270 --> 00:00:56,650 最近,我們已經有一些尖銳的 定義常量。 20 00:00:56,650 --> 00:01:00,660 所以,事實證明,那些東西, 哈希符號或前綴 21 00:01:00,660 --> 00:01:04,150 英鎊符號是預處理器 指令。 22 00:01:04,150 --> 00:01:07,960 這只是說這是一個奇特的方式 這實際上一行代碼 23 00:01:07,960 --> 00:01:12,280 轉換成別的東西之前 電腦甚至嘗試轉換 24 00:01:12,280 --> 00:01:13,800 成0和1的程序。 25 00:01:13,800 --> 00:01:19,000 >> 例如,夏普包括標準 I / O,H,非常簡單,只是表示去 26 00:01:19,000 --> 00:01:24,010 未來,搶的文件內容 STDIO.H並粘貼他們的權利有。 27 00:01:24,010 --> 00:01:25,880 因此,沒有零和一 但在這一點上。 28 00:01:25,880 --> 00:01:27,470 這真的只是一個替代。 29 00:01:27,470 --> 00:01:30,790 這樣做了,在所謂的 預處理階段,當你 30 00:01:30,790 --> 00:01:34,230 實際運行鏘或專門 在大多數情況下,製作。 31 00:01:34,230 --> 00:01:36,950 所以這一切已經發生 首先自動迄今。 32 00:01:36,950 --> 00:01:38,800 >> 然後編譯步驟。 33 00:01:38,800 --> 00:01:40,920 但是,我們一直過於簡單化 編譯。 34 00:01:40,920 --> 00:01:45,060 編譯程序的真正含義 把它從像C的東西, 35 00:01:45,060 --> 00:01:48,430 源代碼中,我們一直都在寫,同比下降 一種叫做組裝。 36 00:01:48,430 --> 00:01:52,900 彙編語言是一個較低的水平 語言,令人欣慰的是,我們不會 37 00:01:52,900 --> 00:01:55,480 有很多借勢 寫這個學期。 38 00:01:55,480 --> 00:01:59,100 但它的最低水平 某種意義上說,你從字面上開始寫 39 00:01:59,100 --> 00:02:04,270 加法和減法,乘法和加載 從內存中保存到內存中, 40 00:02:04,270 --> 00:02:08,259 非常基本的指令,一台電腦, 引擎蓋下, 41 00:02:08,259 --> 00:02:09,639 其實理解。 42 00:02:09,639 --> 00:02:14,930 >> 最後,組裝需要語言 零和的,我們已經 43 00:02:14,930 --> 00:02:16,190 迄今為止描述。 44 00:02:16,190 --> 00:02:19,270 最後,真正有所謂 鏈接階段,我們將 45 00:02:19,270 --> 00:02:22,360 看到在短短的時刻,它結合了 您的零和一零 46 00:02:22,360 --> 00:02:24,870 其他的人之前 你已經創建。 47 00:02:24,870 --> 00:02:26,660 >> 所以考慮這個超級簡單的程序。 48 00:02:26,660 --> 00:02:27,560 它是從第1週。 49 00:02:27,560 --> 00:02:29,610 它只是說,你好世界, 在屏幕上。 50 00:02:29,610 --> 00:02:30,920 我們跑通過鏘。 51 00:02:30,920 --> 00:02:33,200 或者我們跑了,它通過使 跑鏘。 52 00:02:33,200 --> 00:02:36,170 和輸出在當時 一些零和一。 53 00:02:36,170 --> 00:02:38,100 但事實證明,有 一個中間步驟。 54 00:02:38,100 --> 00:02:40,460 如果我在這裡 - 哎呀,沒 希望看到他呢。 55 00:02:40,460 --> 00:02:44,800 如果我在這裡,我的設備 我打開hello.c的,在這裡 56 00:02:44,800 --> 00:02:46,160 是相同的程序。 57 00:02:46,160 --> 00:02:48,600 什麼,我要做的事情在我的終端 窗口在這裡我要 58 00:02:48,600 --> 00:02:51,430 運行鐺,而不是品牌, 自動完成所有四個 59 00:02:51,430 --> 00:02:52,870 我們這些步驟。 60 00:02:52,870 --> 00:02:58,620 我打算做鐺-S 然後hello.c的,然後回車。 61 00:02:58,620 --> 00:03:00,590 >> 我得到一個閃爍提示 再次,這是很好的。 62 00:03:00,590 --> 00:03:05,280 現在稍大一點的窗口, 我要打開的gedit這裡。 63 00:03:05,280 --> 00:03:09,610 我要打開的文件, 事實證明,被稱為hello.s 64 00:03:09,610 --> 00:03:11,870 包含該彙編語言 我前面提到的。 65 00:03:11,870 --> 00:03:15,060 這是什麼所謂的裝配 語言,相當低的水平 66 00:03:15,060 --> 00:03:18,470 英特爾CPU的指令, 或不管它是什麼,裡面 67 00:03:18,470 --> 00:03:19,350 理解。 68 00:03:19,350 --> 00:03:24,480 和MOV舉動。呼叫是 調用,非常低的水平的功能。 69 00:03:24,480 --> 00:03:26,380 子的減法。 70 00:03:26,380 --> 00:03:30,370 >> 所以當你有一個特定的CPU裡面 你的電腦,是什麼使得它 71 00:03:30,370 --> 00:03:34,300 層次分明,與其它CPU上 市場,指示 72 00:03:34,300 --> 00:03:39,460 理解,往往它的效率有多高 有多快,它是在執行某些 73 00:03:39,460 --> 00:03:40,380 這些指令。 74 00:03:40,380 --> 00:03:45,150 現在更多,你可以採取 明年秋季在大學CS61。 75 00:03:45,150 --> 00:03:48,170 但在這裡,我們有,例如,幾 標識符可能看起來很熟悉。 76 00:03:48,170 --> 00:03:50,150 hello.c的程序的名稱。 77 00:03:50,150 --> 00:03:51,070 >> 文本 - 。 78 00:03:51,070 --> 00:03:54,190 有沒有更多的興趣 剛才,記得該文本 79 00:03:54,190 --> 00:03:59,190 段,截至週一,是在 內存的程序實際上結束了。 80 00:03:59,190 --> 00:04:01,330 所以,這至少隱約 有熟悉。 81 00:04:01,330 --> 00:04:03,730 在這裡,當然,一提 我們的主要功能。 82 00:04:03,730 --> 00:04:07,220 向下滾動,這是指對事物 所謂的寄存器,非常小塊 83 00:04:07,220 --> 00:04:09,190 您的實際CPU的內存裡面。 84 00:04:09,190 --> 00:04:12,930 如果我什至向下滾動 進一步,我看到某種 85 00:04:12,930 --> 00:04:14,240 間接提及ASCII。 86 00:04:14,240 --> 00:04:17,120 還有,的確是字符串, 你好,逗號,世界。 87 00:04:17,120 --> 00:04:20,079 >> 所以長話短說,這一直是 發生自動為您 88 00:04:20,079 --> 00:04:22,140 在發動機罩下方的這段時間。 89 00:04:22,140 --> 00:04:26,450 什麼已經發生,真的是一次 你運行鐺,或以 90 00:04:26,450 --> 00:04:29,150 讓你得到第一, 從源代碼, 91 00:04:29,150 --> 00:04:30,700 所謂的彙編語言。 92 00:04:30,700 --> 00:04:35,210 然後鏘轉換組件 下降到零和的語言。 93 00:04:35,210 --> 00:04:38,340 這是我們開始的幻燈片 我們討論週0 - 94 00:04:38,340 --> 00:04:39,840 然後1週。 95 00:04:39,840 --> 00:04:44,030 最後,那些零和一 相結合,與零和一 96 00:04:44,030 --> 00:04:47,190 這些庫中,我們一直在服用 標準I / O或理所當然的像 97 00:04:47,190 --> 00:04:50,010 字符串庫,甚至 的CS50庫。 98 00:04:50,010 --> 00:04:54,200 >> 所以畫這幅畫 在視覺上,我們有hello.c的。 99 00:04:54,200 --> 00:04:57,220 而且,當然,使用了printf 功能說,你好世界。 100 00:04:57,220 --> 00:05:01,810 編譯步驟下來 該文件,我們剛才看到hello.s,甚至 101 00:05:01,810 --> 00:05:04,290 雖然這通常將刪除 自動為您。 102 00:05:04,290 --> 00:05:06,050 但是,這是在彙編代碼 在中間步驟。 103 00:05:06,050 --> 00:05:09,750 那麼當我們組裝的組件 語言,可以這麼說,這就是當你 104 00:05:09,750 --> 00:05:10,830 得到這些零和一。 105 00:05:10,830 --> 00:05:13,920 因此,我們今天有效放大 我們一直理所當然, 106 00:05:13,920 --> 00:05:16,430 意味著源代碼 反對代碼。 107 00:05:16,430 --> 00:05:18,850 >> 但最後,現在相同的畫面 - 讓我們推到 108 00:05:18,850 --> 00:05:20,020 左手側。 109 00:05:20,020 --> 00:05:22,880 並注意在上方有 我前面提到stdio.h中。 110 00:05:22,880 --> 00:05:25,030 這是一個文件,我們已經包括了 在幾乎所有的 111 00:05:25,030 --> 00:05:26,250 我們寫的程序。 112 00:05:26,250 --> 00:05:28,830 的文件,其內容 獲得複製粘貼, 113 00:05:28,830 --> 00:05:30,350 有效之上代碼。 114 00:05:30,350 --> 00:05:34,170 但事實證明,在計算機上 系統某處,那裡想必 115 00:05:34,170 --> 00:05:39,150 有人寫道多年stdio.c文件 以前,實現了所有的 116 00:05:39,150 --> 00:05:41,870 被宣布功能 在stdio.h。 117 00:05:41,870 --> 00:05:45,465 >> 現在,在現實中它可能不上 您的Mac或PC或者甚至在 118 00:05:45,465 --> 00:05:47,660 CS50設備是一個原始的C代碼。 119 00:05:47,660 --> 00:05:52,710 有人已經編譯並計入 o文件對象代碼或一個 120 00:05:52,710 --> 00:05:56,020 文件,它指的是一個共享庫 這已預裝和 121 00:05:56,020 --> 00:05:57,240 預編譯的為您服務。 122 00:05:57,240 --> 00:06:01,950 但是,假如確實存在 上我們的電腦stdio.c的並行 123 00:06:01,950 --> 00:06:02,650 鐺。 124 00:06:02,650 --> 00:06:04,960 你的代碼被編譯 和組裝。 125 00:06:04,960 --> 00:06:09,200 stdio.c代碼被編譯和 組裝,以便將該最後 126 00:06:09,200 --> 00:06:13,730 一步,在這裡,我們必須以某種方式 鏈接,可以這麼說,你的零和一 127 00:06:13,730 --> 00:06:18,430 用他或她的零和一成一體 簡單的程序,最終是 128 00:06:18,430 --> 00:06:20,540 調用你好。 129 00:06:20,540 --> 00:06:23,340 >> 所以這是所有魔法 發生迄今。 130 00:06:23,340 --> 00:06:26,430 並會繼續採取這些 過程是理所當然的,但實現 131 00:06:26,430 --> 00:06:28,750 有很多有趣的細節 下方有。 132 00:06:28,750 --> 00:06:31,920 這是什麼使你 電腦與英特爾裡面 133 00:06:31,920 --> 00:06:33,940 特別顯著。 134 00:06:33,940 --> 00:06:37,020 >> 因此,關於這一點,如果你想 我們一起吃午飯這個星期五​​,做 135 00:06:37,020 --> 00:06:41,570 到一般地方cs50.net/rsvp, 週五下午1:15。 136 00:06:41,570 --> 00:06:43,400 而現在的幾個公告。 137 00:06:43,400 --> 00:06:44,670 因此,我們有一些好消息。 138 00:06:44,670 --> 00:06:45,970 我們有一些壞消息。 139 00:06:45,970 --> 00:06:47,260 開始這裡有一些好消息。 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [呻吟] 142 00:06:54,510 --> 00:06:54,710 >> 好的。 143 00:06:54,710 --> 00:06:56,670 嗯,這是技術上的一個假期,所以 它沒有這麼多我們的禮物。 144 00:06:56,670 --> 00:06:58,030 但隨後的壞消息,當然。 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [呻吟] 147 00:07:01,880 --> 00:07:03,530 >> 我花了很多的時間 這些動畫。 148 00:07:03,530 --> 00:07:04,690 >> [笑] 149 00:07:04,690 --> 00:07:07,000 >> 會有一個審查會議 下星期一。 150 00:07:07,000 --> 00:07:08,340 這將是下午5:30。 151 00:07:08,340 --> 00:07:11,210 所有這些細節,我們會提醒你 通過電子郵件在球場上的 152 00:07:11,210 --> 00:07:13,470 網站在短短兩天時間。 153 00:07:13,470 --> 00:07:16,610 將被拍攝下來,並提供 此後不久。 154 00:07:16,610 --> 00:07:19,200 所以,如果你不能讓週一 夜間插槽,不用擔心。 155 00:07:19,200 --> 00:07:22,270 第接下來的一周也將 專注於審查測驗。 156 00:07:22,270 --> 00:07:25,670 如果你的部分是,這是在週一 確實是大學的假期,我們將 157 00:07:25,670 --> 00:07:26,920 仍然滿足部分。 158 00:07:26,920 --> 00:07:28,890 如果你根本無法使該 因為你會一節 159 00:07:28,890 --> 00:07:29,860 離開,這很好。 160 00:07:29,860 --> 00:07:33,710 出席星期日或週二部分或 調賈森的部分,這是 161 00:07:33,710 --> 00:07:35,110 網上提供。 162 00:07:35,110 --> 00:07:37,490 >> 所以,更多的壞消息。 163 00:07:37,490 --> 00:07:41,960 因此,根據教學大綱, 我們有講座將於下週五。 164 00:07:41,960 --> 00:07:43,690 但好消息 - 165 00:07:43,690 --> 00:07:44,860 清楚,我花了太多時間。 166 00:07:44,860 --> 00:07:45,280 >> [笑] 167 00:07:45,280 --> 00:07:47,140 >> 我們將在下週五的講座取消。 168 00:07:47,140 --> 00:07:50,590 所以這將是一個為我們的禮物,所以你 真的可以有一個很好的喘息 169 00:07:50,590 --> 00:07:52,990 這個星期,兩個星期,因此之間。 170 00:07:52,990 --> 00:07:57,460 因此,沒有講座下週,只是一個很小的 小測驗,你應該 171 00:07:57,460 --> 00:07:59,030 越來越興奮。 172 00:07:59,030 --> 00:08:03,870 >> 現在讓我們把注意力轉向 東西確實是更多的視覺 173 00:08:03,870 --> 00:08:06,990 更加精彩和設置階段 這是怎麼回事,在地平線上 174 00:08:06,990 --> 00:08:08,420 在短短的幾個星期的時間。 175 00:08:08,420 --> 00:08:12,160 第一次測驗後,我們將把 關注我們的問題集 176 00:08:12,160 --> 00:08:16,710 特定領域的問題,即 取證或安全性比較一般。 177 00:08:16,710 --> 00:08:19,550 >> 事實上,這個問題的傳統 集對我來說是一個 178 00:08:19,550 --> 00:08:24,850 教學資深會員或CAS走過 校園採取一些照片 179 00:08:24,850 --> 00:08:29,450 可識別的,但無明顯的人, 地方或事物,那麼每年我 180 00:08:29,450 --> 00:08:34,520 設法不小心刪除 或破壞數字媒體卡 181 00:08:34,520 --> 00:08:35,720 這是我們的相機內。 182 00:08:35,720 --> 00:08:36,860 但沒什麼大不了的。 183 00:08:36,860 --> 00:08:39,200 我可以繼續前進,堵塞 進入我的電腦。 184 00:08:39,200 --> 00:08:43,010 我可以做一個法醫形象,所以 說話,複製零 185 00:08:43,010 --> 00:08:46,830 該內存卡的,不論是 其SD卡或緊湊型閃存卡或 186 00:08:46,830 --> 00:08:48,100 無論你是熟悉的。 187 00:08:48,100 --> 00:08:49,300 然後我們就可以到手了。 188 00:08:49,300 --> 00:08:53,190 >> 因此,挑戰未來,除其他 你的東西,是寫 189 00:08:53,190 --> 00:08:58,630 恢復了一大堆的C代碼, 我的JPEG文件,並透露將 190 00:08:58,630 --> 00:09:00,190 那些人,地方或事物。 191 00:09:00,190 --> 00:09:03,340 而且我們還說話,在這個問題上 設置,並在未來的日子裡,約 192 00:09:03,340 --> 00:09:04,440 更普遍的圖形。 193 00:09:04,440 --> 00:09:06,140 我們已經使用,當然, 打破了。 194 00:09:06,140 --> 00:09:09,080 不過,你那種理所當然的 存在這些高層概念 195 00:09:09,080 --> 00:09:10,680 矩形和橢圓形。 196 00:09:10,680 --> 00:09:12,450 但引擎蓋下 有像素。 197 00:09:12,450 --> 00:09:14,370 你不得不開始 想著這些。 198 00:09:14,370 --> 00:09:18,800 或者你將P-集合4不得不思考 磚之間的差距,如何 199 00:09:18,800 --> 00:09:21,990 很快,你的球跨越 在屏幕打出來。 200 00:09:21,990 --> 00:09:24,830 所以有這樣的概念 在屏幕上,這點 201 00:09:24,830 --> 00:09:26,290 已經開始發揮作用。 202 00:09:26,290 --> 00:09:29,430 >> 現在你所看到的,不過,是什麼 你在電腦屏幕上。 203 00:09:29,430 --> 00:09:33,680 如果你曾經看過一些好的或 壞電視,賠率是他們幾乎 204 00:09:33,680 --> 00:09:36,280 對待觀眾喜歡科技進步 誰真的不 205 00:09:36,280 --> 00:09:37,630 知道很多關於計算。 206 00:09:37,630 --> 00:09:40,840 因此,它很容易為警察 偵探說,你能不能 207 00:09:40,840 --> 00:09:41,710 清理一下我嗎? 208 00:09:41,710 --> 00:09:42,710 或加強,對不對? 209 00:09:42,710 --> 00:09:45,550 Enhance是一樣的時髦詞語 任何犯罪行為最相關的節目。 210 00:09:45,550 --> 00:09:49,240 而現實的情況是,如果你把一個非常 犯罪嫌疑人在做的模糊照片 211 00:09:49,240 --> 00:09:51,620 壞的東西,你不能 只是增強。 212 00:09:51,620 --> 00:09:53,080 你不能無限放大。 213 00:09:53,080 --> 00:09:56,350 你不能看到有人在閃爍 誰犯的眼 214 00:09:56,350 --> 00:09:59,860 特別是犯罪,儘管 患病率在電視上。 215 00:09:59,860 --> 00:10:04,110 >> 因此,讓的激勵 一窺即將到來的設置問題 216 00:10:04,110 --> 00:10:05,765 一些演出與您 可能是熟悉的。 217 00:10:05,765 --> 00:10:06,500 >> [視頻回放] 218 00:10:06,500 --> 00:10:07,835 >> - 確定。 219 00:10:07,835 --> 00:10:09,956 現在,讓我們好好看看你。 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> 保持它。 222 00:10:17,766 --> 00:10:18,658 執行回來。 223 00:10:18,658 --> 00:10:19,550 >> 等待一分鐘。 224 00:10:19,550 --> 00:10:21,580 向右走。 225 00:10:21,580 --> 00:10:21,800 >> 有。 226 00:10:21,800 --> 00:10:22,690 凍結。 227 00:10:22,690 --> 00:10:23,692 >> 全屏。 228 00:10:23,692 --> 00:10:23,846 >> - 確定。 229 00:10:23,846 --> 00:10:24,154 凍結。 230 00:10:24,154 --> 00:10:25,140 >> 收緊,好嗎? 231 00:10:25,140 --> 00:10:27,090 >> 在那傢伙的矢量 由後輪。 232 00:10:27,090 --> 00:10:29,730 >> 放大在這裡,在這一點上。 233 00:10:29,730 --> 00:10:33,700 >> 有了合適的設備,成像 可擴大和激化。 234 00:10:33,700 --> 00:10:34,490 >> - 那是什麼? 235 00:10:34,490 --> 00:10:35,870 >> 這是一個提升計劃。 236 00:10:35,870 --> 00:10:36,793 >> 你能清除的任何? 237 00:10:36,793 --> 00:10:38,560 >> 我不知道。 238 00:10:38,560 --> 00:10:39,090 讓的增強。 239 00:10:39,090 --> 00:10:41,690 >> 增強第A-6。 240 00:10:41,690 --> 00:10:43,510 >> 我增強了細節和 - 241 00:10:43,510 --> 00:10:44,456 >> 我認為有足夠的提升。 242 00:10:44,456 --> 00:10:45,402 它釋放到我的屏幕。 243 00:10:45,402 --> 00:10:47,300 >> 增強反映在她的眼睛。 244 00:10:47,300 --> 00:10:49,330 >> 讓我們運行這個通過 視頻增強。 245 00:10:49,330 --> 00:10:50,340 >> 埃德加,你可以加強這方面呢? 246 00:10:50,340 --> 00:10:52,320 >> 杭。 247 00:10:52,320 --> 00:10:54,290 >> - 我一直在這種反射。 248 00:10:54,290 --> 00:10:55,560 >> 有人的反思。 249 00:10:55,560 --> 00:10:56,440 >> 反思。 250 00:10:56,440 --> 00:10:57,940 >> - 有一個反射 男人的臉。 251 00:10:57,940 --> 00:10:58,860 >> - 反思。 252 00:10:58,860 --> 00:10:59,710 >> 有一種體現。 253 00:10:59,710 --> 00:11:00,900 >> 放大上鏡。 254 00:11:00,900 --> 00:11:03,500 >> 你可以看到的一種體現。 255 00:11:03,500 --> 00:11:04,700 >> 你能提升形象,從這裡開始? 256 00:11:04,700 --> 00:11:05,700 >> 你能提高他在這裡? 257 00:11:05,700 --> 00:11:06,500 >> 你能提高呢? 258 00:11:06,500 --> 00:11:07,380 >> 你能提高呢? 259 00:11:07,380 --> 00:11:08,190 >> 我們可以加強這方面呢? 260 00:11:08,190 --> 00:11:08,940 >> 你能提高呢? 261 00:11:08,940 --> 00:11:10,280 >> 保持一秒鐘,我會提高。 262 00:11:10,280 --> 00:11:11,570 >> - 放大在門上。 263 00:11:11,570 --> 00:11:12,180 >> - X10。 264 00:11:12,180 --> 00:11:13,052 >> 變焦。 265 00:11:13,052 --> 00:11:13,197 >> [笑] 266 00:11:13,197 --> 00:11:14,360 >> 移動英寸 267 00:11:14,360 --> 00:11:15,100 >> 等待,停止。 268 00:11:15,100 --> 00:11:15,740 >> - 停止。 269 00:11:15,740 --> 00:11:16,290 >> 暫停。 270 00:11:16,290 --> 00:11:19,390 >> 旋轉75度左右 的立式請。 271 00:11:19,390 --> 00:11:19,886 >> [笑] 272 00:11:19,886 --> 00:11:24,350 >> 停止,和背部的部分 門再次。 273 00:11:24,350 --> 00:11:26,330 >> 得到的圖像增強 ,位圖? 274 00:11:26,330 --> 00:11:28,990 >> 也許我們可以使用普拉迪普森 進入windows的方法。 275 00:11:28,990 --> 00:11:30,680 >> 這個軟件是最先進的。 276 00:11:30,680 --> 00:11:31,676 >> 的圖標值是關閉的。 277 00:11:31,676 --> 00:11:34,166 >> 有了正確的組合 的算法。 278 00:11:34,166 --> 00:11:38,399 >> 他採取光照算法 一個新的水平,我可以用它們來 279 00:11:38,399 --> 00:11:38,648 增強這張照片。 280 00:11:38,648 --> 00:11:42,050 >> 鎖和放大的z​​軸。 281 00:11:42,050 --> 00:11:42,760 >> - 增強。 282 00:11:42,760 --> 00:11:43,060 >> - 增強。 283 00:11:43,060 --> 00:11:43,760 >> - 增強。 284 00:11:43,760 --> 00:11:45,010 >> 凍結和提高。 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [END視頻播放] 287 00:11:47,910 --> 00:11:51,470 >> DAVID J.馬蘭:所以習題集 5是有什麼樣的未來。 288 00:11:51,470 --> 00:11:55,260 所以,我們很快就會得到一個更好的理解 的時候,為什麼你可以 289 00:11:55,260 --> 00:11:57,300 我們不能以這種方式提高。 290 00:11:57,300 --> 00:12:00,090 但首先,讓我們回到我們的注意力 一些積木,我們會 291 00:12:00,090 --> 00:12:02,250 需要能夠講這個故事。 292 00:12:02,250 --> 00:12:05,580 >> 所以記得我們畫了這幅畫上 週一有點上週。 293 00:12:05,580 --> 00:12:09,970 描述事物的佈局 在您的計算機的內存中時, 294 00:12:09,970 --> 00:12:11,000 運行某些程序。 295 00:12:11,000 --> 00:12:14,310 高科技板塊向上頂,召回,是指 實際的零和一 296 00:12:14,310 --> 00:12:16,000 構成你的程序。 297 00:12:16,000 --> 00:12:19,340 有,下面,一些初始化或 未初始化的數據,這通常 298 00:12:19,340 --> 00:12:22,910 指的東西像常量或 字符串或全局變量 299 00:12:22,910 --> 00:12:24,200 事先聲明。 300 00:12:24,200 --> 00:12:26,500 還有的堆,但我們還會回來 回到那個在一個位。 301 00:12:26,500 --> 00:12:27,410 >> 再有就是在堆棧中。 302 00:12:27,410 --> 00:12:30,660 很像一個托盤堆疊在 食堂,這就是內存得到 303 00:12:30,660 --> 00:12:33,610 分層和分層時, 你做什麼程序? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 堆棧的使用是什麼? 306 00:12:37,730 --> 00:12:39,320 >> 是嗎? 307 00:12:39,320 --> 00:12:40,000 >> 調用的函數。 308 00:12:40,000 --> 00:12:42,890 任何時候當你調用一個函數,它 其內存條子給 309 00:12:42,890 --> 00:12:45,020 局部變量或參數。 310 00:12:45,020 --> 00:12:48,810 形象,我們看到,每個 連續的函數調用,當A 311 00:12:48,810 --> 00:12:52,520 調用B調用C調用D, 分層壓入堆棧。 312 00:12:52,520 --> 00:12:55,630 和在每個這些片 存儲器本質上是一個獨特的範圍 313 00:12:55,630 --> 00:12:58,590 該功能,當然 是有問題的,如果你想把手上 314 00:12:58,590 --> 00:13:01,850 從一個函數另一塊 你想讓它的數據 315 00:13:01,850 --> 00:13:03,500 到突變或更改。 316 00:13:03,500 --> 00:13:08,060 >> 那麼,是什麼使我們的解決方案 函數代表一個堆棧 317 00:13:08,060 --> 00:13:11,390 幀改變內存裡面 另一個堆棧幀呢? 318 00:13:11,390 --> 00:13:14,590 怎麼做這兩彼此交談? 319 00:13:14,590 --> 00:13:18,510 因此,通過指針或地址, 再次,只是描述的 320 00:13:18,510 --> 00:13:22,280 存儲器,通過一個特定的 咬入號碼“,特別是 321 00:13:22,280 --> 00:13:23,830 價值,可以發現。 322 00:13:23,830 --> 00:13:26,860 所以,記得最後一次,我們也繼續 的故事,看了一眼 323 00:13:26,860 --> 00:13:28,280 相當錯誤的程序。 324 00:13:28,280 --> 00:13:32,900 這項計劃是幾車 的原因,但最令人擔憂的是 325 00:13:32,900 --> 00:13:34,620 因為它無法檢查什麼? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> 是啊,這不檢查輸入。 328 00:13:40,450 --> 00:13:41,870 對不起? 329 00:13:41,870 --> 00:13:43,880 >> 如果超過12個字符。 330 00:13:43,880 --> 00:13:47,260 所以非常巧妙,當調用存儲器複製, 其中,顧名思義,就是 331 00:13:47,260 --> 00:13:50,630 將存儲器從它的第二個參數 進入它的第一個參數。 332 00:13:50,630 --> 00:13:54,730 第三個參數,非常巧妙, 檢查以確保你不 333 00:13:54,730 --> 00:13:59,400 複製多個,在這種情況下,長度 酒吧的字符數, 334 00:13:59,400 --> 00:14:03,810 到目標,這也是本 陣列C.但問題是什麼 335 00:14:03,810 --> 00:14:07,230 如果C本身不夠大 處理這個問題? 336 00:14:07,230 --> 00:14:09,900 你要複製的數量 你已經字節。 337 00:14:09,900 --> 00:14:13,040 可是你實際上有更多的 字節比你有房嗎? 338 00:14:13,040 --> 00:14:16,770 >> 那麼,這個程序非常愚蠢只是 盲目繼續採取一切它 339 00:14:16,770 --> 00:14:20,650 ,你好反斜線0 偉大的,如果字符串是短 340 00:14:20,650 --> 00:14:22,040 夠了,像5個字符。 341 00:14:22,040 --> 00:14:26,470 但是,如果它實際上是12個字符 1,200個字符,我們看到了最後一次 342 00:14:26,470 --> 00:14:29,380 ,你只是要完全 覆蓋內存, 343 00:14:29,380 --> 00:14:30,470 不屬於你。 344 00:14:30,470 --> 00:14:34,390 而最壞的情況下,如果覆蓋 紅色的部分,我們叫做 345 00:14:34,390 --> 00:14:35,380 返回地址 - 346 00:14:35,380 --> 00:14:38,370 這僅僅是其中計算機 自動為你,後面的 347 00:14:38,370 --> 00:14:43,130 場景,塔克斯走了32位值, 它提醒了什麼地址,它應該 348 00:14:43,130 --> 00:14:47,080 返回時富,其他功能, 完成執行。 349 00:14:47,080 --> 00:14:49,320 這是一個各種各樣的麵包屑 它返回。 350 00:14:49,320 --> 00:14:52,490 如果覆蓋潛在的, 如果你是壞人,可以 351 00:14:52,490 --> 00:14:54,750 潛在的接管 別人的電腦。 352 00:14:54,750 --> 00:14:58,020 你肯定 在大多數情況下崩潰。 353 00:14:58,020 --> 00:15:01,690 >> 現在,這個問題只會加劇 當我們開始談論內存 354 00:15:01,690 --> 00:15:03,010 更普遍的管理。 355 00:15:03,010 --> 00:15:07,150 和malloc內存分配,是一種 我們可以用它來分配的功能, 356 00:15:07,150 --> 00:15:11,260 內存時,我們事先不知道 我們可能需要一些。 357 00:15:11,260 --> 00:15:13,960 因此,舉例來說,如果我回去 這裡器具。 358 00:15:13,960 --> 00:15:21,010 而且我打開從最後一次hello2.c, 記得這個節目在這裡,看著 359 00:15:21,010 --> 00:15:23,500 像這樣一個小東西, 短短三行 - 360 00:15:23,500 --> 00:15:27,940 說出你的名字,然後字符串名稱, 在左邊,等於的GetString。 361 00:15:27,940 --> 00:15:29,690 然後,我們把它打印出來, 該用戶的名稱。 362 00:15:29,690 --> 00:15:31,170 >> 因此,這是一個超級簡單的程序。 363 00:15:31,170 --> 00:15:34,870 要清楚,讓我繼續前進 ,並招呼-2。 364 00:15:34,870 --> 00:15:36,680 我打算做點斜線HELLO-2。 365 00:15:36,680 --> 00:15:37,750 說出你的名字 - 366 00:15:37,750 --> 00:15:38,140 大衛。 367 00:15:38,140 --> 00:15:38,840 回車鍵。 368 00:15:38,840 --> 00:15:39,540 你好,戴維。 369 00:15:39,540 --> 00:15:41,060 它似乎確定工作。 370 00:15:41,060 --> 00:15:43,140 但是,什麼是真的 這裡引擎蓋下方? 371 00:15:43,140 --> 00:15:44,670 首先,讓我們剝開一些層。 372 00:15:44,670 --> 00:15:48,380 字符串只是一個代名詞,我們已經 實現了什麼? 373 00:15:48,380 --> 00:15:49,110 字符明星。 374 00:15:49,110 --> 00:15:52,740 因此,讓我們讓它多了幾分神秘的 但更多的技術上是正確的,這 375 00:15:52,740 --> 00:15:55,570 是一個char星級,這意味著 名字,沒錯,就是一個變量。 376 00:15:55,570 --> 00:15:59,920 但什麼名字店的地址是 一個字符,這感覺有點怪 377 00:15:59,920 --> 00:16:01,050 因為我得到一個字符串。 378 00:16:01,050 --> 00:16:03,580 我得到多個 字符不是一個字符。 379 00:16:03,580 --> 00:16:07,400 >> 不過,當然,你只需要第一 字符的地址記住 380 00:16:07,400 --> 00:16:08,870 整個字符串是因為什麼原因呢? 381 00:16:08,870 --> 00:16:12,700 你怎麼找出其中的結束 字符串是知道的開始? 382 00:16:12,700 --> 00:16:13,630 的反斜線零。 383 00:16:13,630 --> 00:16:17,260 因此,這兩條線索,你弄清楚 開始前和結束 384 00:16:17,260 --> 00:16:20,280 任何字符串,只要他們 正確形成與空 385 00:16:20,280 --> 00:16:22,110 終結者,,反斜線零。 386 00:16:22,110 --> 00:16:24,520 >> 但是,這是調用的getString。 387 00:16:24,520 --> 00:16:28,020 事實證明的getString 這一切的時候已經種 388 00:16:28,020 --> 00:16:28,820 欺騙我們。 389 00:16:28,820 --> 00:16:32,460 它一直在做這種勞動,可以肯定, 得到了來自用戶的字符串。 390 00:16:32,460 --> 00:16:34,580 但該內存 被來自哪裡? 391 00:16:34,580 --> 00:16:38,440 如果我們回到這裡的圖片 從僅僅是一種應用的定義 392 00:16:38,440 --> 00:16:42,610 剛才,堆棧 內存去當函數被調用時, 393 00:16:42,610 --> 00:16:45,370 通過這種邏輯,當你需要調用getString 然後我輸入 394 00:16:45,370 --> 00:16:50,900 D-A-V-I-D輸入,是D-A-V-I-D 反斜杠零存儲的基礎上, 395 00:16:50,900 --> 00:16:53,480 我們的故事告訴我們多遠? 396 00:16:53,480 --> 00:16:55,190 >> 這似乎是在 堆棧,對不對? 397 00:16:55,190 --> 00:16:58,120 當你調用得到的字符串,你會得到一個 小片內存堆棧。 398 00:16:58,120 --> 00:17:01,630 所以,按理說為D-A-V-I-D 反斜杠零被存儲 399 00:17:01,630 --> 00:17:02,770 在堆棧中。 400 00:17:02,770 --> 00:17:07,680 但是且慢,形式返回 這個字符串,可以這麼說,這意味著 401 00:17:07,680 --> 00:17:11,700 它的托盤從食堂 堆棧。 402 00:17:11,700 --> 00:17:14,560 和我們說最後一次,只要一 函數返回時,和你拿 403 00:17:14,560 --> 00:17:20,109 托盤,可以這麼說,從堆棧什麼 你可以假設一下殘存的 404 00:17:20,109 --> 00:17:21,819 該內存? 405 00:17:21,819 --> 00:17:25,160 我有點重劃為問號 因為他們有效地成為 406 00:17:25,160 --> 00:17:26,250 未知的值。 407 00:17:26,250 --> 00:17:29,500 它們可以被重用,當一些 下一個函數被調用。 408 00:17:29,500 --> 00:17:31,870 >> 換句話說,如果我們碰巧 存儲 - 409 00:17:31,870 --> 00:17:34,350 我會畫一個快速的圖片 這裡的堆棧。 410 00:17:34,350 --> 00:17:38,690 如果我們碰巧繪製底部 我的內存段,我們會說 411 00:17:38,690 --> 00:17:42,230 這是內存的地方 由主要可能ARG c和佔用 412 00:17:42,230 --> 00:17:46,790 ARG v和別的程序, 被稱為的GetString時, 413 00:17:46,790 --> 00:17:51,120 想必得到的getString 這裡的內存塊。 414 00:17:51,120 --> 00:17:53,940 D-A-V-I-D不知何故 在這個函數中結束了。 415 00:17:53,940 --> 00:17:55,320 我要簡單化。 416 00:17:55,320 --> 00:18:00,050 但是,讓我們假設,其D-A-V-I-D 反斜杠零。 417 00:18:00,050 --> 00:18:03,500 因此,這多少字節用於 GetString的框架。 418 00:18:03,500 --> 00:18:08,270 >> 但只要我們的形式返回, 說最後一次,這個內存超過 419 00:18:08,270 --> 00:18:11,340 在這裡,一切都變得 - 喲嗬! - 420 00:18:11,340 --> 00:18:14,270 一切都變得有效擦除。 421 00:18:14,270 --> 00:18:17,220 我們可以認為現在問題 標記,因為誰知道 422 00:18:17,220 --> 00:18:18,720 這是怎麼回事,成為該內存。 423 00:18:18,720 --> 00:18:22,130 事實上,我經常調用函數 以外的getString。 424 00:18:22,130 --> 00:18:24,750 而只要我調用其他一些 功能比的getString,也許不是在 425 00:18:24,750 --> 00:18:28,860 我們剛剛看到這個特定程序 但一些其他的,當然其他一些 426 00:18:28,860 --> 00:18:34,180 功能可能最終被定 這個堆棧中的下一個景點。 427 00:18:34,180 --> 00:18:39,410 >> 所以它不能說的GetString商店 D-A-V-I-D,因為我會在棧上 428 00:18:39,410 --> 00:18:41,040 立即失去對它的訪問。 429 00:18:41,040 --> 00:18:43,720 但我們知道他們的GetString 只返回什麼? 430 00:18:43,720 --> 00:18:47,220 它不回國 我六個字符。 431 00:18:47,220 --> 00:18:51,090 什麼是真正回到根本 我們結束最後一次嗎? 432 00:18:51,090 --> 00:18:52,480 地址的第一人。 433 00:18:52,480 --> 00:18:56,650 不知何故,當你打電話的GetString, 它分配的內存塊 434 00:18:56,650 --> 00:18:59,620 字符串的用戶類型和 然後它返回地址。 435 00:18:59,620 --> 00:19:02,930 事實證明,當你想 在這個函數來分配內存 436 00:19:02,930 --> 00:19:08,390 人誰打電話的方式和回報 該函數的地址 437 00:19:08,390 --> 00:19:11,870 該內存塊,你絕對 不能把它在堆棧上 438 00:19:11,870 --> 00:19:14,750 底部,因為在功能上它只是 會不會成為你很 439 00:19:14,750 --> 00:19:17,800 很快,所以你大概可以猜測 我們可能會折騰 440 00:19:17,800 --> 00:19:20,130 相反,所謂的堆。 441 00:19:20,130 --> 00:19:25,290 >> 因此,你的記憶的底部之間 佈局和你的內存的頂部 442 00:19:25,290 --> 00:19:26,820 佈局段一大堆。 443 00:19:26,820 --> 00:19:29,270 一個是堆棧,和右 它上面的堆。 444 00:19:29,270 --> 00:19:33,680 和堆僅僅是一個不同的塊 功能不用於內存 445 00:19:33,680 --> 00:19:34,770 當他們調用。 446 00:19:34,770 --> 00:19:38,100 它用於較長期的內存,當 你想一個函數來獲取一些 447 00:19:38,100 --> 00:19:42,700 內存,能夠掛到 而失去控制權。 448 00:19:42,700 --> 00:19:45,550 >> 現在,你也許可以立即 看看,這是不是 449 00:19:45,550 --> 00:19:48,060 不一定是完美的設計。 450 00:19:48,060 --> 00:19:51,350 當你的程序分配的內存 棧,或如你所說 451 00:19:51,350 --> 00:19:55,540 更多的功能,或作為您分配 用malloc銷為堆內存 452 00:19:55,540 --> 00:20:00,690 GetString的是做什麼,清楚 似乎是不可避免的問題? 453 00:20:00,690 --> 00:20:00,860 >> 右。 454 00:20:00,860 --> 00:20:03,150 喜歡的事實,這些箭頭 指向對方 455 00:20:03,150 --> 00:20:04,380 並不是一個好兆頭。 456 00:20:04,380 --> 00:20:08,630 事實上,我們可以非常迅速地崩潰 任何數目的方式中的程序。 457 00:20:08,630 --> 00:20:12,050 事實上,我認為我們可能有 這樣做一次意外。 458 00:20:12,050 --> 00:20:14,020 如果沒有,讓我們做吧 現在故意。 459 00:20:14,020 --> 00:20:21,330 讓我繼續前進,超快速 了一項名為dontdothis.c。 460 00:20:21,330 --> 00:20:26,730 我現在就在這裡和 不鋒利包括stdio.h中。 461 00:20:26,730 --> 00:20:32,620 聲明函數foo需要 沒有參數,這是 462 00:20:32,620 --> 00:20:34,040 好記為無效。 463 00:20:34,040 --> 00:20:37,830 >> foo的是要幹什麼,唯一 調用foo,這可能是不 464 00:20:37,830 --> 00:20:39,100 最聰明的想法,但就這樣吧。 465 00:20:39,100 --> 00:20:40,490 耳鼻喉科主無效。 466 00:20:40,490 --> 00:20:45,270 現在唯一的事情主要是去 要做的就是調用foo。 467 00:20:45,270 --> 00:20:51,050 只是踢,我要去 提前這裡說的printf“你好從 468 00:20:51,050 --> 00:20:52,340 富。“ 469 00:20:52,340 --> 00:20:52,890 >> 確定。 470 00:20:52,890 --> 00:21:00,160 所以,如果我沒有犯任何錯誤, 請點斜線dontdothis。 471 00:21:00,160 --> 00:21:01,960 讓我們做一個更大的窗口 - 472 00:21:01,960 --> 00:21:03,210 點斜線,dontdothis。 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 來吧。 475 00:21:08,840 --> 00:21:10,940 476 00:21:10,940 --> 00:21:11,890 嗯哦。 477 00:21:11,890 --> 00:21:13,100 顯然,你可以做到這一點。 478 00:21:13,100 --> 00:21:15,190 該死的。 479 00:21:15,190 --> 00:21:16,190 確定。 480 00:21:16,190 --> 00:21:16,580 等待。 481 00:21:16,580 --> 00:21:17,370 待機。 482 00:21:17,370 --> 00:21:18,270 難道我們 - 483 00:21:18,270 --> 00:21:20,110 我們沒有使用它製作。 484 00:21:20,110 --> 00:21:22,050 >> [嘆息] 485 00:21:22,050 --> 00:21:25,110 >> 我知道,但我想我們 剛刪除。 486 00:21:25,110 --> 00:21:28,410 嗯,是啊。 487 00:21:28,410 --> 00:21:30,660 該死的。 488 00:21:30,660 --> 00:21:32,640 解決這個羅布。 489 00:21:32,640 --> 00:21:34,678 什麼? 490 00:21:34,678 --> 00:21:35,928 這是非常簡單的。 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 是啊,我們轉向優化。 493 00:21:47,360 --> 00:21:48,970 OK,站在再見。 494 00:21:48,970 --> 00:21:49,950 現在我感覺好多了。 495 00:21:49,950 --> 00:21:51,390 確定。 496 00:21:51,390 --> 00:21:51,780 好的。 497 00:21:51,780 --> 00:21:53,430 >> 因此,讓我們的編譯 - 498 00:21:53,430 --> 00:21:55,880 讓你dontdothis。 499 00:21:55,880 --> 00:22:00,090 您可能需要重命名為 只是一瞬間dothis.c。 500 00:22:00,090 --> 00:22:00,710 我們去那裡。 501 00:22:00,710 --> 00:22:01,240 謝謝。 502 00:22:01,240 --> 00:22:02,050 確定。 503 00:22:02,050 --> 00:22:05,480 因此,事實上,我在打印 出來的東西實際上只是 504 00:22:05,480 --> 00:22:08,150 放緩的過程,我們 已經達到了這一點。 505 00:22:08,150 --> 00:22:08,510 確定。 506 00:22:08,510 --> 00:22:08,870 唷! 507 00:22:08,870 --> 00:22:11,180 >> 所以實際上是什麼回事呢? 508 00:22:11,180 --> 00:22:14,440 之所以有,只是作為一個一邊, 做任何輸入 509 00:22:14,440 --> 00:22:17,270 輸出往往要慢一些,因為你 寫入字符 510 00:22:17,270 --> 00:22:18,600 屏幕,滾動。 511 00:22:18,600 --> 00:22:21,720 所以長話短說,其實我 發生等的不耐煩了,我們將不得不 512 00:22:21,720 --> 00:22:23,260 看到這個最終的結果也是如此。 513 00:22:23,260 --> 00:22:26,220 現在,我得到了乘坐的打印, 我們看到它的時候了。 514 00:22:26,220 --> 00:22:28,410 那麼,為什麼會出現這種情況。 515 00:22:28,410 --> 00:22:31,300 好吧,簡單的解釋,當然, 可能是,富不應該 516 00:22:31,300 --> 00:22:32,500 可以調用本身。 517 00:22:32,500 --> 00:22:34,470 >> 現在籠統, 這是遞歸。 518 00:22:34,470 --> 00:22:36,970 我們想了幾個星期 前遞歸是好的。 519 00:22:36,970 --> 00:22:40,330 遞歸是這個神奇的方式 表達自己的超簡潔。 520 00:22:40,330 --> 00:22:41,400 它只是工作。 521 00:22:41,400 --> 00:22:45,060 但有一個關鍵的功能,所有的 我們已經討論過的遞歸程序 522 00:22:45,060 --> 00:22:48,260 因此,看著遠, 是他們有什麼? 523 00:22:48,260 --> 00:22:52,610 一個基本的情況,這是一些硬編碼 情況下,在某些情況下,所述 524 00:22:52,610 --> 00:22:56,210 不叫富,這顯然是 不是這裡的情況。 525 00:22:56,210 --> 00:22:58,920 >> 那麼,什麼是真正發生的事情 在這幅畫嗎? 526 00:22:58,920 --> 00:23:01,790 那麼,當主調用foo, 得到的片的內存。 527 00:23:01,790 --> 00:23:04,150 當foo調用foo,它就會 一個切片的內存。 528 00:23:04,150 --> 00:23:06,430 foo的調用foo時,它就會一片。 529 00:23:06,430 --> 00:23:07,080 它得到一個切片。 530 00:23:07,080 --> 00:23:08,120 它得到一個切片。 531 00:23:08,120 --> 00:23:09,460 因為foo是永遠不會回來了。 532 00:23:09,460 --> 00:23:12,160 我們從來沒有刪除其中的一個 從堆棧幀。 533 00:23:12,160 --> 00:23:15,930 所以,我們正在吹遍堆,而不是 何況誰知道還有什麼, 534 00:23:15,930 --> 00:23:19,600 我們正在超越我們的邊界 所謂的內存段。 535 00:23:19,600 --> 00:23:21,790 錯誤去分割假。 536 00:23:21,790 --> 00:23:24,110 >> 因此,解決辦法是 顯然沒有做到這一點。 537 00:23:24,110 --> 00:23:28,830 但是,更大的意義是,是的, 絕對是有一定的限制, 538 00:23:28,830 --> 00:23:32,470 即使它沒有很好的定義,至於如何 很多功能,你可以調用一個 539 00:23:32,470 --> 00:23:34,970 程序,多少次的函數 可以調用本身。 540 00:23:34,970 --> 00:23:38,430 因此,即使我們做了宣講遞歸 作為這種潛在的神奇的東西一 541 00:23:38,430 --> 00:23:41,870 幾週前西格瑪 功能,當我們得到的數據 542 00:23:41,870 --> 00:23:45,270 結構和CS50,你會看到其他 它的應用,它不是 543 00:23:45,270 --> 00:23:46,500 不一定是最好的事情。 544 00:23:46,500 --> 00:23:50,070 因為如果一個函數調用本身, 調用本身,即使有基地 545 00:23:50,070 --> 00:23:54,860 情況下,如果你不打,基本情況 1000電話或10000電話, 546 00:23:54,860 --> 00:23:58,800 那個時候,你可能已經運行的空間 你所謂的堆棧和命中 547 00:23:58,800 --> 00:24:00,400 一些其他的內存段。 548 00:24:00,400 --> 00:24:03,950 所以它也是一種設計權衡 優雅和之間 549 00:24:03,950 --> 00:24:06,920 您的特定的魯棒性 實現。 550 00:24:06,920 --> 00:24:10,780 >> 所以還有另一個缺點或 另一個,這是我們的疑難雜症 551 00:24:10,780 --> 00:24:11,720 一直在做迄今。 552 00:24:11,720 --> 00:24:12,980 當我打電話的GetString - 553 00:24:12,980 --> 00:24:15,120 讓我回去到2個招呼。 554 00:24:15,120 --> 00:24:18,170 請注意,我調用的getString 這是返回地址。 555 00:24:18,170 --> 00:24:20,730 我們要求今天地址 是從堆中。 556 00:24:20,730 --> 00:24:24,480 而現在,我打印出 在該地址的字符串。 557 00:24:24,480 --> 00:24:27,000 但是,我們從來沒有所謂的 相反的getString。 558 00:24:27,000 --> 00:24:30,850 我們從來沒有calll這樣的函數 ungetstring,在那裡你的手背 559 00:24:30,850 --> 00:24:31,610 該內存。 560 00:24:31,610 --> 00:24:33,250 但坦率地說,我們可能 應該是。 561 00:24:33,250 --> 00:24:37,390 因為如果我們繼續問電腦 內存,有人喜歡的方式 562 00:24:37,390 --> 00:24:40,830 GetString的,但從來沒有給它回來了,肯定 那也是必然導致 563 00:24:40,830 --> 00:24:42,970 據此,我們耗盡內存的問題。 564 00:24:42,970 --> 00:24:46,140 >> 而事實上,我們可以看看這些 用新的工具,其使用的問題 565 00:24:46,140 --> 00:24:47,640 是有點神秘輸入。 566 00:24:47,640 --> 00:24:50,960 但是,讓我繼續前進,飛濺起來 在屏幕上一會兒就好了。 567 00:24:50,960 --> 00:24:56,940 我要繼續運行Valgrind的 其第一個命令與參數 568 00:24:56,940 --> 00:25:00,260 行參數的名稱是 ,程序HELLO-2。 569 00:25:00,260 --> 00:25:02,650 不幸的是,它是 輸出殘暴 570 00:25:02,650 --> 00:25:04,290 複雜,沒有很好的理由。 571 00:25:04,290 --> 00:25:06,280 所以我們看到所有的爛攤子。 572 00:25:06,280 --> 00:25:07,530 大衛是說出我的名字。 573 00:25:07,530 --> 00:25:09,760 所以這是程序 實際運行。 574 00:25:09,760 --> 00:25:11,180 現在,我們得到如下的輸出。 575 00:25:11,180 --> 00:25:13,400 >> 所以Valgrind是相似 精神GDB。 576 00:25:13,400 --> 00:25:14,950 這不是一個調試器本身。 577 00:25:14,950 --> 00:25:16,270 但它是一個內存檢查。 578 00:25:16,270 --> 00:25:20,140 這是一個程序,將運行 編程,並告訴你,如果你問了 579 00:25:20,140 --> 00:25:23,860 計算機內存和從來沒有把它遞給 回來,因此這意味著你有 580 00:25:23,860 --> 00:25:24,570 內存洩漏。 581 00:25:24,570 --> 00:25:26,240 和內存洩漏往往是壞的。 582 00:25:26,240 --> 00:25:29,120 你是計算機用戶 大概覺得這一點,你是否有一個 583 00:25:29,120 --> 00:25:30,300 Mac或PC。 584 00:25:30,300 --> 00:25:33,730 您是否曾​​經使用您的電腦 而在一些沒有重新啟動 585 00:25:33,730 --> 00:25:36,820 天,或者你剛剛得到了很多 程序運行,和那該死的東西 586 00:25:36,820 --> 00:25:42,360 減慢研磨停止,或者至少 超級討厭使用,因為 587 00:25:42,360 --> 00:25:44,350 一切都只是得到了超慢。 588 00:25:44,350 --> 00:25:46,260 >> 現在,可以有任意數量的原因。 589 00:25:46,260 --> 00:25:49,600 這可能是一個無限循環,一個bug 某人的代碼,或者更簡單地說,它 590 00:25:49,600 --> 00:25:53,250 可能意味著你正在使用更多的 內存,或試圖,比你 591 00:25:53,250 --> 00:25:54,920 電腦實際上有。 592 00:25:54,920 --> 00:25:57,770 也許有一些程序中的錯誤 保持內存要求。 593 00:25:57,770 --> 00:26:02,480 多年的瀏覽器是臭名遠揚 這一點,要求越來越多的內存 594 00:26:02,480 --> 00:26:03,870 但從來沒有將它送回。 595 00:26:03,870 --> 00:26:07,220 當然,如果你只有一個有限 內存量,你不能要求 596 00:26:07,220 --> 00:26:09,990 無限多次 一些該內存。 597 00:26:09,990 --> 00:26:13,070 >> 所以你在這裡看到的,即使 再次Valgrind的輸出是 598 00:26:13,070 --> 00:26:17,490 不必要的複雜瞥一眼 首先,這是最有趣的部分。 599 00:26:17,490 --> 00:26:18,890 堆 - 600 00:26:18,890 --> 00:26:20,060 在出口中使用。 601 00:26:20,060 --> 00:26:22,810 因此,這裡是多大的內存 在使用於堆中 602 00:26:22,810 --> 00:26:24,300 我的程序退出 - 603 00:26:24,300 --> 00:26:27,280 顯然在一個塊中的6個字節。 604 00:26:27,280 --> 00:26:28,710 所以,我要揮揮手 在哪一個塊。 605 00:26:28,710 --> 00:26:31,270 認為它就是一大塊,更 技術字塊。 606 00:26:31,270 --> 00:26:33,140 但六個字節 - 607 00:26:33,140 --> 00:26:36,870 什麼是六個字節 仍在使用? 608 00:26:36,870 --> 00:26:37,390 >> 沒錯。 609 00:26:37,390 --> 00:26:41,520 D-A-V-I-D反斜杠零,五個字母 名稱加上空結束。 610 00:26:41,520 --> 00:26:46,350 因此,這一計劃的valgrind注意到,我 要求,很顯然,由六個字節 611 00:26:46,350 --> 00:26:48,950 GetString的方式,但從來沒有 給他們回來。 612 00:26:48,950 --> 00:26:52,030 而事實上,這可能不會是這樣 很明顯,如果我的程序並非三 613 00:26:52,030 --> 00:26:53,590 線,但它是300線。 614 00:26:53,590 --> 00:26:56,920 所以,我們其實可以給另一個命令 Valgrind的行參數 615 00:26:56,920 --> 00:26:58,290 使它更詳細。 616 00:26:58,290 --> 00:26:59,760 要記住,這是一個有點惱人。 617 00:26:59,760 --> 00:27:01,580 但如果我這樣做 - 618 00:27:01,580 --> 00:27:01,930 讓我們來看看。 619 00:27:01,930 --> 00:27:03,540 洩漏 - 620 00:27:03,540 --> 00:27:05,030 被洩露 - 621 00:27:05,030 --> 00:27:07,580 即使我不記得 它是什麼斷手。 622 00:27:07,580 --> 00:27:08,550 >> - 洩漏檢查等於已滿。 623 00:27:08,550 --> 00:27:10,180 是的,謝謝你。 624 00:27:10,180 --> 00:27:12,520 - 洩漏檢查等於已滿。 625 00:27:12,520 --> 00:27:13,800 回車鍵。 626 00:27:13,800 --> 00:27:14,940 相同的程序正在運行。 627 00:27:14,940 --> 00:27:16,180 再次鍵入大衛。 628 00:27:16,180 --> 00:27:17,660 現在我看到的更詳細一點。 629 00:27:17,660 --> 00:27:20,890 但堆下面總結, 四是相同的 - 啊, 630 00:27:20,890 --> 00:27:22,120 這是一種不錯的。 631 00:27:22,120 --> 00:27:25,460 現在Valgrind是實際上是在尋找 在我的代碼有點困難。 632 00:27:25,460 --> 00:27:29,580 和它的說,很顯然, malloc的行 - 633 00:27:29,580 --> 00:27:30,580 我們縮小。 634 00:27:30,580 --> 00:27:31,980 行 - 635 00:27:31,980 --> 00:27:32,930 我們看不出它是什麼線。 636 00:27:32,930 --> 00:27:35,110 但malloc的第一元兇。 637 00:27:35,110 --> 00:27:38,630 有一個博客中的malloc。 638 00:27:38,630 --> 00:27:39,810 >> 沒事吧? 639 00:27:39,810 --> 00:27:40,450 OK,沒。 640 00:27:40,450 --> 00:27:40,940 對嗎? 641 00:27:40,940 --> 00:27:42,520 我叫GetString的。 642 00:27:42,520 --> 00:27:44,460 顯然的getString調用malloc。 643 00:27:44,460 --> 00:27:47,800 那麼,什麼行代碼顯然是 有過錯 644 00:27:47,800 --> 00:27:49,050 分配這個內存? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 讓我們假設,誰寫的malloc 已經存在了足夠長的時間,它是 647 00:27:55,540 --> 00:27:56,390 不是他們的錯。 648 00:27:56,390 --> 00:27:57,520 因此,它可能是我的。 649 00:27:57,520 --> 00:28:02,000 的GetString cs50.c - 所以這是一個 文件在計算機上的某個地方 - 650 00:28:02,000 --> 00:28:05,210 在286行似乎是罪魁禍首。 651 00:28:05,210 --> 00:28:08,140 現在,讓我們假設已經CS50 圍繞體面的時間量,所以 652 00:28:08,140 --> 00:28:09,720 我們也有犯錯誤的。 653 00:28:09,720 --> 00:28:14,080 因此,它可能不是的GetString 錯誤在於,而是在 654 00:28:14,080 --> 00:28:17,810 HELLO-2.C線18。 655 00:28:17,810 --> 00:28:20,670 >> 因此,讓我們一起來看看 該行18是什麼。 656 00:28:20,670 --> 00:28:21,130 哦。 657 00:28:21,130 --> 00:28:27,130 不知怎的,這條線是不一定 越野車,本身,但它的原因是 658 00:28:27,130 --> 00:28:28,630 背後的內存洩漏。 659 00:28:28,630 --> 00:28:32,140 因此,超級簡單,將直觀地 這裡的解決方案嗎? 660 00:28:32,140 --> 00:28:34,710 如果我們要求內存,從來沒有 給它,這似乎是一個 661 00:28:34,710 --> 00:28:37,940 的問題,因為隨著​​時間的推移我的電腦 可能會耗盡內存,可能會減緩 662 00:28:37,940 --> 00:28:42,110 下來,不好的事情可能會發生,好了, 簡單直觀的解決方案是什麼? 663 00:28:42,110 --> 00:28:43,140 只要給它回來。 664 00:28:43,140 --> 00:28:44,770 >> 你如何釋放內存? 665 00:28:44,770 --> 00:28:49,970 嗯,幸好這是相當簡單 只是說免費的名字。 666 00:28:49,970 --> 00:28:51,260 我們從來沒有這樣做過。 667 00:28:51,260 --> 00:28:55,890 但你基本上可以認為 相反的malloc。 668 00:28:55,890 --> 00:28:58,030 免費是相反的 分配內存。 669 00:28:58,030 --> 00:28:59,540 所以現在讓我重新編譯。 670 00:28:59,540 --> 00:29:02,050 “HELLO-2。 671 00:29:02,050 --> 00:29:04,620 讓我再次運行它。 HELLO-2大衛。 672 00:29:04,620 --> 00:29:07,290 因此,它似乎工作 以完全相同的方式。 673 00:29:07,290 --> 00:29:11,180 但是,如果我回去Valgrind的,並重新運行 我新的相同命令 674 00:29:11,180 --> 00:29:14,720 編譯後的程序,打字 在我的名字前 - 675 00:29:14,720 --> 00:29:15,370 不錯。 676 00:29:15,370 --> 00:29:16,760 堆總結 - 677 00:29:16,760 --> 00:29:17,740 在出口中使用 - 678 00:29:17,740 --> 00:29:19,370 零字節的零塊。 679 00:29:19,370 --> 00:29:21,840 這是超級好看,所有 堆塊被釋放。 680 00:29:21,840 --> 00:29:23,480 無洩漏是可能的。 681 00:29:23,480 --> 00:29:27,200 >> 因此,未來,不與習題集4 但與習題集5,取證 682 00:29:27,200 --> 00:29:30,740 起,這也將成為一個 措施的正確性的 683 00:29:30,740 --> 00:29:33,630 程序,不論你有 或者沒有內存洩漏。 684 00:29:33,630 --> 00:29:36,900 但令人欣慰的是,你不僅可以理 通過它們很直觀, 685 00:29:36,900 --> 00:29:40,430 可以說,是方便的小程序 但對於大型程序更難, 686 00:29:40,430 --> 00:29:43,860 Valgrind的,對於那些較大節目, 可以幫助您識別 687 00:29:43,860 --> 00:29:45,360 特別的問題。 688 00:29:45,360 --> 00:29:47,500 >> 但是,還有另外一個問題 可能出現的。 689 00:29:47,500 --> 00:29:51,245 讓我在這裡打開這個文件,這一點, 再次,有些簡單的例子。 690 00:29:51,245 --> 00:29:53,760 但是,讓我們的重點放在什麼 這個程序。 691 00:29:53,760 --> 00:29:55,190 這就是所謂的memory.c。 692 00:29:55,190 --> 00:29:58,380 在今天稍後我們將發布 今天的源代碼壓縮。 693 00:29:58,380 --> 00:30:01,610 ,請注意,我有一個函數調用 f以不帶任何參數和 694 00:30:01,610 --> 00:30:02,800 返回一無所獲。 695 00:30:02,800 --> 00:30:07,240 在第20行,我顯然聲明 int和調用x的指針。 696 00:30:07,240 --> 00:30:09,570 我分配的是返回 值的malloc。 697 00:30:09,570 --> 00:30:14,590 只是要清楚,我多少字節 我大概從malloc 698 00:30:14,590 --> 00:30:17,080 在這種情況下呢? 699 00:30:17,080 --> 00:30:18,040 >> 大概40。 700 00:30:18,040 --> 00:30:18,840 你在哪兒? 701 00:30:18,840 --> 00:30:22,410 好吧,如果你還記得,往往是一個int 4個字節,它是在至少 702 00:30:22,410 --> 00:30:25,110 器具4的10倍,顯然是40。 703 00:30:25,110 --> 00:30:28,920 所以malloc的返回地址 一大塊的內存和存儲 704 00:30:28,920 --> 00:30:30,800 在x最終解決。 705 00:30:30,800 --> 00:30:32,570 所以要明確, 然後發生了什麼? 706 00:30:32,570 --> 00:30:34,990 好吧,讓我切換回 我們這裡的圖片。 707 00:30:34,990 --> 00:30:38,150 讓我不只是畫出心底 計算機的內存,讓我繼續前進, 708 00:30:38,150 --> 00:30:42,990 繪製整個矩形, 代表我的內存。 709 00:30:42,990 --> 00:30:44,790 >> 我們會說,堆棧 是在底部。 710 00:30:44,790 --> 00:30:47,010 有一個文本段 未初始化的數據。 711 00:30:47,010 --> 00:30:49,880 但我只是去那些抽象 其他的東西遠點,點的點。 712 00:30:49,880 --> 00:30:53,470 我只是指 隨著堆在上面。 713 00:30:53,470 --> 00:30:57,070 然後在這幅畫的底部, 代表主,我要去 714 00:30:57,070 --> 00:30:59,880 給它一個片內存 在堆棧中。 715 00:30:59,880 --> 00:31:03,150 F,我要去給它一個切片 內存堆棧。 716 00:31:03,150 --> 00:31:05,140 現在,我諮詢了我 再次源代碼。 717 00:31:05,140 --> 00:31:07,170 局部變量主要是什麼? 718 00:31:07,170 --> 00:31:10,710 顯然沒有,所以該片 有效空的,或者甚至還不如大 719 00:31:10,710 --> 00:31:11,600 因為我已經畫了。 720 00:31:11,600 --> 00:31:15,730 但在F,我有一個局部變量, 被稱為X。 721 00:31:15,730 --> 00:31:20,410 所以我要繼續前進,並得到F 一塊內存,調用x。 722 00:31:20,410 --> 00:31:24,680 >> 現在malloc的10倍4, ,所以malloc的40,在哪裡 723 00:31:24,680 --> 00:31:25,430 內存從何而來? 724 00:31:25,430 --> 00:31:27,530 我們還沒有得出一個圖片 像這個。 725 00:31:27,530 --> 00:31:31,140 但是讓我們假設,它是有效的 從這裡來的,所以, 726 00:31:31,140 --> 00:31:33,170 二,三,四,五。 727 00:31:33,170 --> 00:31:34,680 現在我需要40。 728 00:31:34,680 --> 00:31:37,540 所以我就做點,點,點建議 甚至更多的內存 729 00:31:37,540 --> 00:31:39,350 回來從堆中。 730 00:31:39,350 --> 00:31:40,710 現在的地址是什麼? 731 00:31:40,710 --> 00:31:42,620 讓我們選擇我們的任意 解決一如既往 - 732 00:31:42,620 --> 00:31:46,310 Ox123,儘管它可能會 是完全不同的東西。 733 00:31:46,310 --> 00:31:50,420 這是的第一個字節的地址 內存,我要問的malloc。 734 00:31:50,420 --> 00:31:53,630 >> 因此,在短,一旦線20執行 字面意思是什麼 735 00:31:53,630 --> 00:31:57,170 裡面存放的x? 736 00:31:57,170 --> 00:31:58,730 Ox123。 737 00:31:58,730 --> 00:32:00,370 Ox123。 738 00:32:00,370 --> 00:32:01,550 牛年是無趣的。 739 00:32:01,550 --> 00:32:03,200 它只是意味著這裡是一個 十六進制數。 740 00:32:03,200 --> 00:32:06,490 但關鍵的是,我的店 在x,它是一個局部變量。 741 00:32:06,490 --> 00:32:10,260 但它的數據類型,再次 是一個地址,一個int。 742 00:32:10,260 --> 00:32:12,710 好吧,我要存儲Ox123。 743 00:32:12,710 --> 00:32:16,610 但是,如果這是一個有點太 不必要的複雜,如果我滾動 744 00:32:16,610 --> 00:32:21,490 背面,我們可以抽​​象送人相當 合理,只是說,x是一個 745 00:32:21,490 --> 00:32:23,910 該內存塊的指針。 746 00:32:23,910 --> 00:32:24,070 >> 確定。 747 00:32:24,070 --> 00:32:26,230 現在的問題在手 - 748 00:32:26,230 --> 00:32:29,910 事實證明,21號線,是馬車。 749 00:32:29,910 --> 00:32:31,160 為什麼呢? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> 對不起? 752 00:32:36,930 --> 00:32:38,640 它不具有 - 753 00:32:38,640 --> 00:32:40,390 說一次。 754 00:32:40,390 --> 00:32:41,240 那麼,它不是免費的。 755 00:32:41,240 --> 00:32:42,350 所以這是第二個。 756 00:32:42,350 --> 00:32:45,000 因此,有另外一個,但具體 在第21行。 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> 沒錯。 759 00:32:50,040 --> 00:32:54,980 這個簡單的一行代碼僅僅是一個 緩衝區溢出,緩衝區溢出。 760 00:32:54,980 --> 00:32:57,050 只是意味著一個緩衝區的內存塊。 761 00:32:57,050 --> 00:33:01,520 但是,內存塊的大小為 10,10的整數,這意味著,如果我們 762 00:33:01,520 --> 00:33:05,350 索引使用語法糖 數組符號,廣場 763 00:33:05,350 --> 00:33:09,220 括號中,你有機會獲得 x支架0 X支架1個, 764 00:33:09,220 --> 00:33:10,390 支架點,點,點。 765 00:33:10,390 --> 00:33:13,270 9 x支架是最大的一個。 766 00:33:13,270 --> 00:33:17,680 所以,如果我做X支架10 實際上,我在內存中? 767 00:33:17,680 --> 00:33:19,120 >> 好吧,如果我有10個整數 - 768 00:33:19,120 --> 00:33:21,070 讓我們實際繪製所有 這些在這裡。 769 00:33:21,070 --> 00:33:22,700 所以這是第5位。 770 00:33:22,700 --> 00:33:24,660 這裡的其他5個int。 771 00:33:24,660 --> 00:33:29,580 所以X支架0是在這裡。 x支架1 在這裡。 9 x支架是在這裡。 x支架 772 00:33:29,580 --> 00:33:37,960 10,這意味著我告訴 在第21行中,計算機把 773 00:33:37,960 --> 00:33:39,400 號在哪裡? 774 00:33:39,400 --> 00:33:42,010 數字0在哪裡? 775 00:33:42,010 --> 00:33:43,380 嗯,這是0,是的。 776 00:33:43,380 --> 00:33:45,460 但是,僅僅一個事實,即其0 是一種巧合。 777 00:33:45,460 --> 00:33:47,140 它可能是數字 50,我們所關心的一切。 778 00:33:47,140 --> 00:33:50,480 但我們正在努力把它在x支架 10,這是這 779 00:33:50,480 --> 00:33:53,700 繪製問號, 是不是一件好事。 780 00:33:53,700 --> 00:33:57,070 這個程序可能會非常好 崩潰的結果。 781 00:33:57,070 --> 00:33:59,400 >> 現在,讓我們繼續前進,看看,如果這 的確,發生了什麼。 782 00:33:59,400 --> 00:34:02,600 使存儲器,因為該文件 被稱為memory.c。 783 00:34:02,600 --> 00:34:05,950 讓我們繼續前進,並運行 程序存儲器。 784 00:34:05,950 --> 00:34:08,239 所以我們很幸運,其實,它似乎。 785 00:34:08,239 --> 00:34:09,340 我們很幸運。 786 00:34:09,340 --> 00:34:11,060 但是,讓我們來看看,如果我們現在運行Valgrind的。 787 00:34:11,060 --> 00:34:14,170 乍一看,我的程序可能 似乎是完全正確的。 788 00:34:14,170 --> 00:34:18,010 但讓​​我與運行Valgrind的 - 等於內存洩漏檢查。 789 00:34:18,010 --> 00:34:20,110 >> 而現在,當我運行這個 - 790 00:34:20,110 --> 00:34:21,030 有意思的。 791 00:34:21,030 --> 00:34:26,800 無效寫大小為4 memory.c 21行。 792 00:34:26,800 --> 00:34:29,284 memory.c 21號線是哪一個? 793 00:34:29,284 --> 00:34:30,340 呵呵,有意思。 794 00:34:30,340 --> 00:34:31,080 但等待。 795 00:34:31,080 --> 00:34:32,389 尺寸4,是指什麼? 796 00:34:32,389 --> 00:34:34,969 我只是一個寫 但它的大小為4。 797 00:34:34,969 --> 00:34:36,889 為什麼是4? 798 00:34:36,889 --> 00:34:39,280 這是因為它是一個整數, ,再四個字節。 799 00:34:39,280 --> 00:34:42,510 因此,Valgrind的,我發現了一個bug, 在我的代碼一眼,沒有。 800 00:34:42,510 --> 00:34:45,040 ,也許你的TF會或不會。 801 00:34:45,040 --> 00:34:48,469 但Valgrind的肯定發現 我們犯了一個錯誤,甚至 802 00:34:48,469 --> 00:34:52,719 雖然我們很幸運,和電腦 決定,誒,我不會崩潰 803 00:34:52,719 --> 00:34:57,470 只是因為你碰到一個字節,一個 int的內存價值,你沒有 804 00:34:57,470 --> 00:34:58,550 實際上是自己的。 805 00:34:58,550 --> 00:35:00,380 >> 那麼,還有什麼是馬車。 806 00:35:00,380 --> 00:35:01,180 地址 - 807 00:35:01,180 --> 00:35:03,190 這是一個瘋狂的尋找地址 十六進制。 808 00:35:03,190 --> 00:35:06,890 這只是意味著在某處堆 零字節塊大小為40後 809 00:35:06,890 --> 00:35:07,620 被分配。 810 00:35:07,620 --> 00:35:10,610 讓我放大了這裡,看看如果 這是一個多一點幫助。 811 00:35:10,610 --> 00:35:11,410 有趣。 812 00:35:11,410 --> 00:35:15,600 肯定失去40字節 1 1負的戰績。 813 00:35:15,600 --> 00:35:17,840 同樣,更多的話比在這裡是非常有用的。 814 00:35:17,840 --> 00:35:21,350 但基於高亮行, 我應該在哪裡可能集中 815 00:35:21,350 --> 00:35:24,070 關注的另一個錯誤? 816 00:35:24,070 --> 00:35:26,570 看起來像memory.c 20行。 817 00:35:26,570 --> 00:35:30,990 >> 因此,如果我們回到20行,這就是 一個前面確定。 818 00:35:30,990 --> 00:35:33,030 它不一定是馬車。 819 00:35:33,030 --> 00:35:35,160 但我們已經扭轉其影響。 820 00:35:35,160 --> 00:35:38,790 所以,我怎麼至少改正 這些錯誤? 821 00:35:38,790 --> 00:35:42,240 21號線後,我能做什麼呢? 822 00:35:42,240 --> 00:35:47,110 我可以做免費的X,所以 給該內存。 823 00:35:47,110 --> 00:35:49,230 我怎麼解決這個錯誤? 824 00:35:49,230 --> 00:35:52,120 我絕對應該去 距離不超過0。 825 00:35:52,120 --> 00:35:53,670 所以,讓我嘗試重新運行這個。 826 00:35:53,670 --> 00:35:56,080 對不起,肯定去 距離不超過9。 827 00:35:56,080 --> 00:35:57,510 使內存。 828 00:35:57,510 --> 00:36:00,650 讓我重新運行Valgrind的 在一個更大的窗口。 829 00:36:00,650 --> 00:36:01,580 現在看。 830 00:36:01,580 --> 00:36:02,250 尼斯。 831 00:36:02,250 --> 00:36:03,270 所有的堆塊被釋放。 832 00:36:03,270 --> 00:36:04,270 無洩漏是可能的。 833 00:36:04,270 --> 00:36:07,520 上述這裡,這裡沒有提到 任何無效的權利。 834 00:36:07,520 --> 00:36:09,820 >> 只是為了讓貪婪,讓我們 如果另一個示範 835 00:36:09,820 --> 00:36:11,050 不走的打算 - 836 00:36:11,050 --> 00:36:12,560 我沒有得到幸運的時刻。 837 00:36:12,560 --> 00:36:15,530 的事實,這是0也許是 不必要的誤導。 838 00:36:15,530 --> 00:36:20,650 讓我們只是做50個,有點武斷 電話號碼,讓記憶點陣斜線內存 - 839 00:36:20,650 --> 00:36:21,410 仍然得到幸運。 840 00:36:21,410 --> 00:36:22,510 沒有崩潰。 841 00:36:22,510 --> 00:36:26,150 假設我只是做一些真正 愚蠢的,我做100個。 842 00:36:26,150 --> 00:36:30,360 讓我重拍內存, 點斜線內存 - 843 00:36:30,360 --> 00:36:31,075 很幸運了。 844 00:36:31,075 --> 00:36:32,800 約1000如何? 845 00:36:32,800 --> 00:36:35,370 int的超越,大致 在那裡我應該是什麼? 846 00:36:35,370 --> 00:36:37,410 使存儲器 - 847 00:36:37,410 --> 00:36:38,570 該死的。 848 00:36:38,570 --> 00:36:39,920 >> [笑] 849 00:36:39,920 --> 00:36:41,270 >> 確定。 850 00:36:41,270 --> 00:36:43,920 我們不是好惹的周圍了。 851 00:36:43,920 --> 00:36:45,120 重新運行內存。 852 00:36:45,120 --> 00:36:45,840 我們去那裡。 853 00:36:45,840 --> 00:36:46,410 好的。 854 00:36:46,410 --> 00:36:52,500 因此很明顯,你100,000整數索引 超越你應該已經在 855 00:36:52,500 --> 00:36:54,410 內存,不好的事情發生。 856 00:36:54,410 --> 00:36:56,430 因此,這顯然是不 一種堅硬,快速的規則。 857 00:36:56,430 --> 00:36:58,190 我是那種使用試驗 和錯誤到那裡。 858 00:36:58,190 --> 00:37:02,230 但是,這是因為,長話短說, 您的計算機的內存也劃分 859 00:37:02,230 --> 00:37:03,580 這些事稱為段。 860 00:37:03,580 --> 00:37:07,260 有時,電腦實際上 已經給你多一點的內存 861 00:37:07,260 --> 00:37:08,400 比你問。 862 00:37:08,400 --> 00:37:12,170 但為了提高效率,它只是更容易 獲得更多的內存,但只能告訴你 863 00:37:12,170 --> 00:37:13,780 你得到它的一部分。 864 00:37:13,780 --> 00:37:16,370 >> 如果你幸運,有時, 因此,您可能能夠觸摸 865 00:37:16,370 --> 00:37:17,795 存儲器中並不屬於你。 866 00:37:17,795 --> 00:37:21,860 你有沒有保證,什麼樣的價值 你放在那裡將呆在那裡,因為 867 00:37:21,860 --> 00:37:25,080 計算機仍然認為它不 你的,但它不一定要去 868 00:37:25,080 --> 00:37:29,910 打另一個段中的內存 計算機和誘導這樣一個錯誤 869 00:37:29,910 --> 00:37:31,710 這一個在這裡。 870 00:37:31,710 --> 00:37:32,060 好的。 871 00:37:32,060 --> 00:37:37,240 然後在內存中的任何問題嗎? 872 00:37:37,240 --> 00:37:37,590 >> 好的。 873 00:37:37,590 --> 00:37:40,610 讓我們來看看這裡,然後, 我們一直在服用的東西 874 00:37:40,610 --> 00:37:48,361 授予相當長的一段時間, 在這個文件中稱為cs50.h.的 875 00:37:48,361 --> 00:37:49,420 因此,這是一個文件。 876 00:37:49,420 --> 00:37:51,130 這些都只是一大堆 往上頂的意見。 877 00:37:51,130 --> 00:37:53,900 你可能已經看過這個,如果 你周圍戳在設備上。 878 00:37:53,900 --> 00:37:57,000 但事實證明,所有的時間, 當我們使用字符串作為 879 00:37:57,000 --> 00:38:01,130 同義詞,手段,我們宣布 這代名詞 880 00:38:01,130 --> 00:38:03,990 關鍵字typedef的類型定義。 881 00:38:03,990 --> 00:38:07,500 我們本質上說, 串一個字符星級的代名詞。 882 00:38:07,500 --> 00:38:11,190 的裝置,通過該堆棧 這些培訓車輪被稱為 883 00:38:11,190 --> 00:38:12,040 的字符串。 884 00:38:12,040 --> 00:38:14,830 >> 現在,這裡只是一個原型 getchar的。 885 00:38:14,830 --> 00:38:17,350 我們可能已經看到它之前,但是這 的確它做什麼。用getchar 886 00:38:17,350 --> 00:38:19,070 不帶任何參數,返回一個字符。 887 00:38:19,070 --> 00:38:21,340 getdouble不帶任何參數, 返回一個double。 888 00:38:21,340 --> 00:38:24,440 getfloat不帶任何參數,返回 float,並且依此類推。 889 00:38:24,440 --> 00:38:27,270 調用getInt是在這裡。 getlonglong 是在這裡。 890 00:38:27,270 --> 00:38:28,820 和GetString是在這裡。 891 00:38:28,820 --> 00:38:29,420 就是這樣。 892 00:38:29,420 --> 00:38:33,080 這紫色的線是另一個預處理 指令,因為 893 00:38:33,080 --> 00:38:35,550 包括hashtag在它的開始。 894 00:38:35,550 --> 00:38:35,870 >> 好的。 895 00:38:35,870 --> 00:38:38,380 所以,現在讓我進入cs50.c. 896 00:38:38,380 --> 00:38:40,400 我們不會說話太長。 897 00:38:40,400 --> 00:38:43,280 但給你一個什麼樣的一瞥 這一切一直 898 00:38:43,280 --> 00:38:46,434 時間,讓我去 - 899 00:38:46,434 --> 00:38:48,250 讓我們做getchar的。 900 00:38:48,250 --> 00:38:51,050 所以getchar是主要意見。 901 00:38:51,050 --> 00:38:52,060 但它看起來是這樣的。 902 00:38:52,060 --> 00:38:54,800 因此,這是實際的功能 我們一直用getchar 903 00:38:54,800 --> 00:38:56,055 理所當然的存在。 904 00:38:56,055 --> 00:38:59,370 即使我們不使用這一個 經常,如果有的話,它至少 905 00:38:59,370 --> 00:39:00,470 比較簡單。 906 00:39:00,470 --> 00:39:02,580 因此,它是值得考慮 快看這裡。 907 00:39:02,580 --> 00:39:06,540 >> 所以用getchar有一個無限循環, 顯然是故意讓。 908 00:39:06,540 --> 00:39:10,050 然後,它調用 - ​​這是怎樣的一個 漂亮的代碼重用,我們自己寫。 909 00:39:10,050 --> 00:39:11,220 它調用的getString。 910 00:39:11,220 --> 00:39:12,460 因為它 意味著一個char? 911 00:39:12,460 --> 00:39:14,730 嗯,你不如嘗試獲得 從用戶和整行文本 912 00:39:14,730 --> 00:39:16,940 然後就看一眼 這些字符。 913 00:39:16,940 --> 00:39:19,170 在60號線,這裡有一個小 位神智檢查。 914 00:39:19,170 --> 00:39:21,610 如果GetString的返回了空, 讓我們無法繼續。 915 00:39:21,610 --> 00:39:22,820 出了錯。 916 00:39:22,820 --> 00:39:28,120 >> 現在,這是有點惱人,但 常規C.字符最大可能 917 00:39:28,120 --> 00:39:29,960 代表什麼 基於它的名字嗎? 918 00:39:29,960 --> 00:39:31,670 這是一個常數。 919 00:39:31,670 --> 00:39:36,040 這就像數值 最大的字符,你可以代表 920 00:39:36,040 --> 00:39:40,370 一咬,這大概是多少 255,這是最大的號碼 921 00:39:40,370 --> 00:39:42,720 代表8位, 從零開始。 922 00:39:42,720 --> 00:39:47,460 所以,我已經使用這個,在這個函數時, 寫這段代碼,僅僅是因為 923 00:39:47,460 --> 00:39:51,753 如果出現錯誤,但在用getchar 在生活中,它的目的是返回一個 924 00:39:51,753 --> 00:39:54,830 字符,你需要以某種方式能 信號向用戶表明 925 00:39:54,830 --> 00:39:55,840 出事了。 926 00:39:55,840 --> 00:39:56,970 我們不能返回null。 927 00:39:56,970 --> 00:39:58,480 null是一個指針。 928 00:39:58,480 --> 00:40:01,030 再次,用getchar 返回一個字符。 929 00:40:01,030 --> 00:40:04,760 >> 所以慣例,如果出現 錯了,是你,程序員,或者 930 00:40:04,760 --> 00:40:08,160 這種情況下,我的圖書館,我不得不 一個公正的任意決定,如果 931 00:40:08,160 --> 00:40:12,230 不順心的事,我要 返回數字255,這是真正的 932 00:40:12,230 --> 00:40:17,240 意味著我們不能,用戶可以不輸入 表示的字符 933 00:40:17,240 --> 00:40:21,410 255號,因為我們有一個偷 作為一個所謂的哨兵值 934 00:40:21,410 --> 00:40:23,410 表示出現了問題。 935 00:40:23,410 --> 00:40:27,010 現在事實證明,字符255 是不是,你可以輸入 936 00:40:27,010 --> 00:40:28,380 你的鍵盤,所以它是沒有什麼大不了的。 937 00:40:28,380 --> 00:40:30,910 用戶不會注意到, 我搶了這個人物。 938 00:40:30,910 --> 00:40:34,620 但是,如果你看到在手冊頁上 計算機系統中的一些參考 939 00:40:34,620 --> 00:40:38,560 帽不變,這樣說, 案件中的錯誤這個恆定的威力 940 00:40:38,560 --> 00:40:42,720 被退回,這是所有做一些人類 幾年前,擅自決定 941 00:40:42,720 --> 00:40:45,680 返回這個特殊的價值和 一個恆定的情況下 942 00:40:45,680 --> 00:40:46,840 出現錯誤。 943 00:40:46,840 --> 00:40:48,580 >> 現在發生的神奇在這裡。 944 00:40:48,580 --> 00:40:52,600 首先,我聲明在67行 兩個字符,C1和C2。 945 00:40:52,600 --> 00:40:57,080 然後在第68行,實際上是有 一行代碼,讓人想起 946 00:40:57,080 --> 00:41:01,140 我們的朋友的printf,因為它 確實有百分之CS在引號中。 947 00:41:01,140 --> 00:41:06,490 但是請注意,這裡發生了什麼。 sscanf的表示字符串掃描 - 948 00:41:06,490 --> 00:41:11,690 掃描格式化 字符串,因此sscanf的。 949 00:41:11,690 --> 00:41:12,590 這是什麼意思? 950 00:41:12,590 --> 00:41:16,310 這意味著你傳遞給sscanf的一個字符串。 951 00:41:16,310 --> 00:41:18,420 和線無論是 用戶鍵入 952 00:41:18,420 --> 00:41:23,520 您傳遞給sscanf的一個格式字符串,如 這告訴scanf函數是什麼 953 00:41:23,520 --> 00:41:25,870 你希望用戶輸入。 954 00:41:25,870 --> 00:41:29,730 然後,您可以通過兩個地址 的內存塊,在這種情況下, 955 00:41:29,730 --> 00:41:31,150 因為我有兩個佔位符。 956 00:41:31,150 --> 00:41:34,610 所以我要去給它的地址 C1和C2的地址。 957 00:41:34,610 --> 00:41:37,700 >> 記得你給一個函數 一些變量的地址,有什麼 958 00:41:37,700 --> 00:41:38,950 意味著什麼呢? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 由於該功能可以做什麼 給它的地址的情況 961 00:41:45,050 --> 00:41:48,170 可變的,而不是 變量本身? 962 00:41:48,170 --> 00:41:49,450 它可以改變它,對不對? 963 00:41:49,450 --> 00:41:53,250 如果你有某人映射到物理 地址,他們可以去那裡做 964 00:41:53,250 --> 00:41:54,750 無論他們想在該地址。 965 00:41:54,750 --> 00:41:55,800 同樣的想法在這裡。 966 00:41:55,800 --> 00:41:59,950 如果我們傳遞給sscanf的,兩個地址 大塊的內存,即使是這些微小的 967 00:41:59,950 --> 00:42:03,585 小的塊存儲器,C1和C2,但是 我們告訴它的地址, 968 00:42:03,585 --> 00:42:05,170 sscanf的可以改變它。 969 00:42:05,170 --> 00:42:08,530 >> 所以sscanf的生活的目的,如果我們讀 手冊頁是讀什麼 970 00:42:08,530 --> 00:42:13,420 鍵入的用戶,希望用戶 鍵入一個字符,也許 971 00:42:13,420 --> 00:42:16,470 另外一個角色,無論用戶 鍵入的第一個字符進入 972 00:42:16,470 --> 00:42:19,310 在這裡,第二個字符到這裡。 973 00:42:19,310 --> 00:42:22,470 現在,順便說一句,這,你會 只知道這個文檔, 974 00:42:22,470 --> 00:42:25,570 事實上,我在那裡放一個空白空間 只是意味著我不關心,如果 975 00:42:25,570 --> 00:42:28,440 用戶點擊空格鍵幾 次之前,他或她需要 976 00:42:28,440 --> 00:42:30,400 性格,我要忽略 任何空白。 977 00:42:30,400 --> 00:42:32,510 所以,我知道,從 文檔。 978 00:42:32,510 --> 00:42:36,570 >> 事實上,還有第二個%C 其次是白色空間實際上是 979 00:42:36,570 --> 00:42:37,410 經過深思熟慮的。 980 00:42:37,410 --> 00:42:41,190 我想如果用戶能夠檢測 搞砸了或不配合。 981 00:42:41,190 --> 00:42:45,630 所以,我希望用戶僅鍵入 在一個字符,因此我希望 982 00:42:45,630 --> 00:42:50,640 sscanf的是只打算返回 值1,因為再次,如果我讀 983 00:42:50,640 --> 00:42:55,400 文檔,sscanf的目的 生活是返回的數目 984 00:42:55,400 --> 00:42:59,170 充滿變量 用戶輸入。 985 00:42:59,170 --> 00:43:02,270 >> 我通過兩個變量 地址,C1和C2。 986 00:43:02,270 --> 00:43:06,420 我希望,雖然,只有一個 他們被殺害,因為如果sscanf的 987 00:43:06,420 --> 00:43:11,130 返回2,什麼是推測 邏輯的含義? 988 00:43:11,130 --> 00:43:14,600 用戶不只是給我一個 性格就像我告訴他或她。 989 00:43:14,600 --> 00:43:17,860 他們可能輸入 至少有兩個字符。 990 00:43:17,860 --> 00:43:22,430 所以,如果我不是沒有第二 %C,我只是有一個, 991 00:43:22,430 --> 00:43:25,370 坦率地說會更直觀 的做法,我覺得乍一看, 992 00:43:25,370 --> 00:43:30,220 你不會是能夠檢測 如果用戶已經給你更多 993 00:43:30,220 --> 00:43:31,780 輸入比你居然想。 994 00:43:31,780 --> 00:43:34,100 所以這是一個隱含的形式 錯誤檢查。 995 00:43:34,100 --> 00:43:35,640 >> 但是請注意,我在這裡做什麼。 996 00:43:35,640 --> 00:43:39,970 我敢肯定,一旦用戶給了我一個 性格,我釋放就行了,做 997 00:43:39,970 --> 00:43:44,450 GetString的相反,而這又 使用malloc,然後我返回 998 00:43:44,450 --> 00:43:51,030 C1,我希望的字符 用戶提供的,只提供了。 999 00:43:51,030 --> 00:43:54,680 所以簡單,但瞥見 getchar的任何問題? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 我們會回來的一些其他。 1002 00:43:59,590 --> 00:44:03,770 >> 好吧,讓我繼續前進,這樣做 - 現在假設,只是為了激勵我們 1003 00:44:03,770 --> 00:44:08,910 一個星期的討論,加上時間,這 是一個名為structs.h。 1004 00:44:08,910 --> 00:44:11,440 再次強調,這僅僅是一個滋味 是擺在面前的東西。 1005 00:44:11,440 --> 00:44:13,090 但是請注意,很多 這是註釋。 1006 00:44:13,090 --> 00:44:17,440 所以,我要強調只有 現在有趣的部分。 1007 00:44:17,440 --> 00:44:18,020 typedef的 - 1008 00:44:18,020 --> 00:44:19,700 再次,相同的關鍵字。 1009 00:44:19,700 --> 00:44:23,100 我們使用的typedef聲明串 作為一種特殊的數據類型。 1010 00:44:23,100 --> 00:44:27,490 您可以使用typedef創建新品牌 數據類型時不存在 1011 00:44:27,490 --> 00:44:28,570 C的發明。 1012 00:44:28,570 --> 00:44:32,520 例如,INT與C字符 C.雙與C但 1013 00:44:32,520 --> 00:44:34,000 有沒有一個學生的概念。 1014 00:44:34,000 --> 00:44:37,230 然而,這將是非常有用的 能夠寫一個程序,存儲 1015 00:44:37,230 --> 00:44:40,440 在一個變量中,一個學生的身份證號碼, 他們的名字,他們的房子。 1016 00:44:40,440 --> 00:44:42,890 換句話說,三塊 數據,就像一個int和一個 1017 00:44:42,890 --> 00:44:44,420 字符串和另一個字符串。 1018 00:44:44,420 --> 00:44:48,220 >> 用typedef,什麼是非常強大的 有關這個關鍵字sturct的 1019 00:44:48,220 --> 00:44:53,660 結構,你的程序員在2013年, 實際上可以定義你自己的 1020 00:44:53,660 --> 00:44:57,530 數據類型並不存在多年 前,但適合你的目的。 1021 00:44:57,530 --> 00:45:01,910 所以在這裡,在13至19線, 我們宣布一個新的數據類型,如 1022 00:45:01,910 --> 00:45:04,320 int,但是調用它的學生。 1023 00:45:04,320 --> 00:45:09,310 這個變量裡面去 有三樣東西 - 一個int,一個字符串, 1024 00:45:09,310 --> 00:45:09,930 和一個字符串。 1025 00:45:09,930 --> 00:45:13,040 所以,你能想到什麼是真正 這裡發生的事情,即使這是一個 1026 00:45:13,040 --> 00:45:17,160 位的簡化今天, 學生基本上 1027 00:45:17,160 --> 00:45:19,450 這個樣子。 1028 00:45:19,450 --> 00:45:22,580 它的將是一大塊 存儲器與一個ID,一個名字 1029 00:45:22,580 --> 00:45:25,580 場,和房子的領域。 1030 00:45:25,580 --> 00:45:30,670 我們就可以使用這些塊 記憶和訪問它們,就像如下。 1031 00:45:30,670 --> 00:45:38,870 >> 如果我去成struct0.c,這裡是一個 比較長,但後 1032 00:45:38,870 --> 00:45:42,630 柄的代碼 使用這種新的伎倆。 1033 00:45:42,630 --> 00:45:45,790 因此,首先讓我提請您注意 有趣的部分往上頂。 1034 00:45:45,790 --> 00:45:49,670 夏普定義學生3,宣告了一個 常數,稱為學生和受讓人 1035 00:45:49,670 --> 00:45:53,450 任意3號,只是 所以我有三個學生使用 1036 00:45:53,450 --> 00:45:54,830 現在這個程序。 1037 00:45:54,830 --> 00:45:55,960 這裡主要的。 1038 00:45:55,960 --> 00:45:58,860 通知,我怎麼申報 一個陣列學生? 1039 00:45:58,860 --> 00:46:00,480 好吧,我只是使用相同的語法。 1040 00:46:00,480 --> 00:46:02,110 “學生”這個詞顯然是新的。 1041 00:46:02,110 --> 00:46:04,790 但是,學生類,支架的學生。 1042 00:46:04,790 --> 00:46:06,720 >> 不幸的是,有很多 這裡的重用。 1043 00:46:06,720 --> 00:46:07,660 這僅僅是一個數字。 1044 00:46:07,660 --> 00:46:09,040 因此,這是喜歡說三。 1045 00:46:09,040 --> 00:46:11,430 類正是我想要的 調用該變量。 1046 00:46:11,430 --> 00:46:12,840 我可以打電話給學生。 1047 00:46:12,840 --> 00:46:15,880 但類,這是不是一類的 面向對象的Java的一種方式。 1048 00:46:15,880 --> 00:46:17,220 這只是一個班的學生。 1049 00:46:17,220 --> 00:46:20,590 和數據類型中的每一個元素 該數組中是學生。 1050 00:46:20,590 --> 00:46:23,040 因此,這是一個有點不同 說什麼 1051 00:46:23,040 --> 00:46:25,250 這樣,它只是 - 1052 00:46:25,250 --> 00:46:29,500 我說給我三個學生 並調用該數組類。 1053 00:46:29,500 --> 00:46:29,800 >> 好的。 1054 00:46:29,800 --> 00:46:30,680 現在,這裡是一個四循環。 1055 00:46:30,680 --> 00:46:33,480 這傢伙的熟悉 - 迭代 從零開始向上增加為三個。 1056 00:46:33,480 --> 00:46:35,160 而這裡的新語法。 1057 00:46:35,160 --> 00:46:37,710 程序會提示我, 人類,給它一個學生 1058 00:46:37,710 --> 00:46:39,200 ID,這是一個int。 1059 00:46:39,200 --> 00:46:44,650 而這裡的語法,您可以 在ID字段中存儲的東西 1060 00:46:44,650 --> 00:46:48,630 位置類支架。所以 這個語法是不是新的。 1061 00:46:48,630 --> 00:46:51,450 這只是意味著給我的第八 學生在課堂上。 1062 00:46:51,450 --> 00:46:52,940 但這個符號是新的。 1063 00:46:52,940 --> 00:46:56,320 到現在為止,我們已經不能用點, 至少在這樣的代碼。 1064 00:46:56,320 --> 00:47:01,490 這意味著結構被稱為 一個學生,把東西放在那裡。 1065 00:47:01,490 --> 00:47:05,670 同樣,在這下一行,31日去 來吧,把任何用戶類型 1066 00:47:05,670 --> 00:47:10,530 這裡的名字,為他們做什麼 房子,同樣的事情,繼續前進, 1067 00:47:10,530 --> 00:47:13,230 把它的房子。 1068 00:47:13,230 --> 00:47:15,955 >> 那麼,這是什麼節目 最終怎麼辦? 1069 00:47:15,955 --> 00:47:17,220 你可以看到有一點點傳情。 1070 00:47:17,220 --> 00:47:24,780 讓我繼續前進,做結構0 斜線結構,學生的ID 1 0點, 1071 00:47:24,780 --> 00:47:28,250 大衛·馬瑟說,學生證2。 1072 00:47:28,250 --> 00:47:32,070 羅布·柯克蘭,學生證3。 1073 00:47:32,070 --> 00:47:35,010 勞倫Leverit - 1074 00:47:35,010 --> 00:47:38,380 而唯一做這個程序, 這只是完全是任意的, 1075 00:47:38,380 --> 00:47:40,980 我想,做一些與此數據, 現在,我已經教我們如何 1076 00:47:40,980 --> 00:47:43,450 使用結構,是我剛 這個額外的循環。 1077 00:47:43,450 --> 00:47:45,260 我遍歷數組的學生。 1078 00:47:45,260 --> 00:47:49,170 我用了我們,也許是現在熟悉的朋友, 字符串比較,stircomp 1079 00:47:49,170 --> 00:47:53,780 檢查第八屆學生的家 等於奧美? 1080 00:47:53,780 --> 00:47:56,760 如果是這樣,只是打印的東西 隨意想,是的,它是。 1081 00:47:56,760 --> 00:47:59,430 但同樣,只要給我機會 使用和重用, 1082 00:47:59,430 --> 00:48:02,270 重用這個新的點符號。 1083 00:48:02,270 --> 00:48:03,250 >> 那麼,誰在乎呢,對不對? 1084 00:48:03,250 --> 00:48:06,270 即將與學生程序是 有些武斷,但事實證明, 1085 00:48:06,270 --> 00:48:09,800 我們可以做的有用的東西 這一點,例如,如下所示。 1086 00:48:09,800 --> 00:48:14,600 這是一個更複雜的結構 C.它得到了一打或更多的領域, 1087 00:48:14,600 --> 00:48:15,880 有些若有所思地命名。 1088 00:48:15,880 --> 00:48:20,110 但是,如果你曾經聽說過的一個圖形 稱為位圖文件格式,BMP, 1089 00:48:20,110 --> 00:48:22,830 原來,位圖文件格式 相當多,這看起來像。 1090 00:48:22,830 --> 00:48:24,200 這是一個愚蠢的小笑臉。 1091 00:48:24,200 --> 00:48:27,840 這是一個小的形象,我已經放大 相當大的,所以,我可以看到每個 1092 00:48:27,840 --> 00:48:30,410 的單個點或像素。 1093 00:48:30,410 --> 00:48:33,800 現在,事實證明,我們可以代表一個 黑點,說,數字0。 1094 00:48:33,800 --> 00:48:35,520 和一個白點的數量1。 1095 00:48:35,520 --> 00:48:39,140 >> 所以,換句話說,如果你想畫一個 笑臉,並保存在該圖像 1096 00:48:39,140 --> 00:48:42,680 的計算機,它足以存儲“0”和 那些看起來像這樣的,在那裡, 1097 00:48:42,680 --> 00:48:45,250 再次,那些都是白色的 零是黑色的。 1098 00:48:45,250 --> 00:48:48,290 並在一起,如果你有效 一個網格的1和0,你有一個 1099 00:48:48,290 --> 00:48:51,030 的像素網格,如果你躺在 出來,你有一個可愛的 1100 00:48:51,030 --> 00:48:52,560 小笑臉。 1101 00:48:52,560 --> 00:48:58,150 現在,位圖文件格式,BMP, 有效的引擎蓋下, 1102 00:48:58,150 --> 00:49:00,970 但隨著更多的像素SOT 實際上可以代表顏色。 1103 00:49:00,970 --> 00:49:05,170 >> 但是,當你有更複雜的 如B​​MP,JPEG和GIF文件格式 1104 00:49:05,170 --> 00:49:09,360 你可能熟悉,那些 磁盤上的文件通常不會只 1105 00:49:09,360 --> 00:49:13,760 具有零和一的像素,但 他們有一些元數據,以及 - 1106 00:49:13,760 --> 00:49:16,960 薈萃在這個意義上是不是真的 的數據,但它是非常有用的。 1107 00:49:16,960 --> 00:49:21,370 因此,這些領域的暗示, 我們會看到更詳細的P-集合 1108 00:49:21,370 --> 00:49:25,810 5,前的零點和那些 表示圖像中的像素, 1109 00:49:25,810 --> 00:49:29,110 有一堆的元數據,如 的圖像的大小和 1110 00:49:29,110 --> 00:49:30,250 的圖像的寬度。 1111 00:49:30,250 --> 00:49:32,910 注意到我採摘了一些 任意的東西在這裡 - 1112 00:49:32,910 --> 00:49:34,260 寬度和高度。 1113 00:49:34,260 --> 00:49:36,160 比特數和其他一些東西。 1114 00:49:36,160 --> 00:49:37,840 因此,有一些在一個文件中的元數據。 1115 00:49:37,840 --> 00:49:41,470 >> 但是,通過了解文件規定 在這種方式,實際上,你可以 1116 00:49:41,470 --> 00:49:45,890 然後處理圖像,圖像恢復 從盤面看,調整圖像。 1117 00:49:45,890 --> 00:49:47,560 但是,你可不一定 增強他們。 1118 00:49:47,560 --> 00:49:48,480 我需要的照片。 1119 00:49:48,480 --> 00:49:52,840 於是我又回到這裡到RJ,你看到了誰 前一段時間在屏幕上。 1120 00:49:52,840 --> 00:49:57,160 如果我打開了主題演講,這是 會發生什麼,如果你嘗試放大 1121 00:49:57,160 --> 00:49:59,380 加強RJ。 1122 00:49:59,380 --> 00:50:01,480 他沒有得到任何好轉真的。 1123 00:50:01,480 --> 00:50:06,240 現在的主題是一種模糊它 點點,只是粉飾 1124 00:50:06,240 --> 00:50:11,040 事實上,RJ沒有得到特別 增強,當你放大。 1125 00:50:11,040 --> 00:50:13,310 而且如果這樣做, 看到廣場? 1126 00:50:13,310 --> 00:50:15,490 是的,你絕對可以看到 在投影機上的正方形。 1127 00:50:15,490 --> 00:50:17,690 >> 這是什麼時候,你得到提升。 1128 00:50:17,690 --> 00:50:22,570 但在如何理解我們的RJ或 笑臉的實施將讓我們 1129 00:50:22,570 --> 00:50:24,950 其實寫代碼操縱 這些東西。 1130 00:50:24,950 --> 00:50:29,970 我想我會結束這說明, 55秒的提升的, 1131 00:50:29,970 --> 00:50:31,230 我不敢說,很容易誤導。 1132 00:50:31,230 --> 00:50:32,990 >> [視頻回放] 1133 00:50:32,990 --> 00:50:34,790 >> - 他在說謊。 1134 00:50:34,790 --> 00:50:38,310 關於什麼,我不知道。 1135 00:50:38,310 --> 00:50:41,200 >> 所以我們知道什麼? 1136 00:50:41,200 --> 00:50:45,280 >> 這在9:15雷Santoya 在ATM。 1137 00:50:45,280 --> 00:50:47,830 >> 那麼問題是什麼 他在9:16做? 1138 00:50:47,830 --> 00:50:50,750 >> 拍攝9毫米 的東西。 1139 00:50:50,750 --> 00:50:52,615 也許他看到了狙擊手。 1140 00:50:52,615 --> 00:50:54,760 >> 或與他一起工作。 1141 00:50:54,760 --> 00:50:56,120 >> - 等待。 1142 00:50:56,120 --> 00:50:57,450 回到之一。 1143 00:50:57,450 --> 00:50:58,700 >> 你看到了什麼? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> 把他的臉,全屏。 1146 00:51:09,490 --> 00:51:09,790 >> 他的眼鏡。 1147 00:51:09,790 --> 00:51:11,040 >> 有一種體現。 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -這是Neuvitas的棒球隊。 1150 00:51:23,520 --> 00:51:24,530 這是他們的標誌。 1151 00:51:24,530 --> 00:51:27,040 >> 他說誰 穿著那件夾克。 1152 00:51:27,040 --> 00:51:27,530 >> [END視頻播放] 1153 00:51:27,530 --> 00:51:29,180 >> DAVID J.馬蘭:這將 習題集5。 1154 00:51:29,180 --> 00:51:30,720 我們將看到你下週。 1155 00:51:30,720 --> 00:51:32,330 >> 男揚聲器:在未來CS50。 1156 00:51:32,330 --> 00:51:39,240 >> [蟋蟀的鳴叫] 1157 00:51:39,240 --> 00:51:41,270 >> [音樂播放]