[Powered by Google Translate] [Tuần 5]
[David J. Malan - Đại học Harvard
[Đây là CS50. - CS50.TV]
>> Đây là CS50, Tuần 5.
Ngày hôm nay và trong tuần này, chúng tôi giới thiệu một chút thế giới của pháp y
trong bối cảnh của vấn đề Thiết lập 4.
Hôm nay sẽ là một bài giảng được viết tắt bởi vì có một sự kiện đặc biệt ở đây sau đó.
Vì vậy, chúng tôi sẽ mất một peek và trêu chọc cả học sinh và phụ huynh cũng như hôm nay
với một số trong những điều mà trên đường chân trời.
>> Trong số đó, là thứ hai, bạn sẽ có thêm một vài người bạn cùng lớp.
edx, Harvard và sáng kiến ​​trực tuyến mới của MIT OpenCourseWare và nhiều hơn nữa,
đang tung ra trong khuôn viên trường Đại học Harvard ngày Thứ hai, có nghĩa là thứ hai
, như số gần đây nhất, bạn sẽ có thêm 86.000 các bạn cùng lớp
những người sẽ theo cùng với các bài giảng và phần CS50
và walkthroughs và bộ vấn đề.
Và như là một phần của điều này, bạn sẽ trở thành thành viên của lớp khai mạc CS50 và bây giờ CS50x.
Là một phần của bây giờ, nhận ra rằng sẽ có một số mặt tích cực như.
Để chuẩn bị sẵn sàng cho điều này, số lượng lớn các sinh viên,
nó đủ để nói rằng mặc dù chúng ta có 108 TFs và CA,
nó không hoàn toàn tỷ lệ học sinh-giáo viên tốt nhất một khi chúng ta đạt 80.000 của học sinh.
Chúng tôi sẽ không được phân loại vấn đề rất nhiều thiết lập thủ công,
để giới thiệu tuần này trong bộ vấn đề sẽ là CS50 tra,
đó là sẽ là một tiện ích dòng lệnh trong thiết bị
bạn sẽ nhận được khi bạn cập nhật nó sau này vào cuối tuần này.
Bạn sẽ có thể chạy lệnh, check50, trên pset của riêng bạn,
và bạn sẽ nhận được thông tin phản hồi ngay lập tức để xem liệu chương trình của bạn là đúng hay sai
theo thông số kỹ thuật thiết kế khác nhau mà chúng tôi đã cung cấp.
Thêm vào đó trong vấn đề thiết lập các đặc điểm kỹ thuật.
Các bạn cùng lớp CS50x sẽ được sử dụng này là tốt.
>> Set 4: Vấn đề là tất cả về pháp lý,
và pset này đã thực sự lấy cảm hứng từ một số công cụ thực tế cuộc sống
theo đó khi tôi đã được ở trường đại học, tôi thực tập trong một thời gian
với văn phòng Luật Sư Quận Middlesex County làm công việc pháp y
với điều tra pháp y dẫn của họ.
Điều này đã lên tới, như tôi nghĩ rằng tôi đã đề cập một vài tuần qua,
là khối lượng Cảnh sát nhà nước hoặc những người khác sẽ đến,
họ sẽ thả ra những thứ như ổ đĩa cứng và đĩa CD và đĩa mềm và các loại tương tự,
và sau đó là mục tiêu của cơ quan pháp y để xác định
liệu có hoặc không phải là bằng chứng của một số loại.
Đây là đơn vị điều tra đặc biệt, do đó, nó là tội phạm cổ trắng.
Đó là loại tội phạm đáng lo ngại hơn, bất cứ điều gì liên quan đến một số loại phương tiện truyền thông kỹ thuật số.
Nó chỉ ra rằng không phải là nhiều người viết một email nói rằng, "Tôi đã làm nó."
Vì vậy, khá thường xuyên, những tìm kiếm pháp y không bật lên tất cả những gì nhiều hoa trái,
nhưng đôi khi người viết email như vậy.
Vì vậy, đôi khi, những nỗ lực đã được khen thưởng.
>> Tuy nhiên, lãnh đạo này pset pháp y, chúng tôi sẽ được giới thiệu trong pset4 một chút về đồ họa.
Bạn có thể có những điều này cho các cấp - hình ảnh JPEG, GIF, và như thế - những ngày này.
Nhưng nếu bạn thực sự nghĩ về nó, một hình ảnh, giống như khuôn mặt của Rob,
có thể được mô hình hóa như là một chuỗi các dấu chấm hoặc điểm ảnh.
Trong trường hợp của khuôn mặt của Rob, có tất cả các loại màu sắc,
và chúng tôi bắt đầu nhìn thấy các dấu chấm cá nhân, nếu không được gọi là điểm ảnh,
một khi chúng tôi bắt đầu để phóng to.
Nhưng nếu chúng ta đơn giản hóa thế giới một chút và chỉ nói rằng đây là Rob màu đen và trắng,
để đại diện cho màu đen và trắng, chúng tôi chỉ có thể sử dụng hệ nhị phân.
Và nếu chúng ta sẽ sử dụng hệ nhị phân, 1 hoặc 0, chúng ta có thể bày tỏ cùng một hình ảnh này
khuôn mặt tươi cười của Rob với mô hình này của các bit.
11000011 đại diện cho trắng, màu trắng, màu đen, màu đen, màu đen, màu đen, trắng, trắng.
Và vì vậy nó không phải là một bước nhảy vọt lớn sau đó để bắt đầu nói chuyện về hình ảnh đầy màu sắc,
những điều mà bạn muốn nhìn thấy trên Facebook hoặc với một máy ảnh kỹ thuật số.
Nhưng chắc chắn khi nói đến màu sắc, bạn cần nhiều bit hơn.
Và khá phổ biến trong thế giới của hình ảnh là sử dụng 1-bit màu,
vì điều này cho thấy, nhưng màu 24-bit, mà bạn thực sự nhận được hàng triệu màu.
Vì vậy, trong trường hợp khi chúng tôi thu nhỏ vào mắt của Rob,
đó là bất kỳ số lượng hàng triệu khả năng khác nhau đầy màu sắc.
Vì vậy, chúng tôi sẽ giới thiệu trong 4 Set Vấn đề cũng như trong quá trình thực hiện,
mà sẽ được ngày hôm nay lúc 3:30 thay vì thông thường 2:30 vì bài giảng hôm thứ Sáu ở đây.
Nhưng đoạn video trực tuyến như bình thường vào ngày mai.
>> Chúng tôi cũng sẽ giới thiệu bạn đến một định dạng tập tin khác.
Điều này là cố ý có nghĩa là nhìn đáng sợ lúc đầu,
nhưng điều này chỉ là một số tài liệu cho một cấu trúc C.
Nó chỉ ra rằng Microsoft năm trước đây đã giúp phổ biến định dạng này
được gọi là định dạng tập tin bitmap, bmp, và điều này là một siêu đơn giản, đầy màu sắc đồ họa định dạng tập tin
đã được sử dụng trong một thời gian và đôi khi vẫn cho hình nền trên máy tính để bàn.
Nếu bạn nghĩ rằng trở lại Windows XP và các ngọn đồi và màu xanh da trời,
điển hình là một hình ảnh bmp hay bitmap.
Bitmap là niềm vui đối với chúng tôi bởi vì họ có phức tạp hơn một chút.
Nó không hoàn toàn đơn giản như thế này lưới của số 0 và 1.
Thay vào đó, bạn có những thứ giống như một tiêu đề vào lúc bắt đầu của một tập tin.
Vì vậy, nói cách khác, bên trong một file bmp. Là một bó toàn bộ 0 và 1,
nhưng có một số số 0 và 1 bổ sung trong đó.
Và nó quay ra rằng những gì chúng ta đã có thể dùng cho các cấp trong nhiều năm -
định dạng file như doc hay xls hoặc mp3,. mp4, các định dạng tập tin bất cứ điều gì
mà bạn đã quen thuộc với nó những gì thậm chí có nghĩa là một định dạng tập tin,
bởi vì lúc cuối ngày, tất cả những tập tin này, chúng tôi sử dụng chỉ có 0 và 1.
Và có lẽ những 0 và 1 đại diện cho ABC thông qua ASCII hoặc các loại tương tự,
nhưng vào cuối ngày, nó vẫn chỉ là 0 và 1.
Vì vậy, con người chỉ thỉnh thoảng quyết định để phát minh ra một định dạng tập tin mới
nơi họ chuẩn hóa những gì các mẫu của các bit thực sự sẽ có nghĩa là.
Và trong trường hợp này ở đây, các folks người đã thiết kế định dạng tập tin bitmap
nói rằng các byte đầu tiên trong một tập tin bitmap, như ký hiệu bởi 0 bù đắp có,
có là có được một số khó hiểu biến có tên gọi là bfType,
mà chỉ là viết tắt của loại tập tin bitmap, loại tập tin bitmap này.
Bạn có thể suy ra có lẽ từ hàng thứ hai mà bù đắp 2, byte số 2,
có một mô hình của 0 và 1 đại diện cho những gì? Kích thước của một cái gì đó.
Và nó đi lên từ đó.
Vì vậy, trong 4 Set vấn đề, bạn sẽ được đi qua một số những điều này.
Chúng tôi sẽ không quan tâm đến tất cả chúng.
Nhưng nhận thấy nó bắt đầu trở nên thú vị xung quanh byte 54: rgbtBlue, Green, và Red.
Nếu bạn đã từng nghe từ viết tắt RGB - màu đỏ, xanh lá cây, xanh da trời - đây là một tài liệu tham khảo đó
bởi vì nó chỉ ra bạn có thể vẽ tất cả các màu sắc của cầu vồng
với một số sự kết hợp của màu đỏ và màu xanh và màu xanh lá cây.
Và trên thực tế, các bậc cha mẹ trong phòng có thể cho rằng một số các máy chiếu đầu tiên.
Những ngày này, bạn chỉ nhìn thấy một ánh sáng chói của một ống kính,
nhưng trở lại trong ngày, bạn đã có ống kính màu đỏ, ống kính màu xanh, và ống kính màu xanh lá cây,
và họ cùng nhau nhằm vào một màn hình và hình thành một bức tranh đầy màu sắc.
Và khá thường xuyên, các trường trung học và trường trung học sẽ có những thấu kính
bao giờ nên hơi lệch, do đó, bạn đã nhìn thấy hình ảnh tăng gấp đôi hoặc gấp ba.
Nhưng đó là ý tưởng. Bạn đã có ánh sáng màu đỏ và màu xanh lá cây và màu xanh vẽ một bức tranh.
Và đó là nguyên tắc tương tự được sử dụng trong máy tính.
>> Vì vậy, trong số những thách thức sau đó cho bạn trong vấn đề Set 4 sẽ có một vài điều.
Một là để thực sự thay đổi kích thước một hình ảnh, để có trong một mô hình của 0 và 1,
tìm ra khối của 0 và 1 đại diện cho những gì trong một cấu trúc như thế này,
và sau đó tìm ra cách để tái tạo các điểm ảnh màu đỏ, xanh, màu xanh -
bên trong để khi một bức ảnh trông như thế này ban đầu,
nó có thể trông như thế này thay vì sau đó.
Trong số những thách thức khác là có được rằng bạn sẽ được giao cho một hình ảnh pháp y
của một tập tin thực tế từ một máy ảnh kỹ thuật số.
Và trên máy ảnh đó, một lần khi một thời gian, một bó toàn bộ hình ảnh.
Vấn đề là chúng ta vô tình bị xóa hoặc có hình ảnh bị hỏng bằng cách nào đó.
Điều xấu xảy ra với máy ảnh kỹ thuật số.
Và do đó, chúng tôi nhanh chóng sao chép tất cả các off 0 và 1 thẻ đó cho bạn,
lưu chúng trong một tập tin lớn, và sau đó chúng tôi sẽ giao cho bạn trong vấn đề Set 4
để bạn có thể viết một chương trình trong C nào đó để khôi phục lại tất cả những hình ảnh JPEG, lý tưởng.
Và nó chỉ ra rằng hình ảnh JPEG, mặc dù họ đang hơi của một định dạng tập tin phức tạp -
họ phức tạp hơn nhiều so với khuôn mặt tươi cười ở đây -
nó quay ra rằng JPEG đều bắt đầu với các mô hình tương tự 0 và 1.
Vì vậy, sử dụng, cuối cùng, một vòng lặp trong khi cho vòng lặp hoặc tương tự,
bạn có thể lặp lại trên tất cả các số 0 và 1 trong bức ảnh pháp y,
và mỗi khi bạn xem các mô hình đặc biệt được định nghĩa trong vấn đề thiết lập các đặc điểm kỹ thuật,
bạn có thể giả định ở đây là, với xác suất rất cao, sự bắt đầu của một JPEG.
Và ngay khi bạn tìm thấy cùng một khuôn mẫu một số số byte
hoặc kilobytes hoặc MB sau đó, bạn có thể giả định đây là một JPEG thứ hai,
hình ảnh này, tôi mất sau khi một trong những người đầu tiên.
Hãy để tôi ngừng đọc tập tin đó đầu tiên, bắt đầu viết mới này,
và đầu ra của chương trình của bạn cho pset4 là có được như nhiều như 50 hình ảnh JPEG.
Và nếu nó không phải là 50 hình ảnh JPEG, bạn có một chút của một vòng lặp.
Nếu bạn có một số lượng vô hạn của hình ảnh JPEG, bạn có một vòng lặp vô hạn.
Vì vậy, đó cũng sẽ là một trường hợp khá phổ biến.
Vì vậy, đó là những gì trên đường chân trời.
>> Quiz 0 phía sau chúng tôi, nhận ra mỗi email của tôi lúc nào cũng có người cả hai đều hạnh phúc,
sắp xếp thời gian 0 trung lập, và buồn xung quanh bài kiểm tra.
Và xin vui lòng không đến được với tôi, người đứng đầu TF Zamyla, TF của riêng bạn,
hoặc một trong các CA mà bạn biết nếu bạn muốn thảo luận về mọi thứ đã đi như thế nào.
>> Vì vậy, để gây ấn tượng với các bậc cha mẹ ở đây trong phòng, thư viện CS50 là gì?
[Cười] Good job.
Thư viện CS50 là gì? Yeah. >> [Sinh viên] Đó là một tập trước bằng văn bản của mã [không nghe được]
Được rồi, tốt.
Đó là một tập trước bằng văn bản của mã mà chúng tôi các nhân viên đã viết, chúng tôi cung cấp cho bạn,
cung cấp một số chức năng thông thường,
thứ như thế làm cho tôi một chuỗi, làm cho tôi một int - tất cả các chức năng được liệt kê ở đây.
>> Bắt đầu từ bây giờ, chúng tôi bắt đầu để thực sự đi những bánh xe đào tạo.
Chúng ta sẽ bắt đầu để lấy đi một chuỗi từ bạn,
thu hồi là chỉ là một từ đồng nghĩa cho những gì thực tế kiểu dữ liệu? >> [Nhiều sinh viên Char *.
Char *. Đối với cha mẹ, đó là có thể [làm cho whooshing âm thanh]. Đó là tốt.
Char * chúng tôi sẽ bắt đầu nhìn thấy trên màn hình hơn cả khi chúng tôi loại bỏ chuỗi từ những từ vựng của chúng tôi,
ít nhất là khi nói đến thực sự viết code.
Tương tự như vậy, chúng tôi sẽ ngừng sử dụng một số các chức năng này càng nhiều
bởi vì các chương trình của chúng tôi sẽ nhận được tinh vi hơn.
Thay vì chỉ viết các chương trình mà ngồi đó với một nhấp nháy nhanh chóng,
chờ đợi cho người sử dụng gõ một cái gì đó trong, bạn sẽ có được đầu vào của bạn từ nơi khác.
Ví dụ, bạn sẽ nhận được chúng từ một loạt các bit trên ổ đĩa cứng địa phương.
Thay vào đó bạn sẽ nhận được chúng trong tương lai từ một kết nối mạng,
một số trang web một nơi nào đó.
>> Vì vậy, hãy bóc lớp này cho lần đầu tiên và kéo lên gia dụng CS50
và tập tin này được gọi là cs50.h, bạn đã được # bao gồm nhiều tuần,
nhưng chúng ta hãy thực sự nhìn thấy những gì bên trong này.
Phía trên cùng của tập tin trong màu xanh chỉ là một bó toàn bộ ý kiến:
bảo hành thông tin và cấp giấy phép.
Đây là sắp xếp của một mô hình phổ biến trong phần mềm
bởi vì rất nhiều phần mềm trong những ngày này là những gì được gọi là mã nguồn mở,
có nghĩa là ai đó đã viết mã và làm cho nó tự do có sẵn
không chỉ để chạy và sử dụng, nhưng để thực sự đọc và thay đổi và tích hợp vào công việc của riêng bạn.
Vì vậy, đó là những gì bạn đã được sử dụng, phần mềm mã nguồn mở, mặc dù trong một hình thức rất nhỏ.
Nếu tôi di chuyển xuống qua các ý kiến, tuy nhiên, chúng tôi sẽ bắt đầu thấy một số điều quen thuộc hơn.
Thông báo ở trên cùng ở đây là các tập tin cs50.h bao gồm một bó toàn bộ các tập tin tiêu đề.
Hầu hết trong số này, chúng tôi đã không nhìn thấy trước, nhưng một là quen thuộc.
Mà trong số này chúng ta thấy, mặc dù một thời gian ngắn, do đó đến nay? >> [Sinh viên] Standard thư viện.
Yeah, tiêu chuẩn thư viện. stdlib.h có malloc.
Sau khi chúng tôi bắt đầu nói chuyện về cấp phát bộ nhớ động,
mà chúng ta sẽ quay trở lại đến tuần sau, chúng tôi bắt đầu bao gồm các tập tin đó.
Nó chỉ ra rằng bool và đúng và sai không thực sự tồn tại trong C cho mỗi gia nhập
trừ khi bạn bao gồm tập tin này ở đây.
Chúng tôi đã nhiều tuần được bao gồm stdbool.h
để bạn có thể sử dụng các khái niệm của một bool, đúng hay sai
Nếu không có điều này, bạn sẽ phải sắp xếp giả mạo nó và sử dụng một int
và chỉ cần tùy tiện cho rằng 0 là sai và 1 là đúng.
Nếu chúng ta di chuyển xuống thấp hơn nữa, đây là định nghĩa của chúng ta về một chuỗi.
Hóa ra, như chúng tôi đã nói trước đây, rằng ngôi sao này ở đâu không quan trọng.
Bạn thậm chí có thể có không gian xung quanh.
Chúng tôi học kỳ này đã được thúc đẩy như thế này để làm cho rõ ràng
ngôi sao đã làm với các loại,
nhưng nhận ra chỉ là phổ biến, nếu không phải là một ít phổ biến hơn,
là đặt nó ở đó, nhưng chức năng nó là điều tương tự.
Nhưng bây giờ nếu chúng ta đọc xuống hơn nữa, chúng ta hãy có một cái nhìn tại getInt
bởi vì chúng tôi sử dụng rằng có lẽ đầu tiên trước khi bất cứ điều gì khác trong học kỳ này.
Đây là getInt. Đây là những gì? >> [Sinh viên] Một nguyên mẫu. >> Đây chỉ là một mẫu thử nghiệm.
Thông thường, chúng tôi đã đưa nguyên mẫu tại các đỉnh của chúng tôi các tập tin c,
nhưng bạn cũng có thể đặt nguyên mẫu trong tập tin tiêu đề, h tập tin., như thế này ở đây
do đó khi bạn viết một số chức năng mà bạn muốn người khác có thể sử dụng,
đó chính xác là trường hợp với các thư viện CS50,
bạn không chỉ thực hiện các chức năng của bạn trong một cái gì đó giống như cs50.c,
bạn cũng đặt các nguyên mẫu không phải ở trên cùng của tập tin đó nhưng ở phía trên cùng của một tập tin tiêu đề.
Sau đó, tập tin tiêu đề đó là những gì bạn bè và đồng nghiệp bao gồm
# bao gồm trong mã riêng của họ.
Vì vậy, thời gian này, bạn đã bao gồm tất cả các nguyên mẫu,
hiệu quả ở phía trên cùng của tập tin của bạn, nhưng bằng cách này # bao gồm cơ chế,
về cơ bản các bản sao và bột nhão tập tin này thành của riêng bạn.
Dưới đây là một số tài liệu hướng dẫn khá chi tiết.
Chúng tôi đã thực hiện khá nhiều cho rằng getInt được một int,
nhưng nó quay ra có một số trường hợp góc.
Điều gì sẽ xảy ra nếu người sử dụng các loại trong một số cách quá lớn, một quintillion,
chỉ có thể không phù hợp với bên trong của một int? Hành vi mong đợi là gì?
Lý tưởng nhất, đó là dự đoán được.
Vì vậy, trong trường hợp này, nếu bạn thực sự đọc những dòng chữ nhỏ,
bạn có thể thấy rằng nếu không thể đọc được dòng này INT_MAX trả về.
Chúng tôi đã không bao giờ nói về điều này, nhưng dựa trên vốn của nó, là những gì nó có thể?
[Sinh viên] Một hằng số. >> Đó là một hằng số.
Đó là một số hằng số đặc biệt có thể được khai báo trong một trong các tập tin tiêu đề
lên cao hơn trong tập tin, và INT_MAX có lẽ là một cái gì đó như khoảng 2 tỷ đồng,
ý tưởng là bởi vì bằng cách nào đó chúng ta cần phải biểu hiện một điều gì đó đã đi sai,
chúng tôi, có, có 4 tỷ số lúc xử lý của chúng tôi: -2 tỷ đồng trên lên đến 2 tỷ đồng, cho hay phải mất.
Vâng, những gì là phổ biến trong lập trình là bạn ăn cắp một trong những con số,
có thể là 0, có thể 2 tỷ đồng, có thể -2 tỷ đồng,
do đó, bạn chi tiêu một trong những giá trị có thể của bạn để bạn có thể cam kết với thế giới
rằng nếu có điều gì sai, tôi sẽ trở lại giá trị này siêu lớn.
Nhưng bạn không muốn người dùng gõ một cái gì đó khó hiểu như 234 ..., một số thực sự lớn.
Khái quát nó thay vì như là một hằng số.
Vì vậy, thực sự, nếu bạn đã là hậu môn trong vài tuần qua, bất cứ lúc nào bạn được gọi là getInt,
bạn cần phải có được kiểm tra với một nếu điều kiện đã làm các loại người dùng trong INT_MAX,
hoặc, cụ thể hơn, đã làm INT_MAX trở lại getInt, vì nếu làm vậy,
mà thực sự có nghĩa là họ không gõ nó. Một cái gì đó đã đi sai trong trường hợp này.
Vì vậy, đây là những gì thường được biết đến như một giá trị trọng điểm, mà chỉ có nghĩa đặc biệt.
>> Bây giờ chúng ta hãy trở thành các tập tin c..
Các tập tin C đã tồn tại trong thiết bị một thời gian.
Và trên thực tế, thiết bị có nó trước khi biên dịch cho bạn vào điều đó chúng tôi gọi là mã đối tượng,
nhưng nó chỉ không quan trọng với bạn đó là vì hệ thống biết
trong trường hợp này là: thiết bị.
Hãy di chuyển xuống getInt và xem như thế nào getInt đã làm việc tất cả thời gian.
Ở đây chúng tôi có ý kiến ​​tương tự từ trước.
Hãy để tôi phóng to trên phần chỉ là mã.
Và những gì chúng tôi có cho getInt là sau đây.
Nó không có đầu vào.
Nó trả về một int, trong khi (đúng), do đó, chúng ta có một vòng lặp vô hạn cố ý,
nhưng có lẽ chúng ta sẽ thoát ra khỏi điều này bằng cách nào đó hoặc trở lại từ bên trong.
>> Hãy xem cách làm việc này.
Chúng tôi dường như được sử dụng GetString trong dòng này đầu tiên bên trong vòng lặp, 166.
Điều này bây giờ là thực hành tốt, vì trong hoàn cảnh nào GetString có thể trở lại
NULL từ khóa đặc biệt không? >> [Sinh viên] Nếu có điều gì sai.
Nếu có điều gì sai. Và những gì có thể đi sai khi bạn gọi một cái gì đó giống như GetString?
Yeah. >> [Sinh viên] Malloc không để cho nó ints.
Yeah. Có lẽ malloc không.
Một nơi nào đó bên dưới mui xe, GetString gọi malloc, cấp phát bộ nhớ,
cho phép các cửa hàng máy tính tất cả các nhân vật
mà người dùng gõ vào bàn phím.
Và giả sử người dùng đã có một toàn bộ rất nhiều thời gian miễn phí và gõ nhiều, ví dụ,
hơn 2 tỷ ký tự, nhân vật nhiều hơn máy tính thậm chí còn có bộ nhớ RAM.
GetString để có thể để cho biết rằng cho bạn.
Ngay cả nếu điều này là một trường hợp góc siêu siêu phổ biến,
nó có bằng cách nào đó có thể xử lý này,
và như vậy GetString, nếu chúng ta quay trở lại và đọc tài liệu của nó, không trong NULL trở lại thực tế.
Vì vậy, bây giờ nếu GetString không thành công bằng cách trả về NULL, getInt là thất bại bằng cách trả lại INT_MAX
chỉ như là một trọng điểm. Đây chỉ là quy ước của con người.
Cách duy nhất bạn sẽ biết đây là trường hợp bằng cách đọc các tài liệu hướng dẫn.
>> Hãy di chuyển xuống nơi int thực sự nhận được.
Nếu tôi di chuyển xuống một chút nữa, trong dòng 170, chúng tôi có một bình luận trên những dòng này.
Chúng tôi tuyên bố trong 172 int, n, và một char, c, và sau đó chức năng này mới,
mà một số bạn có vấp trên trước, sscanf.
Điều này là viết tắt cho scanf chuỗi.
Nói cách khác, cho tôi một chuỗi và tôi sẽ quét nó cho các mẩu thông tin quan tâm.
Điều đó có nghĩa là gì?
Giả sử rằng tôi nhập vào, theo nghĩa đen, 123 vào bàn phím và sau đó nhấn Enter.
Các kiểu dữ liệu của 123 khi trở về GetString là gì? >> [Sinh viên] String.
Đó rõ ràng là một chuỗi, phải không? Tôi có một chuỗi.
Vì vậy, 123 là thực sự, báo giá unquote, 123 0 \ kết thúc của nó.
Đó không phải là một int. Đó không phải là một số. Nó trông giống như một số nhưng nó không thực sự.
Vì vậy, getInt những gì phải làm gì?
Nó đã để quét rằng chuỗi trái sang phải - 123 \ 0 - và bằng cách nào đó chuyển đổi một số nguyên thực tế.
Bạn có thể tìm ra cách để làm điều này.
Nếu bạn xem lại đến pset2, bạn có lẽ có một chút thoải mái với Caesar
hoặc Vigenere, vì vậy bạn có thể lặp qua một chuỗi, bạn có thể chuyển đổi các ký tự để ints.
Nhưng heck, đó là một toàn bộ rất nhiều công việc.
Tại sao không gọi một chức năng như sscanf nào đó cho bạn?
Vì vậy, sscanf hy vọng một đối số - trong trường hợp này được gọi là dòng, trong đó là một chuỗi.
Sau đó, bạn chỉ định trong dấu ngoặc kép, rất giống như printf, những gì bạn mong đợi để xem trong chuỗi này.
Và những gì tôi đang nói ở đây là tôi mong đợi để xem một số thập phân và có thể một nhân vật.
Và chúng ta sẽ thấy lý do tại sao điều này là trường hợp trong thời điểm này chỉ là một.
Và nó quay ra rằng ký hiệu này gợi nhớ các công cụ chúng tôi bắt đầu nói về
chỉ hơn một tuần trước đây.
Những gì là & n & c làm cho chúng ta ở đây? >> [Sinh viên] Địa chỉ và địa chỉ của c.
Yeah. Nó đem lại cho tôi địa chỉ của n và địa chỉ của c. Tại sao điều đó lại quan trọng?
Bạn biết rằng với chức năng trong C, bạn luôn có thể trả về một giá trị hoặc không có giá trị ở tất cả.
Bạn có thể quay trở lại một int, một chuỗi, float, char, bất cứ điều gì, hoặc bạn có thể quay trở lại khoảng trống,
nhưng bạn chỉ có thể quay trở lại một điều tối đa.
Nhưng ở đây chúng tôi muốn sscanf để trả lại cho tôi có thể là một int, một số thập phân,
và cũng là một char, và tôi sẽ giải thích lý do tại sao các char trong một thời điểm.
Bạn có hiệu quả muốn sscanf để trở về hai điều, nhưng đó là không thể trong C.
Bạn có thể làm việc xung quanh đó bằng cách đi qua trong hai địa chỉ
bởi vì ngay sau khi bạn trao chức năng hai địa chỉ,
chức năng đó có thể làm gì với họ? >> [Sinh viên] Viết thư cho các địa chỉ.
Nó có thể viết thư đến những địa chỉ.
Bạn có thể sử dụng các hoạt động sao và đi đến đó, với mỗi người trong số những địa chỉ.
Đó là loại cơ chế này cửa trở lại nhưng rất phổ biến để thay đổi giá trị của biến
nhiều hơn chỉ là một nơi - trong trường hợp này, hai.
Bây giờ nhận thấy tôi đang kiểm tra == 1 và sau đó trở về n nếu điều đó không, trên thực tế, đánh giá đúng sự thật.
Vì vậy, những gì đang xảy ra? Về mặt kỹ thuật, tất cả những gì chúng ta thực sự muốn xảy ra trong getInt này.
Chúng tôi muốn phân tích, có thể nói, chúng tôi muốn đọc những chuỗi quote-unquote 123 -
và nếu nó trông giống như có một số đó, những gì chúng ta đang nói sscanf làm
đưa con số đó - 123 - trong biến n cho tôi.
Vậy tại sao sau đó tôi mới thực sự có điều này là tốt?
Vai trò của sscanf nói rằng bạn cũng có thể có được một nhân vật ở đây là gì?
[Không nghe được sinh viên phản ứng] >> Một điểm thập phân có thể thực sự làm việc.
Chúng ta hãy nắm suy nghĩ một lát. Những gì khác?
[Sinh viên] Nó có thể là NULL. >> Suy nghĩ. Nó có thể là các ký tự null.
Nó thực sự không phải trong trường hợp này. Yeah. >> [Sinh viên] ASCII.
ASCII. Hoặc cho tôi khái quát hơn nữa.
C% có chỉ là để kiểm tra lỗi.
Chúng tôi không muốn có được một nhân vật sau khi số lượng,
nhưng điều này cho phép tôi làm là sau đây.
Nó chỉ ra rằng, bên cạnh việc lưu trữ các giá trị trong n và c trong ví dụ này ở đây, sscanf
những gì nó cũng là nó sẽ trả về số lượng các biến đặt các giá trị.
Vì vậy, nếu bạn chỉ gõ ở 123, sau đó chỉ d% để phù hợp với,
và chỉ có n được lưu trữ với một giá trị như 123,
và không có gì được đặt vào c.
C vẫn còn là một giá trị rác, do đó, để nói chuyện -
rác bởi vì nó không bao giờ được khởi tạo một số giá trị.
Vì vậy, trong trường hợp đó, sscanf trả về 1 bởi vì tôi dân số 1 của các con trỏ,
trong trường hợp tuyệt vời, tôi có một int vì vậy tôi giải phóng đường để giải phóng bộ nhớ
GetString đó thực sự được phân bổ, và sau đó tôi trở lại n,
khác nếu bạn đã bao giờ tự hỏi rằng Thử lại tuyên bố đến từ, nó đi kèm từ ngay tại đây.
Vì vậy, nếu, ngược lại, tôi gõ 123foo chỉ là một số chuỗi văn bản ngẫu nhiên -
sscanf sẽ nhìn thấy số lượng, số lượng, số lượng, f,
và nó sẽ đưa số 123 trong n, nó sẽ đặt f trong c và sau đó trở lại 2.
Vì vậy, chúng tôi có, chỉ cần sử dụng các định nghĩa cơ bản của hành vi sscanf, một cách rất đơn giản -
cũng phức tạp ở cái nhìn đầu tiên, nhưng ở cuối của ngày cơ chế khá đơn giản -
nói là có một int và nếu có, là điều duy nhất mà tôi tìm thấy?
Và các khoảng trắng ở đây là có chủ ý.
Nếu bạn đọc các tài liệu cho sscanf, nó nói với bạn rằng nếu bạn bao gồm một mảnh khoảng trắng
ở đầu hoặc cuối cùng, sscanf quá sẽ cho phép người sử dụng, vì lý do gì,
để đạt 123 gian quầy bar và đó sẽ là hợp pháp.
Bạn sẽ không la lên với người sử dụng chỉ vì họ nhấn thanh không gian
ở đầu hoặc cuối cùng, chỉ là một chút thân thiện với người sử dụng.
>> Bất kỳ câu hỏi sau đó trên getInt? Yeah. >> [Sinh viên] Điều gì sẽ xảy ra nếu bạn chỉ cần đặt trong một char?
Tốt câu hỏi.
Điều gì sẽ xảy ra nếu bạn chỉ cần gõ vào một char như f và nhấn Enter mà không cần gõ 123?
Bạn nghĩ gì về hành vi của các dòng mã này sau đó sẽ là?
[Không nghe được sinh viên phản ứng]
Yeah, vì vậy sscanf có thể bao gồm điều đó bởi vì trong trường hợp đó, nó sẽ không để điền vào n c.
Nó sẽ thay vì trở về 0, trong trường hợp này tôi cũng bắt đó kịch bản
bởi vì giá trị kỳ vọng tôi muốn là 1.
Tôi chỉ muốn một và chỉ có một điều để được làm đầy. Tốt câu hỏi.
>> Những người khác? Được rồi.
>> Chúng ta không đi qua tất cả các chức năng ở đây,
nhưng một trong đó có vẻ là có thể quan tâm còn lại là GetString
bởi vì nó chỉ ra rằng GetFloat, getInt, GetDouble, GetLongLong
tất cả punt rất nhiều các chức năng của họ để GetString.
Vì vậy, chúng ta hãy xem xét làm thế nào ông được thực hiện ở đây.
Điều này có vẻ phức tạp một chút, nhưng nó sử dụng cùng một nguyên tắc cơ bản
chúng tôi bắt đầu nói về tuần trước.
GetString, trong đó có không có đối số theo khoảng trống ở đây
và nó trả về một chuỗi, tôi dường như đang tuyên bố một chuỗi được gọi là bộ đệm.
Tôi không thực sự biết đó là những gì sẽ được sử dụng cho nêu ra, nhưng chúng ta sẽ thấy.
Có vẻ như dung lượng mặc định 0.
Không khá chắc chắn nơi này là đi, không chắc chắn những gì n được sẽ được sử dụng cho nêu ra,
nhưng bây giờ nó nhận được một chút thú vị hơn.
Trong dòng 243, chúng ta khai báo một int, c.
Đây là một chi tiết ngu ngốc.
Char là 8 bit, và 8 bit có thể lưu trữ bao nhiêu giá trị khác nhau? >> [Sinh viên] 256. >> 256.
Vấn đề là nếu bạn muốn có 256 ký tự ASCII khác nhau, trong đó có
nếu bạn nghĩ trở lại - và điều này không phải là một cái gì đó để ghi nhớ.
Nhưng nếu bạn nghĩ rằng biểu đồ ASCII lớn chúng tôi đã có tuần trước,
trong trường hợp đó 128 hoặc 256 ký tự ASCII.
Chúng tôi sử dụng tất cả các mẫu lên 0 và 1.
Đó là một vấn đề nếu bạn muốn để có thể phát hiện một lỗi
bởi vì nếu bạn đã sử dụng 256 giá trị cho nhân vật của bạn,
bạn đã không thực sự lập kế hoạch trước bởi vì bây giờ bạn không có cách nói,
đây không phải là một nhân vật VN, đây là một số thông báo sai lầm.
Vì vậy, những gì thế giới là họ sử dụng giá trị lớn nhất tiếp theo, một cái gì đó giống như một int,
để bạn có một số điên bit, 32, 4 tỷ giá trị có thể
vì vậy bạn chỉ có thể kết thúc bằng cách sử dụng cơ bản 257 của họ,
1 trong tổng số đó có một số ý nghĩa đặc biệt như là một lỗi.
>> Vì vậy, chúng ta hãy xem cách làm việc này.
Trong dòng 246, tôi có vòng lặp trong khi lớn này được gọi fgetc,
f có nghĩa là tập tin, vì vậy getc, và sau đó stdin.
Hóa ra đây chỉ là cách chính xác hơn nói đọc dữ liệu vào từ bàn phím.
Phương tiện đầu vào bàn phím tiêu chuẩn, tiêu chuẩn đầu ra có nghĩa là màn hình,
và tiêu chuẩn lỗi, mà chúng ta sẽ thấy trong pset4, có nghĩa là màn hình
nhưng một phần đặc biệt của màn hình để nó không conflated với sản lượng thực tế
mà bạn dự định in. Nhưng thêm vào đó trong tương lai.
Vì vậy, fgetc chỉ có nghĩa là đọc một ký tự từ bàn phím và lưu nó ở đâu?
Lưu trữ nó trong c.
Và sau đó kiểm tra - vì vậy tôi chỉ sử dụng một số liên từ Boolean -
kiểm tra xem nó không bằng \ n, do đó, người dùng đã nhấn Enter, chúng tôi muốn dừng lại tại thời điểm đó,
kết thúc vòng lặp và chúng tôi cũng muốn kiểm tra cho EOF hằng số đặc biệt,
nếu bạn biết hoặc đoán, những gì đứng cho? >> [Sinh viên] End of file. Cuối >> của tập tin.
Đây là loại vô nghĩa bởi vì nếu tôi gõ vào bàn phím,
có thực sự không có tập tin liên quan đến điều này,
nhưng điều này chỉ là sắp xếp của thuật ngữ chung được sử dụng để có nghĩa là
rằng không có gì khác là đến từ các ngón tay của con người.
EOF - cuối của tập tin.
Là một sang một bên, nếu bạn đã từng nhấn Control D vào bàn phím của bạn, không phải là bạn sẽ có được nêu ra -
bạn đã nhấn Control C - Control D gửi hằng số đặc biệt này được gọi là EOF.
Vì vậy, bây giờ chúng tôi chỉ có một số cấp phát bộ nhớ động.
>> Vì vậy, nếu (n + 1> công suất). Bây giờ tôi sẽ giải thích n.
N chỉ là bao nhiêu byte hiện trong bộ đệm,
chuỗi mà bạn đang xây dựng từ người sử dụng.
Nếu bạn có thêm nhiều nhân vật trong bộ đệm của bạn hơn bạn có năng lực trong bộ đệm,
trực giác những gì chúng tôi cần làm sau đó được phân bổ nhiều dung lượng hơn.
Vì vậy, tôi sẽ lướt qua một số của số học ở đây và chỉ tập trung vào chức năng này ở đây.
Bạn biết những gì malloc hoặc ít nhất là nói chung quen thuộc.
Hãy đoán những gì realloc không. >> [Sinh viên] Thêm bộ nhớ.
Nó không khá thêm bộ nhớ. Nó reallocates bộ nhớ như sau.
Nếu vẫn còn có phòng ở cuối của chuỗi cung cấp cho bạn nhiều hơn của bộ nhớ mà
hơn so với ban đầu cung cấp cho bạn, sau đó bạn sẽ nhận được rằng bộ nhớ bổ sung.
Vì vậy, bạn chỉ có thể tiếp tục đưa nhân vật của chuỗi trở lại trở lại để sao lưu để sao lưu.
Nhưng nếu đó không phải là trường hợp bởi vì bạn chờ đợi quá lâu
và một cái gì đó ngẫu nhiên đã ngồi phịch trong bộ nhớ
nhưng có thêm bộ nhớ xuống đây, đó là okay.
Realloc sẽ làm tất cả những nâng nặng cho bạn,
di chuyển các chuỗi bạn đã đọc vậy, đến nay ở đây, đặt nó xuống đó,
và sau đó cung cấp cho bạn đường băng tại điểm đó một số chi tiết.
>> Vì vậy, với một làn sóng của bàn tay, cho tôi nói rằng những gì GetString đang làm
là nó bắt đầu với một bộ đệm nhỏ, có thể là một nhân vật duy nhất,
và nếu người sử dụng các loại trong hai nhân vật, GetString kết thúc lên gọi realloc và nói
một trong những nhân vật là không đủ, cho tôi hai nhân vật.
Sau đó, nếu bạn đọc thông qua logic của vòng lặp, nó sẽ nói
người sử dụng gõ vào 3 ký tự; cho tôi bây giờ không 2 nhưng 4 ký tự,
sau đó cung cấp cho tôi 8, sau đó đưa cho tôi 16 và 32.
Thực tế là tôi đang tăng gấp đôi công suất mỗi lần
có nghĩa là các bộ đệm sẽ không phát triển chậm, nó sẽ phát triển cực nhanh.
Và những gì có thể lợi dụng điều đó?
Tại sao tôi tăng gấp đôi kích thước của bộ đệm
cho dù người dùng chỉ có thể cần thêm một ký tự từ bàn phím?
[Sinh viên phản ứng không nghe được] >> đó là gì? >> [Sinh viên] Bạn không cần phải phát triển nó thường xuyên.
Chính xác. Bạn không cần phải phát triển nó thường xuyên.
Và đây chỉ là loại bạn đang bảo hiểm rủi ro cược của bạn ở đây,
Ý tưởng được rằng bạn không muốn gọi realloc rất nhiều bởi vì nó có xu hướng được làm chậm.
Bất cứ lúc nào bạn yêu cầu hệ thống hoạt động cho bộ nhớ,
như bạn sẽ thấy trong một loạt vấn đề trong tương lai, nó có xu hướng mất một thời gian.
Vì vậy, giảm thiểu số tiền đó của thời gian, ngay cả khi bạn đang lãng phí một số không gian,
có xu hướng là một điều tốt.
>> Nhưng nếu chúng ta đọc qua phần cuối cùng của getString đây -
và một lần nữa sự hiểu biết tất cả các dòng duy nhất ở đây không phải là quá quan trọng ngày hôm nay -
nhận thấy rằng nó cuối cùng một lần nữa gọi malloc
và phân bổ chính xác như nhiều byte như nó cần cho chuỗi
và sau đó ném đi bằng cách gọi điện thoại miễn phí các bộ đệm quá lớn
nếu nó thực sự đã tăng gấp đôi quá nhiều lần.
Vì vậy, trong ngắn hạn, đó là cách GetString đã được làm việc tất cả thời gian.
Tất cả nó là đọc một ký tự tại một thời điểm một lần nữa và một lần nữa và một lần nữa,
và mỗi khi nó cần một số bộ nhớ bổ sung, nó yêu cầu hệ điều hành cho nó
bằng cách gọi realloc.
>> Bất kỳ câu hỏi nào? Được rồi.
>> Một cuộc tấn công.
Bây giờ chúng ta hiểu con trỏ hoặc ít nhất đang ngày càng quen thuộc với con trỏ,
chúng ta hãy xem xét làm thế nào trên toàn thế giới bắt đầu sụp đổ
nếu bạn không hoàn toàn bảo vệ chống lại người dùng đối lập,
những người đang cố gắng để hack vào hệ thống của bạn,
những người đang cố gắng để ăn cắp phần mềm của bạn bằng cách phá vỡ một số mã đăng ký
rằng họ nếu không có thể phải gõ vào
>> Hãy xem ví dụ này ở đây, mà chỉ là mã C mà có một chức năng chính ở phía dưới
mà các cuộc gọi một foo chức năng. Và đó là những gì đi qua để foo?
[Sinh viên] đối số duy nhất. >> [Malan] đối số duy nhất.
Vì vậy, argv [1], có nghĩa là từ đầu tiên mà người dùng gõ vào dòng lệnh
sau khi a.out hoặc bất cứ điều gì chương trình được gọi.
Vì vậy, foo ở đầu trang có một char *. Nhưng char * chỉ là những gì? >> [Sinh viên] Một chuỗi.
[Malan] Một chuỗi, do đó, không có gì mới ở đây.
Đó là chuỗi tùy tiện được gọi là bar.
Trong dòng này ở đây, char c [12]; loại bán kỹ thuật, dòng này là làm gì?
[Sinh viên] Một mảng - >> Array of? >> [Sinh viên] Tính cách. >> Tính cách.
Hãy cho tôi một mảng 12 ký tự. Vì vậy, chúng ta có thể gọi đây là một bộ đệm.
Nó được gọi là kỹ thuật c, nhưng một bộ đệm trong chương trình chỉ có nghĩa là một loạt các không gian
rằng bạn có thể đặt một số công cụ.
Sau đó, cuối cùng, memcpy chúng tôi đã không được sử dụng trước đây, nhưng bạn có thể đoán những gì nó làm.
Nó sao chép bộ nhớ. Làm gì?
Nó dường như bản sao thanh, đầu vào của nó, vào c nhưng chỉ lên đến chiều dài của thanh.
Nhưng có một lỗi ở đây. >> [Sinh viên] Bạn cần nhân vật sizeof. >> Okay.
Về mặt kỹ thuật, chúng tôi thực sự cần phải làm strlen (bar) * sizeof (char)). Đó là chính xác.
Nhưng trong trường hợp xấu nhất ở đây, chúng ta hãy giả định rằng Đó -
Okay. Sau đó có hai lỗi.
Vì vậy, sizeof (char));
Hãy để thực hiện điều này rộng hơn một chút.
Vì vậy, bây giờ vẫn còn một lỗi, đó là những gì? >> [Không nghe được sinh viên phản ứng]
Kiểm tra cho những gì? >> [Sinh viên] Kiểm tra NULL.
Chúng tôi nói chung nên được kiểm tra NULL vì điều xấu xảy ra
khi con trỏ của bạn là NULL bởi vì bạn có thể kết thúc đến đó,
và bạn sẽ không bao giờ được NULL bởi dereferencing nó với các nhà điều hành sao.
Vì vậy, đó là tốt. Và những gì khác chúng ta đang làm gì? Logic, có một lỗ hổng ở đây quá.
[Sinh viên] Kiểm tra nếu argc là> = 2.
Vì vậy, kiểm tra nếu argc là> = 2. Được rồi, do đó, có ba lỗi trong chương trình này ở đây.
Bây giờ chúng tôi đang kiểm tra nếu người sử dụng thực sự gõ vào bất cứ điều gì vào argv [1]. Tốt.
Vì vậy, các lỗi thứ ba là những gì? Yeah. >> [Sinh viên] C có thể không đủ lớn.
Tốt. Chúng tôi đã kiểm tra một kịch bản.
Chúng tôi ngầm kiểm tra không sao chép bộ nhớ nhiều hơn sẽ vượt quá chiều dài của thanh.
Vì vậy, nếu các chuỗi người dùng gõ dài là 10 ký tự,
điều này được nói chỉ sao chép 10 ký tự. Và đó là okay.
Nhưng nếu những gì người dùng gõ vào một từ tại dấu nhắc như một từ 20-ký tự?
Điều này nói sao chép 20 ký tự từ thanh vào những gì?
C, nếu không được biết đến như một bộ đệm của chúng tôi, có nghĩa là bạn chỉ cần viết dữ liệu
8 địa điểm byte mà bạn không sở hữu,
và bạn không sở hữu chúng trong ý nghĩa rằng bạn không bao giờ được giao cho họ.
Vì vậy, đây là những gì thường được gọi là cuộc tấn công tràn bộ đệm hoặc tấn công tràn bộ đệm.
Và đó là một cuộc tấn công trong ý nghĩa rằng nếu người dùng hoặc chương trình đó là chức năng gọi điện thoại của bạn
là làm điều này độc hại, những gì thực sự xảy ra tiếp theo thực sự có thể là khá xấu.
>> Vì vậy, chúng ta hãy nhìn vào bức tranh này ở đây.
Bức ảnh này đại diện cho ngăn xếp của bạn bộ nhớ.
Nhớ lại rằng mỗi khi bạn gọi một chức năng, bạn sẽ có được khung nhỏ trên stack
và sau đó một và sau đó một khác.
Cho đến nay, chúng tôi đã chỉ cần loại trừu tượng này như hình chữ nhật
hoặc trên bảng hoặc trên màn hình ở đây.
Nhưng nếu chúng ta phóng to trên một trong những hình chữ nhật đó, khi bạn gọi một foo chức năng,
nó quay ra rằng có nhiều ở bên trong ngăn xếp của khung đó trong hình chữ nhật đó
hơn chỉ x và y và a và b, như chúng tôi đã nói về trao đổi.
Nó chỉ ra rằng có một số chi tiết cấp thấp hơn, trong số đó trở về địa chỉ.
Vì vậy, nó quay ra khi chính gọi foo, chính có thông báo foo
địa chỉ chính là trong bộ nhớ của máy tính
bởi vì nếu không, ngay như foo được thực hiện thực hiện, như trong trường hợp này đây,
một khi bạn đạt được cú đúp đóng xoăn ở phần cuối của foo,
làm thế nào heck foo biết nơi mà sự kiểm soát của chương trình là vụ phải đi?
Nó chỉ ra rằng câu trả lời cho câu hỏi đó là trong hình chữ nhật màu đỏ ở đây.
Điều này thể hiện một con trỏ, và nó vào máy tính để lưu trữ tạm thời
trên stack được gọi là địa chỉ của chính vì vậy mà ngay sau khi foo được thực hiện thực hiện,
máy tính biết đâu và những gì dòng chính để trở lại.
Con trỏ Khung hình lưu liên quan tương tự như này.
Char * bar ở đây đại diện cho những gì?
Bây giờ phân khúc này màu xanh ở đây là của khung foo. Thanh là gì?
Bar chỉ là đối số cho foo chức năng.
Vì vậy, bây giờ chúng tôi đang trở lại sắp xếp của các hình ảnh quen thuộc.
Có nhiều công cụ và phiền nhiễu nhiều hơn trên màn hình,
nhưng phân khúc này ánh sáng màu xanh chỉ là những gì chúng tôi đã được vẽ lên bảng
cho một cái gì đó như trao đổi. Đó là khung cho foo.
Và điều duy nhất trong đó ngay bây giờ là bar, đó là tham số này.
Nhưng những gì khác phải ở trong ngăn xếp theo mã này ở đây?
[Sinh viên] char c [12]. >> [Malan] char c [12].
Chúng ta cũng nên xem 12 hình vuông của cấp phát bộ nhớ cho một biến được gọi là c,
và thực sự chúng tôi có trên màn hình.
Đầu rất có c [0], và sau đó là tác giả của sơ đồ này
không bận tâm vẽ tất cả các hình vuông, nhưng có thực sự 12 có
bởi vì nếu bạn nhìn vào góc dưới bên phải, c [11] nếu bạn đếm từ 0 byte như vậy 12.
Nhưng đây là vấn đề.
Trong đó hướng c ngày càng tăng?
Sắp xếp các từ trên xuống nếu nó bắt đầu ở đầu trang và phát triển xuống dưới.
Nó không giống như chúng tôi rời bản thân đường băng nhiều ở đây cả.
Chúng tôi đã loại sơn mình vào một góc,
và c [11] là phải lên chống lại bar, mà là phải lên chống lại con trỏ Khung hình lưu,
đó là phải lên chống lại Quay lại Địa chỉ. Có không còn chỗ.
Vì vậy, ý nghĩa của những gì sau đó nếu bạn vít lên
và bạn cố gắng đọc 20 byte vào một bộ đệm 12-byte?
Đâu những 8 byte bổ sung sẽ đi đâu? >> [Sinh viên] Inside -
Bên trong mọi thứ khác, một số trong đó là siêu quan trọng.
Và điều quan trọng nhất, có khả năng, là hộp màu đỏ ở đó, trở về địa chỉ,
vì giả sử rằng bạn có vô tình hoặc adversarially ghi đè lên những 4 byte,
địa chỉ con trỏ, không chỉ với rác nhưng với một số
điều đó xảy ra để đại diện cho một địa chỉ thực trong bộ nhớ.
Ý nghĩa là gì, một cách logic không? >> [Sinh viên] Chức năng sẽ trở về một nơi khác.
Chính xác.
Khi foo trả về và số truy cập mà xoăn cú đúp, chương trình sẽ tiến hành
không quay trở lại, nó sẽ quay trở lại bất cứ địa chỉ trong hộp màu đỏ.
>> Trong trường hợp đăng ký phần mềm phá vỡ,
những gì nếu các địa chỉ đó là được trở lại là chức năng bình thường được gọi là
sau khi bạn đã trả tiền cho phần mềm và inputted mã đăng ký của bạn?
Bạn có thể sắp xếp lừa máy tính vào sẽ không ở đây nhưng thay vì đi lên.
Hoặc nếu bạn thực sự thông minh, một đối thủ thực sự có thể gõ vào bàn phím, ví dụ,
không phải là một từ thực tế, không phải là 20 ký tự, nhưng giả sử họ thực sự loại trong
một số ký tự đại diện cho mã.
Và nó sẽ không phải là mã C, nó thực sự sẽ là ký tự
đại diện cho các mã máy nhị phân 0 và 1.
Nhưng giả sử họ đủ thông minh để làm điều đó,
bằng cách nào đó dán vào một cái gì đó nhanh chóng GetString đó là cơ bản biên dịch mã,
và 4 byte cuối cùng ghi đè lên địa chỉ trả lại.
Và những gì địa chỉ nào mà đầu vào làm gì?
Nó thực sự lưu trữ trong địa chỉ của byte đầu tiên của bộ đệm hình chữ nhật màu đỏ.
Vì vậy, bạn phải thực sự thông minh, và điều này là rất nhiều thử và sai cho những người xấu ra khỏi đó,
nhưng nếu bạn có thể tìm ra bộ đệm này lớn như thế nào
như vậy mà các byte cuối cùng trong đầu vào bạn cung cấp cho chương trình
xảy ra được tương đương với địa chỉ bắt đầu của bộ đệm của bạn, bạn có thể làm điều này.
Nếu chúng ta nói bình thường chào hỏi nhau và \ 0, đó là những gì kết thúc trong bộ đệm.
Nhưng nếu chúng ta thông minh hơn và chúng tôi điền vào đó bộ đệm với những gì chúng ta tổng quát sẽ gọi mã tấn công -
AAA, tấn công, tấn công, tấn công - nơi đây chỉ là một cái gì đó mà làm một cái gì đó xấu,
những gì sẽ xảy ra nếu bạn thực sự thông minh, bạn có thể làm điều này.
Trong hộp màu đỏ ở đây là một dãy số - 80, C0, 35, 08.
Chú ý rằng đó phù hợp với số ở đây.
Đó là theo thứ tự ngược, nhưng thêm vào một số thời gian mà các.
Chú ý rằng địa chỉ này trở lại đã được cố tình thay đổi
bằng địa chỉ lên đây, không phải là địa chỉ chính.
Vì vậy, nếu kẻ xấu là siêu thông minh, anh ta hoặc cô ấy sẽ bao gồm trong đó mã tấn công
một cái gì đó như xóa tất cả các tập tin của người sử dụng hoặc sao chép các mật khẩu
hoặc tạo ra một tài khoản người dùng mà tôi sau đó có thể đăng nhập vào bất cứ điều gì ở tất cả.
>> Và điều này là nguy hiểm và quyền lực của C.
Bởi vì bạn có thể truy cập vào bộ nhớ thông qua con trỏ
và do đó bạn có thể viết bất cứ điều gì bạn muốn vào bộ nhớ của máy tính,
bạn có thể làm cho một máy tính làm bất cứ điều gì bạn muốn
chỉ đơn giản bằng khi nó nhảy xung quanh trong không gian bộ nhớ riêng của mình.
Và như vậy cho đến ngày nay rất nhiều chương trình và rất nhiều trang web đang bị tổn hại
đun sôi xuống để những người lợi dụng điều này.
Và điều này có thể có vẻ giống như một siêu tấn công tinh vi, nhưng nó không luôn luôn bắt đầu theo cách đó.
Thực tế là những gì người xấu thường sẽ làm,
cho dù đó là một chương trình tại một dòng lệnh hoặc một chương trình GUI hoặc một trang web,
bạn chỉ cần bắt đầu cung cấp vô nghĩa.
Bạn gõ vào một từ thực sự lớn vào lĩnh vực tìm kiếm và nhấn Enter,
và bạn chờ đợi để xem nếu trang web bị treo
hoặc bạn chờ đợi để xem chương trình thể hiện một số thông báo lỗi
bởi vì nếu bạn nhận được may mắn như kẻ xấu và bạn cung cấp một số đầu vào điên
mà treo chương trình, điều đó có nghĩa là các lập trình viên đã không dự đoán hành vi xấu của bạn,
có nghĩa là bạn có thể có thể là đủ với nỗ lực, dùng thử đủ và lỗi,
tìm ra cách để tiến hành một cuộc tấn công chính xác hơn.
Vì vậy, nhiều một phần của an ninh không chỉ là tránh các cuộc tấn công hoàn toàn
nhưng phát hiện chúng và thực sự nhìn vào các bản ghi
và nhìn thấy những gì các yếu tố đầu vào điên có người gõ vào trang web của bạn,
những thuật ngữ tìm kiếm có người gõ vào trang web của bạn
với hy vọng tràn một số bộ đệm.
Và tất cả điều này nắm những điều cơ bản đơn giản của những gì là một mảng
và nó có ý nghĩa gì để phân bổ và sử dụng bộ nhớ.
>> Liên quan đến mà sau đó cũng là.
Hãy chỉ lướt qua bên trong của một ổ đĩa cứng một lần nữa.
Bạn nhớ lại từ một hoặc hai tuần trước khi bạn kéo các tập tin vào thùng rác hoặc thùng rác,
những gì sẽ xảy ra? >> [Sinh viên] Không có gì. >> Tuyệt đối không có gì, phải không?
Cuối cùng, nếu bạn chạy thấp trên không gian đĩa,
Windows hay Mac OS sẽ bắt đầu xóa các tập tin cho bạn.
Nhưng nếu bạn kéo một cái gì đó trong đó, đó không phải là an toàn ở tất cả.
Tất cả bạn cùng phòng của bạn hoặc bạn bè hoặc thành viên gia đình đã làm được nhấp đúp chuột vào và thì đấy,
có tất cả các tập tin sơ sài mà bạn cố gắng để xóa.
Hầu hết chúng ta ít nhất biết rằng bạn phải click chuột phải hoặc Kiểm soát nhấp chuột
và trống rỗng thùng rác hoặc một cái gì đó như thế.
Nhưng thậm chí sau đó mà không hoàn toàn làm các trick
bởi vì những gì sẽ xảy ra khi bạn có một tập tin trên ổ cứng của bạn
đại diện cho một số tài liệu Word hoặc một số JPEG, và điều này đại diện cho ổ đĩa cứng của bạn,
và chúng ta hãy nói này mảnh ở đây đại diện cho tập tin đó,
và nó bao gồm một bó toàn bộ 0 và 1.
Điều gì sẽ xảy ra khi bạn không chỉ kéo tập tin đó vào thùng rác hoặc có thể tái chế bin
nhưng cũng có sản phẩm nào đó? Sắp xếp không có gì.
Nó không phải hoàn toàn không có gì.
Bây giờ nó chỉ là không có gì bởi vì một chút gì đó xảy ra trong các hình thức của bảng này.
Vì vậy, có một số loại cơ sở dữ liệu hoặc bảng bên trong bộ nhớ của máy vi tính
mà về cơ bản có một cột cho tên file và một cho các tập tin 'vị trí cột,
nơi này có thể là vị trí 123, chỉ cần một số ngẫu nhiên.
Vì vậy, chúng ta có thể có một cái gì đó như x.jpeg và vị trí 123.
Điều gì sẽ xảy ra sau đó khi bạn thực sự trống thùng rác của bạn?
Mà đi xa.
Nhưng những gì không đi là 0 và 1.
>> Vì vậy, những gì sau đó kết nối để pset4?
Vâng, với pset4, chỉ vì chúng tôi đã vô tình xóa thẻ flash nhỏ gọn
đã có tất cả các hình ảnh hay vì họ không may mắn trở thành hỏng
không có nghĩa là 0 và số 1 không phải là vẫn còn đó.
Có lẽ một vài trong số họ bị mất vì một cái gì đó đã bị hỏng
trong ý nghĩa rằng một số số 0 trở thành số 1 và số 1 trở thành số 0.
Những điều xấu có thể xảy ra do lỗi của phần mềm hay phần cứng bị lỗi.
Nhưng nhiều người trong số những bit, có thể thậm chí 100% trong số họ, vẫn còn đó.
Nó chỉ là máy tính hoặc máy ảnh không biết nơi JPEG1 bắt đầu
và nơi JPEG2 bắt đầu.
Nhưng nếu bạn, lập trình, biết với một chút hiểu biết về nơi mà những hình ảnh JPEG
hoặc những gì họ trông như thế để bạn có thể phân tích các ảnh JPEG 0 và 1 và nói, JPEG,
bạn có thể viết một chương trình với thực chất chỉ là một vòng lặp trong khi
phục hồi mỗi một trong những tập tin.
Vì vậy, bài học sau đó là bắt đầu an toàn tẩy xoá các tập tin của bạn
nếu bạn muốn tránh hiện tượng này. Vâng.
>> [Sinh viên] Làm thế nào đến nó nói trên máy tính của bạn
rằng bạn có nhiều bộ nhớ hơn so với trước khi?
Có nhiều bộ nhớ hơn so với trước khi - >> [sinh viên] Thêm bộ nhớ có sẵn.
Oh. Tốt câu hỏi.
Vậy tại sao sau đó sau khi dọn sạch thùng rác máy tính của bạn cho bạn biết
rằng bạn có không gian tự do hơn so với trước khi?
Tóm lại, bởi vì nó nói dối.
Về mặt kỹ thuật, bạn có thêm không gian bởi vì bây giờ bạn đã nói
bạn có thể đặt các công cụ khác, nơi mà tập tin một lần.
Nhưng điều đó không có nghĩa là các bit được đi xa,
và điều đó không có nghĩa là các bit được thay đổi để tất cả các số 0, ví dụ,
để bảo vệ bạn.
Vì vậy, ngược lại, nếu bạn xóa an toàn các tập tin hoặc sức phá hủy các thiết bị,
đó thực sự là cách duy nhất đôi khi xung quanh đó.
>> Vì vậy, tại sao chúng ta không để lại lưu ý rằng bán đáng sợ, và chúng ta sẽ thấy bạn vào hôm thứ Hai.
[Vỗ tay]
>> [CS50.TV]