[Powered by Google Translate] [Седмица 5] [Дейвид Дж. Малан - Харвардския университет [Това е CS50. - CS50.TV] Това е CS50, Седмица 5. Днес и тази седмица, ще се въведе малко в света на криминалистите в контекста на проблема, 4. Днес ще бъде съкратен лекция, защото тук има специално събитие след това. Така че ние ще вземем един поглед и се закачат на учениците, така и техните родители, така днес с някои от нещата, които са на хоризонта. Сред тях, тъй като от понеделник, ще има още няколко съученици. EDX, Харвард и нова онлайн MIT инициатива за OpenCourseWare и повече, стартира в кампуса на Харвард в понеделник, което означава да дойде понеделник ще има, тъй като на последното преброяване, 86 000 допълнителни съученици , които ще бъдат заедно с лекции и раздели на CS50 и за сваляне и проблемни комплекта. И като част от това, вие ще станете членовете на учредителното клас на CS50 и сега CS50x. Като част от това, осъзнавам, че ще има някои квит, както и. За да се подготвите за това, за огромен брой ученици, е достатъчно да се каже, че въпреки че имаме 108 TFS и CAS, това не е точно най-доброто съотношение ученик-учител, след като удари 80 000 от учениците. Ние не започваш да се класификация на толкова много проблем задава ръчно, така въведе тази седмица в проблема, ще бъде CS50 Проверете, , която ще бъде команден ред в рамките на уреда че вие ​​ще получите, след като го актуализирате по-късно този уикенд. Вие ще бъдете в състояние да стартирате команда, check50, на собствения си pset, и ще получите незабавна обратна връзка за това дали програмата ви е правилно или неправилно според различни спецификации на проекта, които ние сме предвидили. Повече за това в спецификацията проблем набор. На CS50x съученици ще се използва това, както добре. Проблем Комплект 4 е всичко за криминалистите, и тази pset е наистина вдъхновен от някои от реалния живот неща чрез който, когато бях в завършил училище интерниран за известно време с офис Middlesex County окръжен прокурор прави съдебномедицинска работа с преднината си съдебните следователи. Това възлиза на, както мисля, че спомена няколко седмици миналото, е полицията масово държавни или други ще дойдат, те ще паднат неща, като твърди дискове и CD-та и дискети и други подобни, и след това целта на криминалистите офис е да се установи дали е имало или не е доказателство за някакъв вид. Това е специалното звено за разследване, така че е престъпността на белите якички. Това беше по-обезпокоително вид престъпления, каквото и да включва някакъв вид на цифровите медии. Оказва се, че не че много хора пишат имейл с информация, че "аз го направих." Така че доста често, тези криминалистични търсения не се появи чак толкова много плодове, но понякога хората да пишат такива имейли. Така че понякога, усилията бяха възнаградени. Но за да доведе да това съдебно pset, ние ще се въведе в pset4 малко графики. Може би тези неща за даденост - на JPEG, GIF файлове, и други подобни - тези дни. Но ако наистина мислите за него, един образ, подобно на лицето на Роб може да се моделира като поредица от точки или пиксела. В случай на лицето на Роб, има всякакви цветове, и ние започнахме да видите отделните точки, иначе известни като пиксели, след като сме започнали да я увеличите. Но ако ние опростяваме света по-малко и само да кажа, че това тук е Роб в черно и бяло, да представлява черно и бяло, можем просто да използва двоична. И ако ние започваш да се използва двоична, 1 или 0, можем да изразят това едно и също изображение усмихнатото лице на Роб с този модел на бита. 11000011 представлява бяло, бяло, черно, черно, черно, черно, бяло, бяло. И така, това не би бил огромен скок след това да започнем да говорим за цветни снимки, неща, които ще видите във Facebook или с цифров фотоапарат. Но разбира се, когато става въпрос за цветове, имате нужда от повече битове. И доста често в света на снимки е да се използва не от 1-битов цвят, тъй като това подсказва, но 24-битов цвят, където всъщност става дума милиони цветове. Така че, както в случая, когато увеличени на очите на Роб, това е произволен брой на милиони от различни цветни възможности. Така че ние ще представим в Проблем Set 4, както и в помагалото, която ще бъде днес в 03:30 вместо обичайната 02:30 защото на лекцията в петък тук. Но видео ще бъде на линия утре, както обикновено. Ние също така ще ви запозная с друг файлов формат. Това е съзнателно за цел да изглежда смущаваща на първо, но това е само документация за структурата C. Оказва се, че Microsoft преди години помогна за популяризиране този формат растерното файлов формат BMP, и това е супер проста, цветен графичен файлов формат който е бил използван за доста дълго време и понякога все още тапети за настолни компютри. Ако мислите, че обратно на Windows XP и хълмове и синьото небе, това обикновено е BMP или растерно изображение. Bitmaps са забавни за нас, защото те имат малко по-голяма сложност. Това не е толкова просто, колкото тази мрежа на 0s и 1s. Вместо това, има неща, като заглавието в началото на файла. Така че, с други думи, в рамките на файла BMP цял куп 0s и 1s, но има някои допълнителни 0s и 1s там. И се оказва, че това, което вероятно сте приемали за даденост в продължение на години - файлови формати като. док или XLS или mp3, mp4, независимо от файлови формати , че сте запознати с това, което е дори да означава да файлов формат, защото в края на деня всички тези файлове ние използваме само 0s и 1s. И може би тези 0s и 1s представляват ABC чрез ASCII или нещо подобно, но в края на деня, това е все още само 0s и 1s. Така че хората просто от време на време да реши да се измисли нов файлов формат , където те се стандартизират какви модели на бита действително ще означава. И в този случай, на хора, които са предназначени за растерна графика файлов формат каза, че при първия байт в растерно файл, както е обозначен с отместване 0 там, там ще бъде някои загадъчно име променлива наречена bfType, която просто стои за растерна графика тип файл, какъв тип на растерна графика файл е това. Можете да заключим, може би от втория ред, че отместване 2, байт номер 2, има модел на 0s и 1s, която представлява какво? Размерът на нещо. И не е от там. Така че в Проблем Комплект 4, ще се ходи през някои от тези неща. Ние не можем в крайна сметка ще се грижат за всички от тях. Но забележете, започва да става интересно около байт 54: rgbtBlue, Зелено и Червено. Ако някога сте чували акроним RGB - червено, зелено, синьо - това е препратка към това защото се оказва, можете да рисувате всички цветове на дъгата с някаква комбинация от червено синьо и зелено. И в действителност, родителите в стаята може да си припомни някои от най-ранните проектори. Тези дни, можете просто да видя една ярка светлина, идваща от обектива, Но да се върнем в деня, когато трябваше червената леща, синята леща и зелена леща, и заедно те са насочени към екрана и образуваха пъстра картина. И доста често, средни училища и гимназии ще имат тези лещи все така леко накриво, така че са вид виждат двойни или тройни изображения. Но това беше идеята. Ти имаше червена и зелена и синя светлина рисуването на картина. И същия принцип се използва в компютрите. Така сред предизвикателствата за вас в проблем Set 4 ще бъдат няколко неща. Единият е да преоразмерите изображение, за да се вземе в модел на 0s и 1s, разбера кои парчета на 0s и 1s представляват това, което в структура като тази, и след това да разбера как да репликира пиксела - червени, сини, зелени - вътре, така че когато картината изглежда по този начин първоначално тя може да изглежда по този начин, а не след това. Сред другите предизвикателства ще бъде, че ще бъде предаден съдебен изображение на действителния файл от цифров фотоапарат. И на тази камера, Имало едно време, бяха цял куп снимки. Проблемът е, че ние случайно изтрити или повреден по някакъв начин изображението. Лоши неща се случват с цифрови фотоапарати. И така, ние бързо се копират на 0s и 1s изключване на тази карта за вас спаси всички тях в един голям файл, а след това ще ги предам да ви Проблем Сет 4 така че можете да напишете програма на С, с които да възстанови всички тези JPEG файлове, в най-добрия случай. И се оказва, че на JPEG, въпреки че те са малко на комплекс файлов формат - те са много по-сложни от това усмихнато лице тук - се оказва, че всеки JPEG започва с едни и същи модели на 0s и 1s. Така че използването, в крайна сметка, докато линия или за линия или подобни, можете да превъртате над цялата 0s и 1s в този съдебен изображение, и всеки път, когато видите специален модел, който е определено в спецификацията проблем набор, тук може да се предположи, е с много висока степен на вероятност, началото на JPEG. И веднага след като си намери същия модел известен брой байтове или килобайта или мегабайта по-късно, може да се предположи тук е втора JPEG, снимка взех след първата. Нека да спрете да четете, че първият файл, започнете да пишете тази нова, и на изхода на вашата програма за pset4 ще бъде най-много до 50 JPEG файлове. И ако това не е 50 JPEG файлове, може да има малко на една линия. Ако имате един безкраен брой на JPEG файлове, имате безкраен цикъл. Така че това също ще бъде доста често срещан случай. Така че това е това, което е на хоризонта. Тест 0 зад нас, реализира на моя имейл, че винаги има хора, които са щастливи и двамата, вид неутрална, и тъжно около викторина 0 време. И моля ви, не достигат до мен, главата TF Zamyla, вашето собствено TF, или на един от компетентните органи, че знаеш, че ако бихте искали да обсъдим как нещата. Така че, за да впечатли тук, в стаята на родителите, какво е CS50 библиотека? [Смях] Добра работа. Каква е CS50 библиотека? Да. >> [Ученик] Това е предварително писмено набор от код се чува] Добре, добре. Това е предварително писмено набор от код, който ние пише персонал, ние предлагаме за вас, , която осигурява някаква обща функционалност, подобни неща ме низ, дай ми едно цяло число - всички функции, които са изброени тук. От сега нататък да започнем наистина да предприемат тези обучения колела. Отиваме да започне да отнеме низ от вас, спомням, беше просто синоним на действителния тип данни? >> Множество студенти] Char *. Чар *. За родителите, които е вероятно [прави се движи шумно звук]. Това е добре. Чар * ние ще започнете да виждате на екрана още по-премахнем низ от нашия речник, поне когато става въпрос за действително писане на код. Също така, ние ще спрете да използвате някои от тези функции, както много защото нашите програми, ще получите по-сложни. Вместо просто да се пишат програми, които седят там с бързо мига, очаква потребителят да напишете нещо в, вие ще получите входове от другаде. Например, вие ще ги получите от поредица от битове на локалния твърд диск. Ще вместо да ги получите в бъдеще от мрежова връзка, някъде някой сайт. Така че нека да свали този слой за първи път и издърпайте нагоре CS50 техника и този файл, наречен cs50.h, което сте били # включително за седмица, но нека да видим какво е вътре в този. В горната част на файла в синьо е просто един куп коментари: гаранционна информация, както и лицензиране. Това е нещо като обща парадигма в областта на софтуера защото много софтуер в наши дни е това, което се нарича с отворен код, което означава, че някой е написал кода и го направи свободно достъпни не само да се движи и да се използват, но действително да четат и променят и интегрират в собствената си работа. Така че това е това, което сте използвали софтуер с отворен код, макар и в много малка форма. Ако превъртете надолу покрай коментарите, обаче, ние ще започнем да виждаме някои по-познати неща. Известие в горната тук, че файлът cs50.h включва цял куп заглавни файлове. Повечето от тях, ние не са виждали преди, но някой е запознат. Кои от тях са видяхме, макар и за кратко, до този момент? >> [Ученик] стандартната библиотека. Да, стандартната библиотека. stdlib.h има изчистване. След като започнахме да говорим за динамично разпределение на паметта, които ние ще се върне следващата седмица, както и, включително и този файл. Оказва се, че булев и истина и лъжа всъщност не съществува в C сама по себе си освен ако не включват този файл тук. Ние сме за седмица включително stdbool.h така че можете да използвате понятието булев, вярно или невярно. Без това, вие ще трябва да сортирате съсипват и използване на вътр и просто произволно приемем, че 0 е невярна и една е вярно. Ако ние превъртете надолу, освен това, тук е нашата дефиниция на низ. Оказва се, както казах и преди, че когато тази звезда е всъщност няма значение. Можете дори да има място на всички наоколо. Ние този семестър са го насърчава, тъй като това, за да стане ясно, че звездата трябва да се направи с типа, но реализира точно толкова общо, ако не и малко по-често, е да го сложи там, но функционално това е едно и също нещо. Но сега, ако четем нататък, нека хвърлим един поглед към GetInt защото сме свикнали, че може би първо преди всичко друго този семестър. Ето GetInt. Това е какво? >> [Ученик] прототип. >> Това е само прототип. Често сме поставени прототипи на върховете на нашата в. файлове, но можете също така да сложите прототипи в заглавните файлове, з файлове, като този тук така че, когато ви пиша някои функции, които искате други хора да бъдат в състояние да използват, който е точно случая с библиотеката CS50, не само изпълнение на своите функции в нещо като cs50.c, и прототипи не в горната част на този файл, но в горната част на заглавния файл. Тогава това заглавния файл е това, което приятели и колеги с # включват в собствения си код. Така че през цялото това време, вие сте били включително всички тези прототипи, ефективно в началото на файла, но чрез това # включват механизъм, които по същество копия и пасти за този файл във вашия собствен. Ето някои доста подробна документация. Ние сме до голяма степен се приема за даденост, че GetInt получава вътр, но се оказва, че някои ъглови случаи. Какво ще стане, когато потребителят видове в брой, който е твърде голям, квинтилиона , които просто не могат да се поберат в рамките на едно цяло число? Какво е очакваното поведение? В идеалния случай, това е предсказуема. Така че в този случай, ако действително четат дребния шрифт, всъщност ще видите, че ако линията не може да се чете, това се връща INT_MAX. Ние никога не сме говорили за това, но въз основа на капитализацията си, това, което е може би? [Ученик] константа. >> Това е постоянна. Това е някаква особена константа, която вероятно е обявена в един от тези заглавни файлове това е по-високо във файла, и INT_MAX вероятно е нещо като около 2 милиарда евро, идеята е, че, защото ние трябва по някакъв начин да означава, че нещо се е объркало, ние, да, има 4 милиарда номера на наше разположение: -2 милиарда на над 2 милиарда, или да даде. Е, това, което се среща често в програмирането е да откраднеш само един от тези номера, може би 0, може би 2 млрд. евро, може би -2 млрд. евро, така че да прекарвате една от вашите възможни стойности, така че да може да се ангажира света че ако нещо се обърка, ще се върна този супер голяма стойност. Но вие не искате потребителят да пишете нещо загадъчно като 234 ..., наистина голям брой. Можете да го обобщим, а не като константа. Така че наистина, ако са били анален последните няколко седмици, всеки път, когато нарича GetInt, вие трябва да се консултирате с, ако състоянието тип потребител в INT_MAX, или по-точно, не GetInt връщане INT_MAX, защото ако го направи, , което всъщност означава, че те не го напишете. Нещо се обърка в този случай. Така че това е това, което обикновено известен като часовой стойност, което просто означава специален. Нека сега се превърне в файл в. Файлът C е съществувала в уреда за известно време. И в действителност, уредът има прекомпилирани за вас, че нещо, което ние наричаме обектен код, но тя просто не е от значение за вас, когато то е, защото системата знае в този случай, когато това е уреда. Да превъртете надолу сега, за да GetInt и да видим как GetInt е работил през цялото това време. Тук имаме подобни коментари от преди. Позволете ми да се фокусирам върху само код част. И това, което имаме за GetInt е следната. Тя не взема вход. Тя връща Int, докато (вярно), така че ние имаме умишлено безкраен цикъл, но се предполага, че ще избухне на това по някакъв начин или да се върнете от това. Нека да видим как работи това. Ние изглежда да се използва GetString в тази първа линия вътре в контура, 166. Това е добра практика, защото при какви обстоятелства може да се върне GetString специалната NULL ключова дума? >> [Ученик] Ако нещо се обърка. Ако нещо се обърка. И какво може да се обърка, когато ти се обадя нещо подобно GetString? Да. >> Студент изчистване не успее да го даде на цели числа. Да. Може би изчистване се провали. Някъде под капака, GetString се обажда изчистване, която разпределя памет, което позволява на компютъра магазин всички герои че потребителят е въвел в клавиатурата. И да предположим, потребителят трябваше цяло много свободно време и да пишат повече, например, над 2 млрд. знаци в повече символи, отколкото на компютъра, дори има RAM. GetString трябва да бъде в състояние да покаже, че за вас. Дори ако това е супер, супер необичайно случай ъгъл, тя трябва по някакъв начин да бъде в състояние да се справят с това, и така GetString, ако се върнем назад и прочетете документацията му, в NULL факт връщане. Така че сега, ако GetString не чрез връщане NULL, GetInt ще се провалят чрез връщане INT_MAX само като страж. Това са само конвенции за човешките. Единственият начин вие ще знаете, това е случаят с четене на документацията. Да превъртете надолу до мястото, където вътр всъщност е намерила. Ако превъртете надолу малко по-нататък, в съответствие 170, имаме коментар над тези редове. Ние заявяваме, 172 INT, N, и Чар, C, и след това тази нова функция, които някои от вас са попаднали в преди, sscanf. Това означава низ scanf. С други думи, дай ми низ и аз ще го сканира за парчета от информация, представляваща интерес. Какво означава това? Да предположим, че пиша, буквално, 123 в клавиатурата и след това натиснете Enter. Какъв е типът данни на 123, когато се върнат от GetString? >> Студент String. Това очевидно е низ, нали? Имам низ. Така че 123 е наистина, цитирам цитата, 123 \ 0 в края на. Това не е вътр. Това не е номер. Тя изглежда като брой, но това не е реално. Така че това, което се GetInt трябва да направя? Тя трябва да сканирате, че низ от ляво на дясно - 123 \ 0 - и по някакъв начин да се превърнат в действително число. Можете да разбера как да направите това. Ако мислите, че обратно до pset2, вероятно има малко по-комфортно с Цезар или Vigenere, така че можете да обхождане на низ, можете да конвертирате символа на цели числа. Но, по дяволите, това е цяло много работа. Защо не извикате функция като sscanf, която прави това за вас? Така sscanf очаква аргумент - в този случай, наречен линия, която е низ. След това се посочва в кавички, много подобен на ФОРМАТ, какво очаквате да видите в този низ. И това, което казвам тук е, че очакваме да видим десетично число, а може би и характер. И ще видим защо това е само за миг. И се оказва, че това означение е напомня на неща започнахме да говорим за точно преди повече от седмица. Какво е & N и в прави за нас тук? >> [Ученик] Адрес на N и адрес на в. Да. Това ми дава адреса на N и адрес на в. Защо това е важно? Знаеш ли, че с функции в C, винаги може да върне стойност или никаква стойност. Можете да се върнете едно цяло число, низ, поплавък, Чар, каквото и да е, или може да се върне за невалидни, но можете да връщат само едно нещо максимално. Но тук искаме sscanf може да ме върне INT, десетично число, , а също и Чар, и ще ти обясня защо Чар в момента. Ефективно искате sscanf да се върне две неща, но това просто не е възможно в C. Можете да работите около това чрез преминаване в два адреса тъй като веднага след като се предаде функция два адреса, какво тази функция може да правите с тях? >> [Ученик] Напишете на тези адреси. Тя може да пишете на тези адреси. Можете да използвате действието звезда и да отида там, на всеки един от тези адреси. Това е нещо на този механизъм на задната врата, но много често за промяна на стойностите на променливите повече, отколкото само на едно място - в този случай, две. Сега забележите, аз съм проверка за == 1 и след това се връщат N, ако това се, в действителност, оценка да е истина. И така, какво става? Технически погледнато, всички ние наистина искаме да се случи в GetInt е това. Ние искаме да се направи разбор, така да се каже, ние искаме да чете низ - цитат кавички 123 - и ако тя изглежда като има редица там, това, което ние казваме sscanf да се направи се поставя този брой - 123 - в тази променлива N за мен. Така че, защо тогава съм всъщност са това, както добре? Каква е ролята на sscanf казвам, че може също да премине герой тук? [Чува отговор студент] >> десетичната точка действително биха могли да работят. Да се ​​приеме, че се замисли за момент. Какво друго? [Ученик] Тя може да бъде NULL. >> Добра мисъл. Тя може да бъде нула характер. То всъщност не е в този случай. Да. >> Студент ASCII. ASCII. Или нека обобщим още повече. % В там е само за проверка за грешки. Ние не искаме там, за да бъде герой, след като номерът, но това ми позволява да правя е следното. Оказва се, че sscanf, освен съхраняване на стойности в N и в този пример тук, какво се е връща броя на променливите стойности инча Така че, ако имате само да въведете 123, то само% г ще да съвпадат, и само се записва N със стойност, като 123, и нищо не се получава в C остава боклук стойност, така да се каже - боклук, защото тя никога не е бил инициализиран някаква стойност. Така че в този случай, sscanf връща 1, защото аз населена едно от тези указатели, в този случай голяма, аз имам едно цяло число, така че освободи линия, за да освободите памет че GetString всъщност разпределени, и след това се върна н иначе, ако сте някога се чудеха, когато това Повторен опит изявление идва от, тя идва точно от тук. Така че, ако, от друга страна, въведете на 123foo - само някои случайна последователност на текста - sscanf ще види номер, номер, номера, е, и тя ще постави 123 в N, тя ще постави е в в и след това се върнете 2. Така че ние имаме, само с помощта на основната дефиниция на поведението на sscanf, един много прост начин - добре, сложен на пръв поглед, но в края на деня сравнително прост механизъм - да се каже има ли вътр и ако е така, че единственото нещо, което открих? И това празно пространство, тук е умишлено. Ако прочетете документацията за sscanf, тя ви казва, че ако включите част от празно в началото или в края, sscanf също ще позволи на потребителя, за каквато и да е причина, да удари 123 бар пространство, и това ще бъде законна. Вие няма да вика към потребителя, само защото те удари бар пространство в началото или в края, което е само малко по-лесен за употреба. Всякакви въпроси на GetInt? Да. >> [Ученик] Какво ще стане, ако просто в Чар? Добър въпрос. Какво ще стане, ако просто написали в знак като е и натиснете Въведете без изобщо да пишете 123? Какво мислите за поведението на тази линия на код ще бъде? [Чува студент отговор] Да, така sscanf може да покрие, че твърде, защото в този случай не става да запълни N или в. Това е вместо това ще върне 0, в който случай аз да се включат този сценарий , тъй като очакваната стойност, което искам, е едно. Искам само едно и само едно нещо, което трябва да бъдат запълнени. Добър въпрос. Други? Добре. Да не мине през всички функции в тук, но това изглежда, че може би и на останалите интерес е GetString защото се оказва, че GetFloat, GetInt, GetDouble, GetLongLong шута много на функционалността им GetString. Така че нека да видим как той се изпълнява тук. Това изглежда малко сложна, но той използва същите основи че ние започнахме да говорим за последната седмица. В GetString, който не взема аргумент, тъй като на празнотата тук и го връща низ, аз очевидно съм за обявяване на низ нарича буфер. Аз наистина не знам какво ще се използва за още, но ще видим. Тя изглежда като капацитет е по подразбиране 0. Не е съвсем сигурен, когато това се случва, без да знае какво н ще се използва за още, но сега е малко по-интересна. В съответствие 243, ние заявяваме, ПНА, в. Това е нещо на глупав детайл. Чар е 8 бита, а 8 бита може да съхранява колко различни стойности? >> [Ученик] 256. >> 256. Проблемът е, че ако искате да имате 256 различни ASCII символи, които има ако мислите, че обратно - и това не е нещо, което да запомните. Но ако смятате, че голяма ASCII диаграма имахме преди няколко седмици, в този случай имаше 128 или 256 ASCII символи. Ние използвахме всички модели на 0s и 1s до. Това е проблем, ако искате да сте в състояние да открие грешка защото ако сте вече използват 256 стойности за вашите герои, наистина не планират бъдещето си, защото сега вие нямате начин да се каже, това не е легитимен характер, това е някаква погрешно послание. Така че това, което светът е, че те използва следващото най-голямата стойност, нещо като едно цяло число, така че да имате един луд броя на битовете, 32, 4 милиарда възможни стойности така че можете просто да започнем да използваме по същество 257 от тях, Един от които има някакво специално значение като грешка. Така че нека да видим как работи това. В съответствие 246, аз имам този голям цикъл, докато, която се обажда fgetc, е смисъла файл, така че getc, и след това стандартния вход. Оказва се, че това е само по-прецизен начин каже прочетете вход от клавиатурата. Стандартна клавиатура означава, че стандартния изход означава екран, и стандартната грешка, която ще видим в pset4, означава, че екранът а особената част на екрана, така че да не се сливат с действителната продукция който те са предназначени за печат. Но повече за това в бъдеще. Така fgetc просто означава, чете един символ от клавиатурата и да го съхранявате? Съхранявайте го в. И тогава - така че аз съм само с помощта на някои булеви съюзи - проверете дали не е равно - \ N, така че потребителят е хит Въведете, ние искаме да спре в този момент, края на цикъла - и ние също да искате да проверите за специална постоянна EOF, които, ако знаете или Предполагам, какво я отличава? >> Студент края на файла. >> Края на файла. Това е малко безсмислен, защото ако аз съм пишете на клавиатурата, там наистина не участват в този файл, но това е просто на родов термин, който се използва в смисъл, , че нищо друго не е от пръстите на човешките. EOF - края на файла. Като настрана, ако сте някога хит Control D на клавиатурата не, че ще има още - вие сте удари Control C - Control D изпраща тази специална постоянна нарича EOF. Така че сега ние просто трябва някои динамично разпределение на паметта. Така че, ако (N + 1> капацитет). Сега ще обясня N. N е просто колко байта в момента са в буфера, низ, който сте в момента от потребителя. Ако имате повече символи във вашия буфер, отколкото имате капацитет в буфера, интуитивно какво трябва да направя след това се разпределят по-голям капацитет. Така че аз отивам да слезете на средноаритметичната тук и да се съсредоточи само върху тази функция. Знаеш ли какво изчистване или са обикновено най-малко запознати. Да предположите какво презаделяне. >> [Ученик] добавя памет. Това не е съвсем добавяне на памет. Тя преразпределя паметта по следния начин. Ако все още има в края на низа, за да ви дам повече, че паметта отколкото първоначално ти дава, тогава вие ще получите, че допълнителната памет. Така можете просто да слагаме герои на струнни да направите резервно копие на гръб до гръб. Но ако това не е така, защото сте чакали прекалено дълго и имам нещо случаен пльосна в паметта но има допълнителна памет тук, това е добре. Презаделяне ще направи всичко най-тежката работа за вас, се движат в низа, който съм чел в този момент от тук, там, и след това да ви дам още малко пистата за излитане и кацане в този момент. Така че с едно махване на ръката, позволете ми да кажа, че това, което GetString прави се започва с малък буфер, може би един-единствен герой, и когато потребителят видове в два знака, GetString завършва повикването презаделяне и казва един символ не е достатъчно да ми даде два знака. Тогава, ако сте прочели през логиката на цикъла, той ще каже потребител, напечатани в 3 знака, дай ми сега не две, а четири символа, след това ми даде 8, а след това да ми даде 16 и 32. Фактът, че аз съм удвояване на капацитета всеки път означава, че буферът няма да растат бавно, тя ще расте супер бързо. И какво може да се възползват от това? Защо съм удвояване на размера на буфера въпреки че потребителят би трябва просто един допълнителен символ от клавиатурата? [Чува студент отговор] >> Какво е това? >> [Ученик] не са да растат толкова често. Точно така. Не е нужно да растат толкова често. И това е само вид хеджиране своите залози тук, идеята е, че не искате да се обадите презаделяне много, защото тя е склонна да бъде бавно. Всеки път, когато поиска от операционната система за паметта, тъй като вие скоро ще видите в бъдещ проблем, тя е склонна да отнеме известно време. Така свеждане до минимум този период от време, дори и да си губиш малко пространство, има тенденция да бъде нещо добро. Но, ако четем през последната част от GetString тук - и отново разбирането на всеки един ред тук не е толкова важно днес - забележите, че той в крайна сметка отново призовава изчистване и го разпределя точно както много байтове, тъй като тя се нуждае за низ и след това изхвърля като се обадите безплатно прекалено голям буфер ако наистина има удвои твърде много пъти. Така че, накратко, как GetString е работил през цялото това време. Всичко, което прави, е да чете един символ в даден момент отново и отново, и отново, и всеки път, когато се нуждае от допълнителна памет, той пита на операционната система за като се обадите на презаделяне. Някакви въпроси? Добре. Атака. Сега, ние разбираме, указатели или най-малкото са все по-запознати с указатели, нека да разгледаме как целият свят започва да се свлича ако вие не защитава срещу състезателно потребители, хора, които се опитват да проникна в системата ви, хора, които се опитват да откраднат вашия софтуер чрез заобикаляне на някои регистрационен код , че в противен случай те биха могли да се наложи да въведете инча Обърнете внимание на този пример тук, който е само C код, който има основната функция на дъното , която призовава функция Foo. И за какво се премине към Foo? [Ученик] единствен аргумент. >> Малан] единствен аргумент. Така argv [1], което означава, че първата дума, която потребителят въведе в командния ред след a.out или каквото програмата е т.нар. Така Foo на върха в знак *. Но Чар * е точно това? >> [Ученик] низ. [Малан] низ, така че няма нищо ново тук. Тази струна е произволно се нарича бар. В този ред тук, Чар в [12], а в нещо като полу-технически английски език, какво е тази линия? [Ученик] масив - >> Array? >> [Ученик] знака. >> Други. Дай ми един набор от 12 знака. Така че бихме могли да наречем този буфер. Технически, наречено C, но буфер в програмирането просто означава един куп пространство че можете да сложите някои неща инча Тогава накрая, memcpy ние не сме използвали преди, но вероятно можете да се досетите, това, което го прави. Той копира памет. Какво прави той? Очевидно копира бар, към нейния вход, в в, но само до дължината на бара. Но има бъг тук. >> [Ученик] се нуждаят от sizeof характер. >> Добре. Технически погледнато, ние трябва наистина strlen (бар) * sizeof (Чар)). Това е правилно. Но в най-лошия случай, нека да приемем, че това е - Добре. След това има две грешки. Така че sizeof (Чар)); Нека направим малко по-широк. Така че сега все още има грешка, която е това, което? >> Чува студент отговор] Проверете за какво? >> [Ученик] NULL. Принцип трябва да се проверява за NULL, защото се случват лоши неща когато показалеца е NULL, защото може би в крайна сметка ще има, и не трябва никога да се случва да NULL го dereferencing със звездата оператор. Така че е добре. И какво правим? Логично е, че тук има един недостатък. [Ученик] Проверете дали argc> = 2. Така че проверете дали argc> = 2. Добре, така че има три грешки в тази програма. Ние сме сега проверка дали потребителят действително въвели нищо в argv [1]. Добре. Така че това, което е третото бъг? Да. >> [Ученик] C може да не е достатъчно голям. Добре. Проверихме един сценарий. Имплицитно проверява не копирайте повече памет, отколкото да превишава дължината на бара. Така че, ако низа на потребителя въвели в 10 знака, това се казва само копие 10 символа. И това е добре. Но какво, ако потребителят написали с една дума на ред като 20-символна дума? Това казва на копие 20 знака от бар в какво? C, иначе известни като нашия буфер, което означава, че просто е написал данни 8 байтови места, които не притежават, и вие не ги притежавате, в смисъл, че никога няма да ги разпределят. Така че това е това, което обикновено известен като препълване на буфера атака или нападение буфер превишаване. И това е атака, в смисъл, че ако потребителят или програма, която се обажда функция прави това злонамерено, какво всъщност се случва по-нататък, в действителност може да бъде доста лошо. Така че нека да разгледаме тази картина тук. Тази картина представлява стека на паметта. Спомнете си, че всеки път, когато ти се обадя функция, можете да получите тази малка рамка на стека и после още една и после още и още. И до този момент, ние сме просто вид на добиваната тези като правоъгълници или на борда на кораба или на екрана тук. Но ако се фокусирам върху един от тези правоъгълници, когато ти се обадя функция Foo, се оказва, че има нещо повече в стека вътрешността на тази рамка в този правоъгълник от само х и у и А и Б, като се говори за суап. Оказва се, че има някои по-ниско ниво детайли, сред които обратен адрес. Така се оказва, когато основният призовава Foo, основно трябва да информира Foo адрес основната е в паметта на компютъра защото в противен случай, веднага след като Foo се извършва изпълнение, като в този случай тук, след като достигне тази затворена фигурна скоба в края на Foo как по дяволите Foo знам къде контрол на програмата е трябвало да отиде? Оказва се, че отговорът на този въпрос е тук в този червен правоъгълник. Това представлява показалеца, и това е до компютъра, за да се съхранява временно на т. нар. стека адреса на основния, така че веднага след като Foo се извършва изпълнение, компютъра знае къде и какво линия в основната да се върна в. Запазени Frame показалеца се отнася по подобен начин за това. Чар * бар тук какво представлява? Сега това синьо сегмент тук е рамка Foo. Какво е бара? Бар е просто аргумент за функцията Foo. Така че сега ние сме вид на познатата картина. Има повече неща и по-отвличане на вниманието на екрана, но това светло синьо сегмент просто не е това, което ние сме били въз основа на дъската нещо като суап. Това е рамката за Foo. И единственото нещо, в него сега се намира бар, който е този параметър. Но какво друго трябва да бъде в стека в съответствие с този код тук? [Ученик] Чар [12]. >> Малан] Чар в [12]. Ние също трябва да видите 12 квадрата памет, предназначени за променлива наречена в и ние наистина нямаме тази на екрана. Самия връх има [0], а след това авторът на тази диаграма не се притеснява изготвяне на площадите, но наистина има 12 там защото ако се вгледате в долния десен ъгъл, в [11], ако броим от 0 е 12, като байт. Но тук е проблемът. В коя посока се в расте? Нещо отгоре надолу, ако тя започва от върха и расте до дъното. Не изглежда като ние се остави много пистата тук изобщо. Сме на себе си боядисани в един ъгъл, и че в [11] е точно срещу бар, който е точно срещу Запазени Frame показалеца, , която е точно срещу обратен адрес. Има няма повече място. Така че това, което е отражение след това, ако се провалиш и се опитате да прочетете 20 байта в 12-байтов буфер? Къде са тези 8 допълнителни байта да отидете? >> [Ученик] Inside - Вътре всичко останало, някои от които е супер важно. И най-важното нещо, което потенциално е червената кутия, обратен адрес, защото предполагам, че случайно или adversarially презапише тези 4 байта, че показалеца адрес, не само с боклук, но с редица , което се случва, да представлява настоящ адрес в паметта. Какъв е изводът, логично? >> [Ученик] Функция ще се върне на друго място. Точно така. Когато Foo се връща и удря къдрава, че презрамки, програмата ще да продължите да не се върнете на главната, тя ще се върне какъвто и да е адрес е, че червената кутия. В случай на заобикаляне софтуер регистрация, какво ще стане ако адрес, който се връща, е функция, която обикновено получава нарича след като сте платили за софтуера и въведени регистрационен код? Можете да сортирате на трик компютъра в не тук, а вместо това става тук. Или, ако сте наистина умни, противникът може действително да въведете на клавиатурата, например, не е действително дума, не повече от 20 символа, но предполагам той или тя всъщност видове в някои от героите, които представляват код. И това няма да бъде C код, то всъщност се случва да бъдат героите , които представляват двоичен машинен код, 0s и 1s. Но предполагам, че си достатъчно умен, за да направи това, по някакъв начин да поставите в GetString бързото нещо, което е по същество компилиран код, и последните 4 байта презапишете обратен адрес. И какъв адрес се този вход? То всъщност се съхранява в този червен правоъгълник на адреса на първия байт на буфера. Така че трябва да бъде много умен, и това е много опити и грешки, за лоши хора там, но ако можете да разберете колко голям е този буфер такива, че последните няколко байта във входа, която предоставяте на програмата се случи да бъде еквивалент на адреса на началото на вашия буфер, можете да направите това. Ако кажем, че обикновено Здравейте и \ 0, това е, което се озовава в буфера. Но ако ние сме по-умни и попълнете този буфер, с какво ще генерични обадете атака код - AAA, атака, атака, атака - това е просто нещо, което прави нещо лошо, какво ще се случи, ако сте наистина умен, можете да направите това. В червеното поле тук е поредица от числа - 80, C0, 35, 08. Забележете, че това съвпада с номера, че е тук. Това е в обратен ред, но повече за това някой друг път. Забележете, че това завръщане адрес е умишлено променена да е равно на адрес тук, а не адреса на главната. Така че, ако лош човек е супер умен, той или тя ще се включи в тази атака код нещо като изтриете всички файлове на потребителя или да копирате пароли или да създадете потребителски акаунт, който аз мога да влезете в - нищо. И това е опасност и силата на C. Защото имате достъп до паметта чрез указатели и вие можете да напишете всичко, което искате в паметта на компютъра, можете да направите компютъра направя всичко, което искаш просто, като го скачат в рамките на собствената си памет пространство. И така до ден днешен толкова много програми и толкова много сайтове, които са изложени на риск свеждат до хората, които се възползват от тази. И това може да изглежда като супер сложна атака, но тя не винаги започват по този начин. Истината е, че това, което лоши хора обикновено ще направи, е, дали това е програма на командния ред или GUI програма или уеб сайт, просто да започне да предоставя глупости. Вие пишете в наистина голяма дума в полето за търсене и натиснете Enter, и чакаме да видим, ако в сайта катастрофи или да чакаме да видим, ако програмата се проявява някои съобщение за грешка защото ако имаш късмет като лош човек и ще ви даде някои луди вход което блокира програмата, това означава, че програмистът не е очаквала лошо поведение, което означава, че най-вероятно с достатъчно усилия, достатъчно опити и грешки, разбера как да се води по-точна атака. Така че, голяма част от сигурността не е само избягване на тези атаки напълно но откриване тях и действително търсят трупи и да видим какви луди входа има хора, напечатани в уебсайта си, кои термини за търсене са хората писаха във вашия сайт с надеждата да прелива някои буфер. И всичко това се свежда до прости основите на това, което е масив и какво означава това да се разпределят и използват памет. , Че тогава също е това. Нека просто да погледне вътре на твърдия диск за пореден път. Вие си спомняте от една седмица или две преди, че когато плъзнете файлове на кошчето или кофа за боклук, какво се случва? >> [Ученик] Нищо. >> Абсолютно нищо, нали? В крайна сметка, ако се сблъскате ниско дисково пространство, Windows или Mac OS ще започне изтриване на файлове за вас. Но ако плъзнете нещо там, което не е в безопасност. Съквартирантката си или приятел или член на семейството трябва да се направи, е да кликнете два пъти и готово, има всички схематични файлове, които се опитвате да изтриете. Повечето от нас поне знаем, че трябва да кликнете с десния бутон на мишката или контрол кликване и изпразнете кошчето или нещо подобно. Но дори и тогава, че не съвсем свърши работа защото това, което се случва, когато имате файл на вашия хард диск , която представлява някои Word документ или някои JPEG, и това представлява вашия твърд диск, и да кажем, че тази треска представлява този файл, и е съставен от цял ​​куп 0s и 1s. Какво се случва, когато не трябва само да плъзнете този файл в кошчето или кошчето но също така празна? Sort от нищо. Това не е абсолютно нищо. Сега това е просто нищо, защото нещо, което се случва под формата на тази таблица. Така че има някаква база данни или маса вътре в паметта на компютъра , която по същество има една колона за имената на файлове и една колона за файлове "място, когато това може да бъде място 123, само на случайно число. Така че може да има нещо като x.jpeg и местоположението 123. Какво се случва тогава, когато всъщност изпразните кошчето? , Че си отива. Но това, което не си отиде, е 0s и 1s. Така че каква е връзката с pset4? Е, с pset4, само защото сме случайно изтриване компактна флаш карта , които са имали всички тези снимки или просто, защото от лош късмет стана повреден не означава, че 0s и 1s не са все още там. Може би някои от тях са изгубени, защото нещо има повреден в смисъл, че някои 0s стана 1s и 1s стана 0s. Лоши неща може да се случи, защото на бъги софтуер или дефектен хардуер. Но много от тези битове, може би дори 100% от тях са все още там. Това е просто, че компютър или фотоапарат не знае къде JPEG1 започна и когато започна JPEG2. Но ако вие, програмист, знаете с малко акъл, къде са тези на JPEG или как изглеждат, така че да може да се анализира 0s и 1s и да кажа, JPEG, JPEG, можете да напишете програма с по принцип само за или по време на линия , което възстановява всеки един от тези файлове. Така че урокът е да се започне сигурно изтриване на файлове ако искате да се избегне това напълно. Да. [Ученик] Как така се казва на вашия компютър че имате повече памет, отколкото преди? Имате повече памет, отколкото преди - >> [ученик] Повече наличната памет. О. Добър въпрос. Така че, защо тогава, след изпразването на кошчето ви компютър ви кажа че имате повече свободно пространство, отколкото преди? С две думи, защото тя лъже. Повече технически, имате повече пространство, защото сега сте казали можете да сложите други неща, където този файл беше някога. Но това не означава бита се отива, и това не означава, бита се променя на всички 0s, например, за вашата защита. Така че, от друга страна, ако сигурно изтрива файлове или унищожите физически устройството, това наистина е единственият начин понякога около това. Така че, защо не оставим на тази полу-страшно е, и ние ще се видим в понеделник. [Аплодисменти] [CS50.TV]