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