[Powered by Google Translate] [週5] 戴維·J·馬蘭,哈佛大學] 這是CS50。[CS50.TV] [女人]他在說謊的是什麼,我不知道。 [文]因此,我們知道些什麼? [女人] 9時15分,雷Santoya是在ATM。 [文]因此,問題是,什麼是他做的9:16? [女人]拍攝9毫米的東西。 也許他看到了狙擊手。 [文]他與他共事。 [女人]等待。回到一個。 [文]你看到了什麼? [♫懸疑音樂♫] [女人]把他的臉。全屏。 [文]他的眼鏡。 >>共有的一種體現。 [♫懸疑音樂♫] [文]這是在Nuevita的棒球隊。這是他們的標誌。 [女人]他在說給誰穿的那件夾克。 [大衛·馬蘭]所以,這是CS50 5週,而今天我們為你毀了一個位電視和電影。 所以,每當你看像這樣的在這裡表演, 警察說:“你能不能清理一下?”或“增強” 有沒有提高在現實世界中。 事實上,你真正得到的是這樣一個小東西。 我把從頁面的員工照片之一。 這是一個被稱為Photoshop的。這是1 2 Bowdens 1 3 Bowdens實際上,今天,是因為我們有夫人波頓這裡,Rob和保羅。 但這裡是搶在屏幕上,如果我們放大上,閃閃發光,他總是有他的眼睛, 你看到的就是你所看到的就是你得到的。 這是“增強”,因此“CSI”有點不對勁。 還有另外一個片段,如果我們可以選擇“CSI”只是一點點的時間。 這是一個很好的短語,從今以後,如果你想說出 完善的技術的時候,真的與你的朋友,你是說絕對沒有。 [文]幾個星期以來,我一直在調查的馬車夫的殺手謀殺 具有一定的病態的迷戀。 [女人#1]這是實時的。 [女人]我使用Visual Basic創建一個GUI界面,看看我是否能跟踪一個IP地址。 [馬蘭]音頻不同步一旁,創建一個GUI界面,使用Visual Basic 跟踪一個IP地址是完全荒謬的。 這些日子裡,你將不能使用Visual Basic, 有沒有需要一個圖形用戶界面,IP地址是一個技術上準確的術語。 因此,保持一個眼睛,對於這些,我的最愛之一: 這其中的多了幾分神秘的,因為你需要知道不同的語言。 有一種語言叫Objective-C中,這是一個C的超集 這意味著它的C加上一些額外的功能,其中包括面向對象的編程。 這是語言,蘋果已經為iOS編程推廣。 因此,這裡是一個片段從一個完全不同的節目,從“數字” 其實,如果你仔細看你的TiVo和暫停在適當的時候, 你會看到,他們想要的東西是不太所描述的是什麼。 讓我嘗試不同的音頻連接器,看看如果我們不能 保持音頻的同步時間。 我給你的“數字”。 [文#1]這是一個32位的IPv4地址。 [文2]的IP地址,這是互聯網。 >>專用網絡。這是梅艷芳的專用網絡。 [馬蘭]好吧。這是Objective-C,這是一些孩子的著色方案, 你或許可以推斷出變量的名稱。 這樣,那麼,“數字”。所以我們今天和本週介紹 取證和背景的問題,因此世界上的一點點。 今天將是一個簡短的演講,因為在這裡有一個特殊的事件 之後,我們將採取偷看,和逗學生和家長的一致好評今天 一些的東西,是在地平線上。 其中,截至週一,你將有一些更多的同學。 EDX,哈佛和MITS新的在線主動開放課件 多,正在啟動(星期一)在哈佛的校園。 這意味著前來週一,你將有 - 如最近的一次統計, 86,000額外的同學也將會跟隨著CS50的演講 和部分演練和習題集。 作為這項工作的一部分,你會成為會員的首屆類 CS50和現在CS50x。 作為其中的一部分,現在,意識到,會有一些不相上下以及。 要為此做好準備,對於數量龐大的學生, 可以肯定地說,即使我們有108個轉錄因子和CA, 不太最好的學生/教師比例後,我們打80000其他學生。 因此,我們不會被分級這麼多的問題,手動設置。 所以,本週推出的習題集將是CS50檢查, 這將是一個命令行實用程序在設備 一次,你會得到你以後更新本週末, ,你就可以運行一個命令,檢查50 在您自身的pset中,你會得到一些反饋,為您的程序是否 正確的或不正確的,根據我們所提供的各種設計規範。 因此,更多的問題設定的規範和 CS50x同學們將利用這一點。 所以,問題設置4個是所有約取證。 這件作品的靈感來自一些真實的東西, 由此,當我在讀研究生,我實習一段時間, 米德爾塞克斯郡的地區檢察官辦公室從事法醫工作 他們的領導取證調查,這為 ,我想我提到的幾個星期過去,是質量國家警察或其他 會來的,他們會脫落的東西,如硬盤驅動器和光盤和軟盤 等,然後取證辦公室的目標是,以確定是否 有或沒有某種形式的證據。 這是特別調查組,所以它是白領犯罪, 更令人不安的是排序的犯罪, 什麼涉及某種數字媒體;原來,沒有那麼多的人 寫一封電子郵件說:“我做到了。” 所以,很多時候,這些取證搜索沒有打開所有的東西,水果, 但有時人們會寫這樣的郵件。 所以有時的努力得到了回報。 但是,得出了這個法醫pset中,我們將介紹在pset中4位的圖形。 所以,你可能把這些東西是理所當然的,JPEG格式,GIF和像這些天, 但如果你真的仔細想想,圖像,就像羅布的臉, 可以建模為一個序列的點,或像素。 現在,在羅布的臉的情況下,有各種顏色, 我們開始看到的各個點,otherwide稱為像素, 一旦我們開始放大。 但是,如果我們簡化了這個世界變得,只是說,這裡是Rob 在黑色和白色,代表黑色和白色,我們可以只使用二進制文件。 如果我們要使用二進制的1或0,我們可以表達這種相同的圖像 Rob的笑臉這種模式位:11000011表示 白,白,黑,黑,黑,黑,白白。 因此,這不是一個巨大的飛躍,然後,開始談論精美圖片。 的東西,你會看到在Facebook或用數碼相機, 但肯定的是,當涉及到顏色,你需要更多的比特。 在世界上的照片相當普遍的是使用1位顏色, 因為這建議,但24位色,你實際上得到數百萬種顏色。 因此,作為的情況下,當我們放大羅布的眼睛上, 這是任何數以百萬計的不同顏色的可能性。 因此,我們就為大家介紹這方面的問題集4以及在演練中, 這將是今天下午3:30,而不是平常的下午2時30分,因為上週五的演講在這裡。 但視頻是在線的,像往常一樣,明天。 我們還將為您介紹另一種文件格式。 因此,這是故意為了看起來嚇人, 但是,這僅僅是一些文件的C結構。 事實證明,微軟,幾年前,捧紅了這種格式, 被稱為位圖文件格式,BMP,這是一個超級簡單的, 豐富多彩的圖形文件格式,使用相當長的一段時間 有時仍然在桌面上的壁紙。 如果你覺得回到了Windows XP和綿延的群山和蔚藍的天空, 這是典型的一個BMP位圖圖像,位圖 是我們的樂趣,因為他們有了更多的複雜性。 這不是一件簡單的事情,因為這格的0和1的; 代替,你必須像一個頭在一個文件的開始的東西。 所以,換句話說,裡面的。bmp文件是0和1的一大堆, 但有一些額外的0和1的在那裡。 而事實證明,我們可能已經多年理所當然的, doc或xls或。MP3或MP4的文件格式,如, 任何你熟悉的文件格式。 那麼,是什麼它甚至意味著是一個文件格式? 因為在一天結束的時候,我們使用所有這些文件都只是0和1的 也許那些0和1的代表,乙,丙,通過ASCII或等, 但通過一天結束的時候,它只是0和1。 因此,人類只是偶爾決定發明一種新的文件格式 他們規範的位模式,實際上的意思。 在這種情況下,這裡的人誰設計的位圖文件格式 說,在第一個字節中的位圖文件,並標示為偏移0,在那裡, 將是一些神秘命名的變量稱為bfType, 這只是代表了位圖文件的類型,這是什麼類型的位圖文件。 你可以推斷出,或許,從第二排,偏移量為2,第2字節數 有圖案的0和1組成的,代表什麼嗎? 事物的大小,它從那裡。 因此,問題集4中,你會走過一些事情。 我們不會關心所有的人,但是請注意,它開始變得有趣 周圍線或54字節,rgbtBlue,綠色和紅色。 如果你聽說過的縮寫,RGB,紅,綠,藍,這是一個參考。 因為事實證明,你可以畫的彩虹的所有顏色 與紅色,藍色和綠色的某種組合。 而且,事實上,在房間裡的父母可能還記得最早的投影機。 這些天,你只看到1個明亮的光出來的一個鏡頭。 但是,早在一天,你有紅色的鏡片,藍色鏡片,綠色鏡片 和他們一起旨在在屏幕上,並形成了豐富多彩的畫面。 經常中學和高中有那些鏡頭 不斷稍微歪斜,所以你看到雙重或三重影像, 但他的想法。你有紅色,綠色和藍色光畫一幅畫。 在電腦上使用相同的原則。 因此,當中的挑戰,那麼,你在問題設置4 將要幾件事情,一個是調整圖像的大小。 要採取的圖案中的0和1, 找出結構中的這樣的塊0和1的代表, 然後找出如何複製像素的紅色,藍色,果嶺 內,這樣當最初的圖片看起來是這樣的,可能是這樣的,而不是之後。 在其他的挑戰,也將是你會交由 法醫的形象,一個實際的文件從數碼相機 ,相機,曾幾何時,一大堆的照片。 問題是,我們不小心刪除或有圖像損壞,不知何故。 數碼相機,不好的事情發生,所以我們很快就複製了所有的0和1的 關閉該卡給你,救了他們一大的文件,然後我們會交給你 在問題設置,讓您可以寫一個程序在C恢復 所有這些JPEG文件,最好。 而事實證明,JPEG文件,即使它們是有點複雜的文件格式, 他們要複雜得多,這笑臉。 事實證明,每一個JPEG相同的模式0和1的開始。 因此,使用一個while循環或循環或類似的, 你可以遍歷所有的0和1這法醫圖像 每次你看到的問題集的規範中定義的特殊模式, 你可以假設,“哦,這裡是具有非常高的概率, 開始的JPEG,只要你找到相同的模式, 一定數目的字節或千字節或兆字節後, 你可以假設,“哦!這是第二個JPEG的照片後,我把第一個。 讓我停止閱讀,第一個文件,開始寫這個新的。“ 你的程序的pset 4的輸出將是多達50個JPEG文件。 而且,如果它不是50 JPEG文件,你有一點的循環。 如果你有無限多的JPEG文件,你有一個無限循環。 這樣一來,也將是一個相當普遍的情況。 這是在地平線上。 測驗0,在我們背後。實現的,按我的電子郵件,總是有鄉親 誰是既高興,排序中性,和傷心周圍測驗0時。 請你拿出來給我,頭轉錄因子,Zamyla,你自己的TF 的CA,你知道,如果你想討論如何去。 因此,要在這裡留下深刻印象的父母在房間裡, 是CS50庫?幹得好。 的CS50庫?是嗎? [學生回答,不知所云] >>好,好。所以這是一個預先寫好的代碼集,我們的工作人員,寫, 我們提供給你,提供一些常用的功能。 的東西,如給我一個字符串,讓我一個int,此處列出的所有的功能。 從現在起,我們開始真正把這些訓練車輪。 因此,我們要開始你帶走一個“字符串”, 其中,召回,只是一個代名詞什麼實際的數據類型嗎?的char *。 因此,對於家長,這很可能是 - 這是很好的,這樣的char *,我們將開始看到 在屏幕上,更因為我們從我們的詞彙中刪除“字符串”, 至少當涉及到實際編寫代碼。 同樣,我們將停止使用其中的一些功能多, 因為我們的計劃是要變得更加複雜 而不是僅僅寫一個提示,閃爍坐在那裡, 等待用戶輸入一些東西英寸 你會得到你的輸入來自其他地方。 例如,你會得到他們的本地硬盤驅動器上的一系列位。 相反,你會得到他們在未來的網絡連接,一些網站的某個地方。 因此,讓我們剝開這層第一次,並拉起CS50家電 這稱為CS50.h的文件,你已經尖銳包括好幾個星期。 但是,讓我們看到這裡面有什麼。 因此,頂藍色的文件僅僅是一大堆的意見, 保修信息和許可。這是一個共同的範式 軟件,因為很多軟件,這些天是所謂的“開放源碼” 這意味著有人已經寫好的代碼 和自由,而不是僅僅運行和使用, 但實際上讀取和改變,並融入自己的工作。 所以,這就是你一直在使用,開放源代碼軟件, 儘管在一個非常小的形式。 不過,如果我向下滾動過去的意見,我們將開始看到一些比較熟悉的東西。 因此,注意到這裡的頂部,CS50.h文件包括一大堆的頭文件。 現在,這些我們都沒有見過,但一個是 熟悉的,這些我們看到,儘管是短暫的,迄今? 是的,標準庫。 stdlib.h中的malloc, 所以一旦我們開始談論動態內存分配, 我們會回來下週開始,包括該文件。 事實證明,布爾和真假實際上並不存在,在C,本身, 除非你有這個文件在這裡。 因此,我們有好幾個星期,得到了包括標準bool.h 這樣,您可以使用這個概念的一個布爾值,true或false。 沒有這一點,你就必須假的排序,並使用int 只是任意假設0是假的,1是真實的。 現在,如果我們繼續向下滾動,在這裡我們定義一個字符串。 事實證明,正如我們之前所說的,,*其實並不重要。 你甚至可以有空間的限制。 這學期,我們一直在推動它,因為這明確指出,*與類型。 但要意識到,就像常見的,如果沒有一點更常見的,是把它放在那裡 但在功能上是一樣的東西。 但是現在,如果我們讀到進一步下降,讓我們來看看在說,調用getInt, 因為我們使用的是,也許,先天下之憂這個學期。 這裡是調用getInt。這是什麼? 這是原型。所以很多時候,我們已經把原型在我們的頂部。c文件, 但你也可以把原型的頭文件,。h文件, 像這樣的在這裡,所以,當你寫的一些功能 你希望其他人能夠使用,這是​​完全相同的情況下,的CS50庫, 你不僅實現你的功能的東西像CS50.c, 也把原型而不是在該文件的頂部,但在一個頭文件的頂部, 然後,頭文件是什麼樣的朋友和同事,包括, 用鋒利的,包括在自己的代碼。 因此,所有這時候你已經包括所有這些原型 有效地在文件的開頭,但這種尖銳的方式,包括機制 到,從本質上說,這個文件複製和粘貼到您自己的。 現在,這裡是一些比較詳細的文檔。 我們幾乎是理所當然的調用getInt得到一個int, 但事實證明,有一些角落的情況下,對不對? 如果用戶鍵入的數字太大了嗎? 一個三次方,就不能裝進一個int? 什麼是預期的行為嗎?那麼,理想的情況下,這是可預見的。 因此,在這種情況下,如果你真正閱讀印刷精美, 你會看到,如果該行不能被讀取,則返回INT_MAX。 我們從來沒有提到這一點,但其資本額的基礎上, 它是什麼,可能嗎? 這是一個常數,所以它的一些特殊常量,可能宣布 了更高的文件中的這些頭文件之一, INT_MAX可能是類似的東西,大約2億美元。 的想法是,因為我們需要以某種方式表明的東西出了問題, 是的,我們有我們所掌握的4十億的數字, 負2億美元至2億美元,給予或採取。 那麼,什麼是常見的編程是你偷這些數字。 也許0,也許2十億,也許負2億美元。 所以你用一個可能的值,這樣就可以提交到世界 ,如果出現錯誤,我會回到這個超級大的價值。 但你不希望用戶輸入諸如“2,3,4神秘的東西......” 非常大的數字,在那裡你概括,而不是為一個常數。 所以,真的,如果你是肛門過去的幾個星期中, 任何時候,你調用調用getInt,你應該已經檢查的,如果條件。 做了用戶在INT_MAX類型,或者更具體地說, 調用getInt返回INT_MAX?因為如果它這樣做, 實際上意味著他們沒有輸入,在這種情況下,出現了錯誤。 因此,這是通常被稱為一個“哨兵”的價值,這只是意味著什麼。 好了,現在讓我們來打開的。c文件。 C文件已經存在了一段時間的家電, ,事實上,該設備具有預編譯為你 到那個東西我們稱之為“目標代碼” 但它只是對你重要,那是因為系統知道, 在這種情況下,它的位置,該設備。 但是,讓我們現在向下滾動到調用getInt,看看如何調用getInt一直在這麼長的時間。 所以,在這裡,我們從之前也有類似的評論。 讓我放大的代碼部分, 我們調用getInt如下。 它沒有輸入和返回一個int,而(真),所以我們有一個故意的無限循環 但是,據推測,我們將打破這個不知何故,或返回在此。 因此,讓我們來看看它是如何工作的。那麼,我們似乎可以使用GetString 在這第一行內循環,166。 現在,這是很好的做法,因為在什麼樣的情況下, 可能的GetString返回這個特殊的關鍵字,NULL嗎? 如果出現錯誤。什麼可能出問題,當你調用類似的GetString? 是嗎? [學生回答,不知所云] >>呀。因此,也許malloc失敗。 引擎蓋下方的GetString調用malloc, 它分配內存,這使得計算機存儲 所有的字符,進入鍵盤的用戶類型。 假設用戶有一大堆的空閒時間 和類型化的,例如,超過2十億字符。 甚至有更多的字符比計算機RAM。 是,GetString能夠以表示對你, 即使這是一個超級,超級罕見的角落的情況。 它以某種方式來處理這個問題,所以GetString的, 如果我們回過頭來閱讀其說明文件,不,其實,返回NULL。 現在,如果GetString的失敗,返回NULL,調用getInt是要失敗的 返回INT_MAX,就像一個哨兵。 這些都只是人的約定。只有這樣,你會知道這是 是通過閱讀文檔。 因此,讓我們向下滾動到的詮釋其實是GotInt的地方。 所以,如果我向下滾動位,在170行,我們有意見,以上這些線路。 因此,我們宣布,在172,一個int n和一個字符c,那麼這個新功能 你們中的一些偶然發現之前,但sscanf的。 這代表字符串掃描f。 換句話說,給我一個字符串,我將掃描件信息感興趣。 那麼,是什麼意思呢?好吧,假設我在鍵盤上輸入,從字面上看,1 2 3, 並按下回車鍵。 1 2 3時,由GetString返回的數據類型是什麼? 這顯然是一個字符串,對不對?我有一個字符串,所以1 2 3是真的“1 2 3” \ 0在它的結束。這不是一個整數。 這不是一個數字。它看起來像一個數字,但它實際上不是。 那麼,是什麼調用getInt有什麼關係?它具有從左向右掃描該字符串, 1 2 3 \ 0,並以某種方式將其轉換為一個實際的整數。 現在,你可以找出如何做到這一點。 如果你覺得回到了pset中2,你大概有一點點舒適 與凱撒的vigenere,這樣你就可以遍歷字符串, 你可以將字符轉換成整數與挑。這是一個大量的工作。 sscanf的,做一個這樣的函數,你為什麼不叫? 因此,sscanf的預計參數,在這種情況下,所謂的線,這是一個字符串。 然後,您可以指定,在引號中,非常類似於printf, 在此字符串你希望看到什麼? 我在這裡說的是什麼,我希望看到一個十進制數,也許一個字符。 我們會看到為什麼是這樣的情況下,在短短的時刻。 事實證明,這個符號是回憶的東西 我們開始談論了一個多星期前。 什麼是&N&C為我們做嗎? [學生回答,不知所云] >>呀。它給我的地址n和c的地址。 那麼,為什麼那麼重要嗎?嗯,你知道,在C函數 你總是可以返回一個值或沒有價值。 您可以返回一個int,一個字符串,一個浮子,一個字符,不管。 或者你也可以返回void,但你只能返回1最大限度。 但在這裡我們要sscanf的我,也許返回一個int,一個十進制數, 和一個字符,在某一時刻,我會解釋為什麼字符。 因此,您可以有效地希望F返回兩件事情,這是不可能的C. 所以,你可以解決的,通過在2個地址, 因為只要你交給一個功能,2個地址,該功能可以與他們做嗎? 它可以寫入到這些地址。您可以使用*操作和“走出去”,每個地址。 這是這個後門的機制,但很常見的改變變量的值 在超過僅有1的地方,在這種情況下,2。 現在,請注意我檢查==比1,然後返回n如果這樣做,其實,計算結果為true。 所以,這是怎麼回事呢?那麼,在技術上,我們真的要發生在調用getInt是這樣的。 我們要分析,可以這麼說,我們要讀取的字符串 “1 2 3”,如果它看起來像有一些有, 我們告訴sscanf的做的就是把這個數字,1 2 3,在我這個變量n。 那麼,為什麼我有這樣的好了嗎? 也說,sscanf的,你也可能會得到一個字符,在這裡的作用是什麼。 學生來說,不知所云] >> - 一個小數點工作。 讓我們認為,想了一會兒。還有什麼呢? [學生,不知所云] >>因此,良好的思想,它可能是NULL字符。 它實際上不是,在這種情況下。是嗎? [學生,不知所云] >> ASCII。或者,讓我進一步概括。 %c有錯誤檢查。 我們不希望有字符數後, 但讓​​我做的是以下幾點: 事實證明,sscanf的,除了存儲在n和c的值,在這個例子中在這裡, 什麼也沒有返回的變量值英寸 所以,如果你只輸入1 2 3,%d是要匹配 只有n被存儲像1 2 3的值,都不會在c; C保持一個垃圾值,可以這麼說。 垃圾,因為它從來沒有被初始化為一定的價值。 因此,在這種情況下,sscanf的返回1,因為我填充這些指針之一, 在這種情況下,太棒了。我有一個int,所以我釋放線釋放內存 其實GetString的分配,然後我返回n。 否則,如果你有沒有想過,重試語句,就是這裡。 如果相反,I型1 2 3富, 只是一些隨機序列的文本,,sscanf的是要看到, 哦,數量,哦,數量,哦,數量,噢 - F。 它打算把1 2 3在n。 這將放置在f中的c,然後返回2。 因此,我們有,只是用scanf函數的行為的基本定義, 一個非常簡單的方法 - 乍一看,複雜的,但在一天結束的時候, 機制相當簡單的說,是有一個int,如果有的話,那件事,我發現嗎? 這裡的空白是故意的。如果你讀的文檔sscanf的, 它會告訴你,如果你有一塊空白的開始或結束, sscanf的也將允許用戶,無論出於何種原因,打空格鍵1 2 3,,這將是合法的。 只是因為他們打的開頭或結尾的空格鍵,它不會在用戶嚷嚷, 這只是一個小更方便用戶使用。 有任何疑問的話,就GetInts?是嗎? [學生提問,不知所云] >>很好的問題。什麼,如果你剛才輸入的一個字符,如f和命中輸入 沒有輸入1 2 3,你怎麼看這行代碼的行為,然後呢? ,所以sscanf的覆蓋太多,因為在這種情況下, 它不會以填補N或C,這是怎麼回事,而不是返回0。 在這種情況下,我也趕上那種情況下,我想是因為預期值1。 我只希望,只有1個東西來填補。這個問題問得好。其他人嗎? 好吧,讓我們不要去所有的功能在這裡, 但,這似乎是,也許,餘下​​權益 GetString的,因為它把GetFloat,調用getInt GetDouble,GetLongLong所有平底船了很多的功能,GetString的,。 因此,讓我們來看看他是如何在這裡實現。 這一個看起來有點複雜,但它使用相同的基本原理 我們開始談論上週。因此,在GetString時, 它沒有參數,在這裡,每虛空 和它返回一個字符串,所以我聲明了一個字符串緩衝。 我真的不知道那是什麼要用於還,但我們會看到。 看起來像容量,默認情況下,0不太清楚這是怎麼回事。 不知道N的將要用於還。 但現在變得更有趣一些,所以在243, 我們聲明了一個int C,這是一個愚蠢的細節。 char是8位,8位可以存儲多少不同的值嗎? 256。現在的問題是,如果你想有256個不同的ASCII字符, 有,如果你想回來,這是不是記住。 但是,如果你覺得回到了那個大的ASCII圖表,我們有幾個星期前, 有,在這種情況下,128個或256個ASCII字符。 我們使用的所有模式0和1的。 這是一個問題,如果你想成為能夠檢測到一個錯誤。 因為如果你已經使用了256個值,為你的角色, 你真的不提前計劃,因為現在你也沒有辦法說, “這是不是一個合法的字符,這是一些錯誤的信息。” 因此,世界的是,他們使用的下一個最大的價值, 像int的東西,讓你有一個瘋狂的數位, 32 4億可能的值,這樣你可以簡單地結束了, 基本上,257,1其中有一些特殊的含義為錯誤。 因此,讓我們來看看它是如何工作的。在246行,我有這樣大的while循環 正在調用fgetc函數F含義文件,GETC,然後標準輸入。 原來,這只是說:“從鍵盤讀取輸入更精確的方法。” 標準輸入方式鍵盤,標準輸出屏幕, 和標準錯誤,我們會看到在pset中,是指在屏幕上, 而是一種特殊的屏幕部分,因此,它不是混為一談 與實際輸出,你打算打印,但更多的是在未來。 因此fgetc函數從鍵盤讀取一個字符,並將其存儲在那裡? 將它保存在c,然後檢查,所以我只是在這裡使用一些布爾連詞, 檢查它不等於\ n,所以用戶按下回車鍵。 我們要停止在這一點上,在循環結束,我們還需要檢查 特殊常量,EOF,如果你知道或猜測 - 什麼是代表? 文件結尾。因此,這是一種荒謬的,因為如果我在鍵盤上打字, 真的沒有參與這一​​文件, 但是,這僅僅是排序的通用術語,用來指 ,沒有別的來自人類的手指。 EOF。文件結尾。 順便說一句,如果你曾經打你的鍵盤,控制D 不是說你還沒有,你已經打了控制C。 但是,控制D發送這個特殊的常數,稱為EOF。 所以,現在我們只是有一些動態內存分配。 因此,如果n + 1>的能力,現在我將解釋N。 n是目前究竟有多少字節在緩衝區中, 你目前正在建設的字符串從用戶。 如果你有比你有更多的字符在緩衝區中的緩衝能力, 直觀地,我們需要做的,然後被分配更多的容量。 我要掠過的算術 只注重這個功能。 你知道的malloc的是,或者至少是一般熟悉。 什麼realloc的猜測。 [學生回答,不知所云] >>呀。 ,它不是很新增記憶體,它重新分配內存,例如: 如果在字符串的結尾還是有空間,該內存以使您更 比原來給你,然後你會得到額外的內存。 所以,你可以把字符串的字符背靠背背靠背。 但如果不是這樣的話,因為你等太久 和一些隨機得到了一屁股到內存中,但有額外的 記憶到這裡,那也沒關係。 realloc是要為你做所有的繁重, 移動您已經閱讀因而在離這裡不遠的字符串, 愛不釋手,然後給你一些更多的在這一點上跑道。 因此,一揮手,讓我說,是做什麼的GetString 是它的一個小緩衝區,也許單個字符開始, 如果在2個字符的用戶類型,GetString的結束 調用realloc和說:“噢,1個字符是不夠的。 給我2個字符。然後,如果你讀通過的邏輯循環, 它會說,'噢,用戶輸入3個字符。 現在給我,而不是2 4個字符,然後給我8,然後給我16位和32位。“ 事實上,我的能力增加一倍 意味著,緩衝區不會生長緩慢。 這是怎麼回事增長超級快,那可能是什麼優勢? 為什麼我加倍的緩衝區的大小,即使該用戶 可能只需要1個額外的字符從鍵盤嗎? [學生回答,不知所云]。 >>那是什麼? 沒錯。您不必經常增長。 而這僅僅是一個怎樣的 - 你們在這裡對沖你的賭注。 的想法是,你不希望調用realloc的有很多,因為它往往是緩慢的。 任何時候,你問的操作系統的內存,你很快就會看到 在未來的習題集,它往往需要一定的時間。 因此,最大限度地減少,大量的時間,即使你浪費了一些空間,往往是一件好事。 但是,如果我們在這裡讀通過的最後部分,GetString的, 再次,了解這裡的每一行是不那麼重要的今天。 但是請注意,它最終會再次調用malloc,它分配 一樣多的字節,因為它需要的字符串 然後扔掉,過大的緩衝區,通過調用free 如果它確實得到了太多的時間翻了一倍。 總之,這是多麼的GetString已工作時間。 它的作用是讀取一個字符時,一而再,再而三 而每次需要一些額外的內存,它要求它的操作系統通過調用realloc的。 有什麼問題嗎?好的。 的攻擊。現在,我們理解指針,或至少 越來越熟悉的指針, 讓我們考慮如何在整個世界開始崩潰 如果你不太捍衛對對抗性用戶, 人誰試圖攻入你的系統。 誰是試圖竊取您的軟件繞過一些註冊碼 否則,他們可能有輸入英寸 看一看在這個例子中,這僅僅是C代碼 的底部,有一個main函數的調用函數foo, 又是什麼呢傳遞給foo? [學生]:一個參數。 >>單參數。所以的argv [1],這意味著用戶鍵入的第一個字 在命令行後a.out或其他程序調用。 所以foo的頂部,需要一個char *,但char *是什麼? 字符串。這裡沒有什麼新的,而該字符串是任意被稱為酒吧。 在這裡,字符c [12],半技術英語的排序,這條線是在做什麼? 陣列 - ?字符。給我一個陣列為12個字符。 因此,我們可以稱之為一個緩衝。它在技術上被稱為C,但程序中的緩衝區 只是指一些空間,你可以把一些東西英寸 然後最後,memcpy的,我們還沒有使用過的。 但是,你可能已經猜到它做什麼。它的內存複製。 它有什麼作用呢?那麼,它顯然複製酒吧,它的輸入,轉換成C, 但只有到酒吧的長度。 但有一個錯誤在這裡。 好了,所以在技術上我們確實應該做的strlen(酒吧)x sizeof(char)的的,這是正確的。 但是,在最壞的情況下,在這裡,讓我們假設that's - 所以,沒關係。 然後有2個錯誤。所以sizeof(char)的的,所有的權利,讓我們使這一點更廣泛。 所以現在仍然是一個錯誤,這是什麼? [學生回答,不知所云] >>檢查是為了什麼?好了,我們應該檢查 為NULL,因為不好的事情發生時,你的指針為NULL, 因為你可能去那裡,你永遠不應該為NULL 提領*操作符。 所以這是很好的,我們在做什麼?在邏輯上有一個缺陷。 [學生回答,不知所云] >>因此,檢查如果ARGC≥2,? 好了,所以有3這個程序中的錯誤。 我們不檢查,如果用戶實際上在什麼到argv [1],良好的輸入。 那麼什麼是第三個錯誤嗎?是嗎? [學生回答,不知所云] >>好。 所以,我們檢查了一個情景。隱式檢查,請不要複製更多的內存 比超過該長度的酒吧。 因此,如果字符串用戶輸入的長度為10個字符, 這是說,“僅複製10個字符。 這沒關係,但如果用戶在提示符下鍵入一個字 像一個20個字符的字,這是,,說複製20個字符,從酒吧到什麼? C,否則被稱為我們的緩衝區,這意味著你只是寫數據 8個字節,你沒有自己的位置, 你並不擁有它們在這個意義上,你永遠不分配。 因此,這是一般被稱為緩衝區溢出攻擊, 或緩衝區溢出攻擊,和它的攻擊在這個意義上,如果用戶 或調用你的函數的程序是這樣做的惡意, 到底發生了什麼,未來可能會相當糟糕。 讓我們來看看這張圖片在這裡。 此圖片代表你的內存堆棧。 回想一下,每次你調用一個函數, 你這個小幀在堆棧上,然後再然後另一個。 到目前為止,我們已經只是一種抽象為矩形 要么有在黑板上,或在屏幕上這裡。 但是,如果我們這些矩形中的一個放大, 當你調用一個函數foo,它的出現,更重要的是在棧上 該框架和該矩形內 比是x和y,a和b,就像我們談論交換。 事實證明,有一些較低層次的細節, 在他們返回地址。 因此,原來當主調用foo,主要有告知富 主要是在計算機的內存中的地址。 因為如果不這樣,盡快為foo執行,在這種情況下,這裡, 一旦你達到這種緊密的大括號結束時的foo, 如何赫克富不知道程序的控制,應該去嗎? 事實證明,這個問題的答案是在這裡,紅色的矩形。 這是一個指針,它是電腦存儲,暫時的, 所謂的堆疊上的主地址,以便盡快為foo執行完成, 電腦知道在哪裡和什麼線主要回去。 保存的幀指針與此類似。 CHAR *酒吧代表著什麼? 好了,現在這個藍色的部分是foo的框架,是吧? 好了,所以酒吧是參數的函數foo。 所以現在我們又回到了熟悉的畫面。 還有更多的東西,並在屏幕上的干擾 但這種淡藍色的部分是什麼,我們已經畫在黑板上的東西一樣交換。 這是框架為foo和唯一的,現在是酒吧, 這是此參數。 還有什麼應該是在堆棧中,根據此代碼在這裡? 字符c [12]。因此,我們也應該看到12廣場的內存, 分配給一個變量名為c。 而事實上,我們也有在屏幕上。 最頂端的是c [0],然後這張圖的作者 沒有理會繪製所有的平方,但確實有12有 因為,如果你看一下在右下角,C [11],如果算上從0開始,是12個這樣的字節。 但這裡有一個問題:在哪個方向是C成長? 排序的自上而下的,對不對?如果它的頂部開始,並生長至底部, 並不像我們給自己多跑道在這裡。 我們畫種自己陷入了困境, C [11]是正確的,對吧,這是對堆棧幀指針, 這是對返回地址,有沒有更多的空間。 那麼,有什麼含義,那麼,如果你搞砸了, 您嘗試讀取20字節到12個字節的緩衝區? 這8個額外的字節哪裡去了? 一切裡面,其中有一些是超級重要的。 和最重要的事情,可能是那裡的​​紅色方塊,將返回地址。 因為假設你是個意外或adversarially 覆蓋這4個字節,該指針的地址, 不只是用垃圾,但有一些發生在內存中代表一個實際地址? 什麼是implicaiton,邏輯嗎? [學生回答,不知所云] >>沒錯。當foo返回 命中,大括號,程序將繼續返回到主, 它會返回的地址是在這紅色框。 ,規避軟件登記的情況下, 返回到的地址是什麼是功能 通常被稱為後,你支付的軟件,輸入你的註冊碼? 你可以到這裡不打算的絕招計算機排序,而是,在這裡。 或者,如果你真的很聰明,對手實際上可以輸入在鍵盤上, 例如,而不是實際的單詞,而不是20個字符,但假設他或她 某些字符表示代碼的類型嗎? 它不會是C代碼,這將是字符 的表示二進制機器代碼,0和1的。 但是,假如他們很聰明足以做到這一點,以某種方式粘貼到的GetString提示 的東西,本質上是編譯後的代碼, 最後4個字節覆蓋了返回地址,地址的輸入做呢? 它存儲在這個紅色矩形的緩衝區的第一個字節的地址。 所以,你必須是真聰明,這是一個很大的試驗和錯誤 不好的人,但如果你能弄清楚這個緩衝區有多大, 例如,在輸入最後幾個字節您提供的程序 發生相當於您的緩衝器的起始地址的, 你可以做到這一點。通常情況下,如果我們說,你好,\ 0,也就是在緩衝區。 但是,如果我們更聰明,我們填補了這一緩衝,我們將統稱叫什麼攻擊代碼, A,A,A,A:攻擊,攻擊,攻擊,攻擊,這是只是做了一件壞事。 好了,會發生什麼,如果你真聰明,你可以這樣做: 在這裡的紅色框是一個數字序列:80,CO,35,08。 請注意,相匹配的數字在這裡。 它以相反的順序,但其他一些時間。 請注意,這個返回地址被故意改變 相同的地址,而不是主要的地址。 因此,如果壞傢伙是超級聰明,他或她將要包括在該攻擊代碼 類似的東西,“刪除所有用戶的文件”。 或“複製密碼”或“創建一個用戶帳戶,我可以登錄到”。 任何東西;這是危險的力量C. 因為你必須通過指針存取記憶體 因此,你可以寫任何你想要到一台計算機的內存中。 你可以讓一台計算機做任何你想要的簡單的 跳在其自己的內存空間。 這樣,為了這一天,讓許多計劃和這麼多的網站被攻破 歸結到人趁著這個。 這似乎是一個超級複雜的攻擊, 但它並不總是這種方式開始。 現實情況是,什麼不好的人通常會做的是, 無論它是一個程序,在命令行或GUI程序或網站, 你剛開始提供廢話。 您鍵入一個真正的大詞在搜索字段並按下回車鍵, 你就等著看,如果網站崩潰。 或者,你等著看,如果程序體現了一些錯誤信息。 因為如果你得到幸運的,因為壞人, 您提供一些瘋狂的投入,導致程序崩潰, 這意味著程序員沒有預料到你的錯誤行為 這意味著,有足夠的精力,你或許可以 足夠的試驗和錯誤,找出如何發動更精確的攻擊。 因此,安全的一部分,不只是避免這些攻擊完全,但檢測 實際上是在尋找日誌,看到什麼瘋狂的輸入輸入到你的網站的人。 什麼樣的搜索字詞輸入到您的網站的人一定的緩衝溢出,希望嗎? 而這一切都可以歸結為簡單的基礎知識,什麼是一個數組, 和是什麼意思分配和使用內存? 相關的,也是這樣的。 因此,讓我們只是看了一眼裡面的硬盤驅動器。 所以,你還記得一兩個星期前,當你拖動文件 回收站或垃圾桶,會發生什麼呢? [學生]:沒有。 >>是的,絕對沒有。最後,如果你運行低 Windows或Mac OS的磁盤空間,將開始為您刪除的文件。 但是,如果你拖動的東西在那裡,然後它不是在所有的安全。 你的室友,朋友或家庭成員的所有需要​​做的是雙擊,瞧。 所有的粗略的,您嘗試刪除的文件。 所以我們大多數人至少知道,你必須右擊或控制點擊 清空垃圾桶,或類似的東西。 但即便如此,這並不完全做到的伎倆。 由於發生了什麼,當你有你的硬盤驅動器上的文件 一些word文檔或者一些JPEG? 這代表您的硬盤驅動器,讓我們說這個條子在這裡表示該文件, 它是由0和1的一大堆。 會發生什麼事時,你不僅該文件拖動到垃圾桶或回收站, 但也空嗎? 排序無關。這不是絕對沒有。 現在是什麼都沒有,因為少了一些發生在此表的形式。 因此,有一些種類的數據庫或表內的一台計算機的內存 基本上有1列文件名, 1列文件的位置,這可能是位置123,只是一個隨機數。 因此,我們可能有一些像x.jpg和位置123。 然後會發生什麼,當你清空你的垃圾箱嗎? 這消失。但不會消失的“0”和“1”。 那麼是什麼,然後,連接到PSET 4? 好了,pset的4,只是因為我們不小心刪除 緊湊的閃存卡,所有的這些照片, 或者僅僅因為運氣不好它成為損壞, 並不意味著,在0和1的是不是仍然存在。 也許他們幾個人都失去了,因為有東西損壞 在這個意義上,一些0成為1和1的成為“0”。 不好的事情都可能發生,因為軟件bug或有缺陷的硬件。 但許多這些位,也許甚至達到100%,其中仍然存在, 它只是電腦或相機,不知道去哪裡JPEG 1日開始 和JPEG 2開始,但如果你作為程序員, 知道,有點悟性,這些JPEG文件或它們看起來像什麼, 你可以分析出0和1的,並說,'哦。 JPEG。哦,JPEG。 您可以編寫一個程序基本上只是一個while循環 ,恢復這些文件中的每一個。 因此,教訓的話,是啟動“安全地”刪除文件 如果你想完全避免這種情況。是嗎? [學生提問,不知所云] >>有更多的內存比你以前 - 哦!這個問題問得好。那麼,為什麼,然後,清空垃圾桶後, 你的計算機告訴你,你有更多的自由空間比您以前嗎? 簡單地說,因為它是在撒謊。技術上,你有更多的空間。 因為現在你所說的,你可以把其他的東西,曾經是該文件, 但是,這並不意味著這些位去, 和,這並不意味著位被改變了這一切“0”,例如,為保護您的利益。 與此相反,如果“安全地”擦除文件,或物理破壞的移動設備, 這確實是唯一的辦法,有時,解決這一問題。 那麼,為什麼我們不離開上,半嚇人的,我們將看到你在週一。 CS50.TV