1 00:00:00,000 --> 00:00:02,860 [Powered by Google Translate] [주 5] 2 00:00:02,860 --> 00:00:04,860 [데이비드 J. Malan - 하버드 대학교 (Harvard University)] 3 00:00:04,860 --> 00:00:07,260 [이 CS50입니다. - CS50.TV] 4 00:00:07,260 --> 00:00:09,740 >> 이 CS50, 주 5입니다. 5 00:00:09,740 --> 00:00:12,900 오늘 이번 주, 우리는 법의학의 세계 약간의 소개 6 00:00:12,900 --> 00:00:14,850 문제의 맥락에서 4로 설정합니다. 7 00:00:14,850 --> 00:00:18,480 여기에 특별한 이벤트가 나중에 있기 때문에 오늘은 간략 강의 될 것입니다. 8 00:00:18,480 --> 00:00:21,940 그래서 우리는 들여다 봐도 학생 및 학부모 모두 오늘날 모두를 애타게합니다 9 00:00:21,940 --> 00:00:24,600 수평선에있는 몇 가지가 있습니다. 10 00:00:24,600 --> 00:00:29,050 >> 그중 월요일로, 당신은 몇 친구들을 갖게됩니다. 11 00:00:29,050 --> 00:00:32,980 edX, 하버드와 OpenCourseWare 등에 대한 MIT의 새로운 온라인 사업, 12 00:00:32,980 --> 00:00:36,730 월요일마다와 의미 월요일에 하버드의 캠퍼스에서 시작된다 13 00:00:36,730 --> 00:00:40,930 당신은 마지막으로 백작의로 86,000 추가 급우를해야합니다 14 00:00:40,930 --> 00:00:43,680 CS50의 강의와 섹션과 사람을 함께 따라 될 것입니다 15 00:00:43,680 --> 00:00:45,890 그리고 연습 및 문제 세트. 16 00:00:45,890 --> 00:00:51,870 그리고이의 일환으로, 당신은 CS50 지금 CS50x의 창립 클래스의 멤버가됩니다. 17 00:00:51,870 --> 00:00:56,150 이 일환으로, 지금뿐만 아니라 몇 가지 나름의​​ 매력이있을 것 알고 있습니다. 18 00:00:56,150 --> 00:01:00,620 학생들의 거대한 수에,이에 대한 준비를하기 위해, 19 00:01:00,620 --> 00:01:03,820 말하면 우리는 108 TFS와 인증 기관 (CA)을하더라도, 20 00:01:03,820 --> 00:01:07,560 우리는 학생들의 80,000를 누르되면 그건 정말 최고의 학생 교사 비율 아닙니다. 21 00:01:07,560 --> 00:01:09,830 우리는 수동으로 설정 많은 문제를 등급 않을 테니까요 22 00:01:09,830 --> 00:01:13,050 그래서 문제 세트에 이번 주에 소개가 CS50 확인 될 것입니다 23 00:01:13,050 --> 00:01:15,410 어플라이언스 명령 줄 유틸리티가 될 것입니다 어떤 24 00:01:15,410 --> 00:01:17,880 이 주말 나중에 업데이트하면 당신이 해줄. 25 00:01:17,880 --> 00:01:21,030 당신은 자신의 pset에 명령 check50를 실행 할 수 있습니다 26 00:01:21,030 --> 00:01:24,770 당신은 프로그램이 문제를 해결하거나 잘못 여부를 즉시 피드백을 얻을합니다 27 00:01:24,770 --> 00:01:27,980 우리가 제공 한 다양한 디자인의 사양에 따라. 28 00:01:27,980 --> 00:01:30,310 문제 세트 사양에 해당에 대한 자세한. 29 00:01:30,310 --> 00:01:34,220 CS50x 친구들도이를 사용합니다. 30 00:01:34,220 --> 00:01:36,170 >> 문제 세트 4, 모든 과학 수사에 관한 31 00:01:36,170 --> 00:01:38,630 이 pset은 정말 진짜 생활 것들에서 영감을 얻었습니다 32 00:01:38,630 --> 00:01:41,210 상기 제가 대학원에있을 때 잠시 동안 인턴 33 00:01:41,210 --> 00:01:45,270 미들 카운티의 지방 검사 사무실 법정 일을하고있는 34 00:01:45,270 --> 00:01:47,660 자신의 리드 법정 수사관이 있습니다. 35 00:01:47,660 --> 00:01:50,280 내가 몇 주 지난 이야기했던 것처럼이게,에 달한다 36 00:01:50,280 --> 00:01:52,720 대량 주 경찰 또는 다른에서 올 거라고합니다 37 00:01:52,720 --> 00:01:56,150 그들은 하드 드라이브 및 CD 및 플로피 디스크와 같은 등을 내려 것 38 00:01:56,150 --> 00:01:58,770 다음 법의학 사무소의 목표는 확인할 것이 었습니다 39 00:01:58,770 --> 00:02:01,470 가 발생했습니다 또는 어떤 종류의 증거 아니 었 여부. 40 00:02:01,470 --> 00:02:04,730 이 특별 조사 단위이었고, 때문에 화이트 칼라 범죄 죠. 41 00:02:04,730 --> 00:02:10,949 그것은 범죄보다 문제가 많은 종류의, 디지털 미디어의 일부 종류를 포함하는 어떤이었다. 42 00:02:10,949 --> 00:02:16,450 그것은 많은 사람들이 말하는 이메일을 작성하지 않는 것이, "내가 했어요."고 밝혀 43 00:02:16,450 --> 00:02:20,490 꽤 자주,이 법정 검색, 모든 많은 열매를 발견하지 못했어요 44 00:02:20,490 --> 00:02:22,820 때때로 사람들은 이와 같은 이메일을 작성합니다. 45 00:02:22,820 --> 00:02:25,240 그래서 때로는 노력을 보상했다. 46 00:02:25,240 --> 00:02:31,210 >> 그러나이 법정 pset에, 우리는 pset4에서 그래픽의 비트를 도입됩니다까지 이어질 수 있습니다. 47 00:02:31,210 --> 00:02:35,410 당신은 아마 당연한 이런 일을 - JPEG 파일, GIF를, 그리고 같은이 -이 일. 48 00:02:35,410 --> 00:02:38,320 하지만 사실 생각해 보면, 이미지, 훨씬 롭의 얼굴처럼 49 00:02:38,320 --> 00:02:41,270 점 또는 픽셀의 순서로 모델링 할 수있다. 50 00:02:41,270 --> 00:02:43,380 롭의 얼굴의 경우, 색상의 모든 종류가있다 51 00:02:43,380 --> 00:02:46,760 우리는, 그렇지 않으면 픽셀로 알려진 개인 점을 볼 시작 52 00:02:46,760 --> 00:02:48,610 우리가 '확대 시작 53 00:02:48,610 --> 00:02:54,660 그러나 우리는 세상을 조금 단순화하고 그냥이 여기에 검은 색과 흰색의 로브 그런 말을한다면, 54 00:02:54,660 --> 00:02:57,490 검은 색과 흰색을 표현하기 위해, 우리는 바이너리를 사용할 수 있습니다. 55 00:02:57,490 --> 00:03:01,660 그리고 우리가 바이너리를 사용하려고하는 경우, 1 또는 0, 우리는이 같은 이미지를 표현할 수 56 00:03:01,660 --> 00:03:06,140 비트의 패턴 롭의 웃는 얼굴을. 57 00:03:06,140 --> 00:03:12,100 11,000,011 흰색, 흰색, 검정, 검정, 검정, 검정, 흰색, 흰색 나타냅니다. 58 00:03:12,100 --> 00:03:16,150 그리고 이제 화려한 사진에 대해 얘기를 시작하기 위해 다음 큰 도약 아닙니다 59 00:03:16,150 --> 00:03:18,600 당신은 페이스 북에서 볼 또는 디지털 카메라로 걸릴 거라고 것들. 60 00:03:18,600 --> 00:03:21,410 그러나 확실하게 그 색상에 관해서는, 당신은 더 많은 비트가 필요합니다. 61 00:03:21,410 --> 00:03:25,690 그리고 사진의 세계의 매우 일반적인, 안 1 비트 색상을 사용하는 것입니다 62 00:03:25,690 --> 00:03:29,560 이 제안하지만, 24 비트 컬러, 실제로는 색상 수백만을 곳.로 63 00:03:29,560 --> 00:03:32,250 그래서 우리는 롭의 눈에 확대했을 때의 경우에서와 같이, 64 00:03:32,250 --> 00:03:36,370 그 서로 다른 다채로운 가능성 수백만의 숫자했습니다. 65 00:03:36,370 --> 00:03:39,040 그래서 우리는, 문제 설정 4뿐만 아니라 연습이를 소개합니다 66 00:03:39,040 --> 00:03:43,370 때문에 여기 금요일 강의의 일반적인 2시 반을 대신 3시 30 분에 오늘 할 것입니다. 67 00:03:43,370 --> 00:03:46,620 그러나 동영상은 내일 평소처럼 온라인 될 것입니다. 68 00:03:46,620 --> 00:03:48,820 >> 우리는 또한 다른 파일 형식을 소개합니다. 69 00:03:48,820 --> 00:03:51,270 이것은 의도적으로 처음에는 협박 보는 의미 70 00:03:51,270 --> 00:03:55,670 하지만이 C의 구조체에 대한 좀 설명서입니다. 71 00:03:55,670 --> 00:03:58,940 그것은 마이크로 소프트 년 전에이 형식을 보급하도록 도움을 밝혀 72 00:03:58,940 --> 00:04:05,150 비트 맵 파일 형식, BMP,이 슈퍼 간단한 화려한 그래픽 파일 형식이었다라고 73 00:04:05,150 --> 00:04:10,150 그는 데스크톱에 바탕 화면에 때때로 아직도 꽤 오래 사용되었습니다. 74 00:04:10,150 --> 00:04:14,760 당신은 Windows XP 및 압연 언덕과 푸른 하늘로 생각한다면, 75 00:04:14,760 --> 00:04:17,170 그 일반적으로 BMP 또는 비트 맵 이미지했습니다. 76 00:04:17,170 --> 00:04:19,959 사람들이 좀 더 복잡성을 가지고 있기 때문에 비트 맵은 우리에게 재미 있습니다. 77 00:04:19,959 --> 00:04:22,610 그렇지 않아 매우 0s와 1S의 격자로 간단하게 있습니다. 78 00:04:22,610 --> 00:04:27,510 대신, 당신은 파일의 시작 부분에 헤더 등이 있습니다. 79 00:04:27,510 --> 00:04:31,990 안으로. bmp 파일의 다른 단어에 0s와 1S의 전체 무리는, 80 00:04:31,990 --> 00:04:34,910 하지만 거기에 몇 가지 추가 0s와 1S가 있습니다. 81 00:04:34,910 --> 00:04:38,220 그리고 몇 년 동안 당연한 우리가 아마 촬영 한 것이 밝혀 - 82 00:04:38,220 --> 00:04:45,170 . 문서 나. xls 또는. MP3와 같은 파일 형식. MP4, 어떤 파일 형식 83 00:04:45,170 --> 00:04:48,480 당신이에 익숙거야 - 어떻게하면, 심지어 파일 형식이어야한다는 것은 무슨 뜻입니까 84 00:04:48,480 --> 00:04:52,480 하루의 끝에서이 파일의 모든 우리가 방금 0s와 1S가 사용 때문입니다. 85 00:04:52,480 --> 00:04:56,810 그리고 아마도 그이 0s와 1S ASCII를 통해 ABC 나 같은을 나타냅니다 86 00:04:56,810 --> 00:04:58,820 하지만 하루의 끝에서, 그것은 아직도 0s와 1 초입니다. 87 00:04:58,820 --> 00:05:02,100 그래서 인간은 종종 새로운 파일 형식을 발명하기로 결정 88 00:05:02,100 --> 00:05:06,420 그들은 비트의 패턴이 실제로 의미 무엇을 표준화 곳. 89 00:05:06,420 --> 00:05:09,220 그리고 여기이 경우에, 사람들이 비트 맵 파일 형식을 디자인 사람 90 00:05:09,220 --> 00:05:15,620 비트 맵 파일의 첫 바이트에, 거기로 오프셋 0으로 표시했다, 91 00:05:15,620 --> 00:05:18,940 일부 cryptically라는라는 변수 bfType,있을 것이다 92 00:05:18,940 --> 00:05:23,080 단지 비트 맵 파일 형식을 의미하는 어떤 비트 맵 파일의 종류가이입니다. 93 00:05:23,080 --> 00:05:27,700 당신은 2 오프셋하는 두 번째 행, 바이트 2 번에서 아마도 추측 할 수 94 00:05:27,700 --> 00:05:33,740 무엇을 의미 0s와 1S의 패턴이있다 고요? 무언가의 크기입니다. 95 00:05:33,740 --> 00:05:35,310 그리고 거기에서 계속된다. 96 00:05:35,310 --> 00:05:37,410 따라서 문제 세트 4, 당신은이 물건들 중 일부를 정리 걸어됩니다. 97 00:05:37,410 --> 00:05:39,520 우리는 그들 모두에 대해 신경 결국하지 않습니다. 98 00:05:39,520 --> 00:05:47,510 하지만 바이트 54 주위에 흥미로운 시작주의 사항 : rgbtBlue, 녹색, 빨간색. 99 00:05:47,510 --> 00:05:52,110 당신이 들어 본 경우 약어 RGB - 적색, 녹색, 청색 -이 그에 대한 참조입니다 100 00:05:52,110 --> 00:05:54,610 가 판명하기 때문에 당신은 무지개의 모든 색깔을 칠 수 있습니다 101 00:05:54,610 --> 00:05:58,180 빨강, 파랑, 녹색의 조합이 있습니다. 102 00:05:58,180 --> 00:06:03,320 그리고 사실, 객실 내 부모는 최초의 프로젝터의 일부를 기억 할 수 있습니다. 103 00:06:03,320 --> 00:06:05,890 요즘, 당신은 단지 하나의 밝은 빛이 렌즈에서 나오는 볼 104 00:06:05,890 --> 00:06:09,800 하지만 과거에 당신은 빨간색 렌즈, 파란색 렌즈, 그리고 녹색 렌즈를 가지고 105 00:06:09,800 --> 00:06:13,380 함께 그들은 화면을 목표로하고 다채로운 사진을 맺었습니다. 106 00:06:13,380 --> 00:06:16,270 그리고 매우 자주, 중학교, 고등학교 이러한 렌즈를 것 107 00:06:16,270 --> 00:06:19,720 아무리 약간 비스듬히, 그래서 당신은 더블 또는 트리플 이미지를보고 일종의 있었다. 108 00:06:19,720 --> 00:06:24,100 하지만 그건 생각 이었어요. 당신은 그림 빨간색과 녹색과 청색 빛을했습니다. 109 00:06:24,100 --> 00:06:26,590 그리고 같은 원리는 컴퓨터에서 사용됩니다. 110 00:06:26,590 --> 00:06:30,230 >> 따라서 문제에서 당신을위한 다음 문제 중 세트 4 몇 가지가 될 것이다. 111 00:06:30,230 --> 00:06:34,800 하나는 실제로 이미지 크기를 조정하는 것입니다 0s와 1S의 패턴에 걸릴하기 위해, 112 00:06:34,800 --> 00:06:40,200 , 0s와 1S의 덩어리는 구조의 어떤과 ​​같이 표현되는 알 113 00:06:40,200 --> 00:06:43,630 빨간색, 파란색, 녹색 - 그리고 픽셀을 복제하는 방법을 알아내는 - 114 00:06:43,630 --> 00:06:46,660 내부 있도록 사진이 처음과 같은 경우, 115 00:06:46,660 --> 00:06:49,210 그것은 그 이후로 대신 이렇게 볼 수 있습니다. 116 00:06:49,210 --> 00:06:53,640 다른 도전 중 너무 당신이 법정 이미지를 전달 할 거라고 될 것입니다 117 00:06:53,640 --> 00:06:56,030 디지털 카메라에서 실제 파일의. 118 00:06:56,030 --> 00:06:58,960 그리고 그 카메라에, 옛날 옛적에, 사진의 전체 무리가 있었다. 119 00:06:58,960 --> 00:07:03,760 문제는 우리가 실수로 삭제하거나 이미지가 어떻게 든 손상했다합니다. 120 00:07:03,760 --> 00:07:05,750 나쁜 일들은 디지털 카메라와 함께 발생합니다. 121 00:07:05,750 --> 00:07:09,150 그래서 우리는 신속하게 당신을 위해 카드의 0s와 1 초에서의 모든 복사 122 00:07:09,150 --> 00:07:13,610 4 설정 하나의 큰 파일에 모두 저장 한 후 우리는 문제에 건네됩니다 123 00:07:13,610 --> 00:07:19,320 당신은 이상적으로, 이러한 JPEG 파일을 모두 복구 할 수있는과 C에서 프로그램을 작성할 수 있도록. 124 00:07:19,320 --> 00:07:23,330 그리고 그들은 복잡한 파일 형식의 다소에 있는데도, 그 JPEG 파일을집니다 - 125 00:07:23,330 --> 00:07:26,360 그들은 훨씬 더 복잡 여기이 웃는 얼굴보다 야 - 126 00:07:26,360 --> 00:07:31,160 이 모든 JPEG는 0s와 1S 같은 패턴으로 시작을 이용할 수 있습니다. 127 00:07:31,160 --> 00:07:35,630 따라서 사용 궁극적으로, 루프 또는 이와 유사한을위한 잠시 동안 루프 또는, 128 00:07:35,630 --> 00:07:38,880 당신은이 법정 이미지에있는 모든 0s와 1 초 이상 반복 할 수 있습니다 129 00:07:38,880 --> 00:07:43,150 하고 문제 세트 사양에 정의되어있는 특별한 패턴을 볼 때마다, 130 00:07:43,150 --> 00:07:47,880 당신은 매우 높은 확률로, JPEG의 시작입니다 여기 얻을 수 있습니다. 131 00:07:47,880 --> 00:07:51,230 그리고 빨리 동일한 패턴을 바이트의 일부 번호를 찾으로 132 00:07:51,230 --> 00:07:55,430 또는 킬로바이트 또는 메가바이트 나중에, 당신이 추측 할 수는 두 번째 JPEG이다 133 00:07:55,430 --> 00:07:57,380 사진 내가 제일 먼저 한 후했다. 134 00:07:57,380 --> 00:08:01,370 저 첫 번째 파일을 읽는 중지하자,이 새로운 하나를 쓰기 시작 135 00:08:01,370 --> 00:08:06,310 그리고 pset4에 대한 프로그램의 출력은 많은 50 JPEG 파일 될 것입니다. 136 00:08:06,310 --> 00:08:09,270 나이가 50 JPEG 파일이 아니라면, 당신은 루프 약간 있습니다. 137 00:08:09,270 --> 00:08:12,490 당신은 JPEG 파일의 무한한 번호가있는 경우, 당신은 무한 루프를 갖추고 있습니다. 138 00:08:12,490 --> 00:08:14,910 그래서 이렇게도 꽤 일반적인 경우입니다. 139 00:08:14,910 --> 00:08:16,600 그래서 결국 수평선에 어떤입니다. 140 00:08:16,600 --> 00:08:21,310 >> 우리가 뒤에 0을 퀴즈, 행복 둘 다 사람들이 늘 있다는 것을 내 이메일에 따라 실현 141 00:08:21,310 --> 00:08:23,640 중성 및 퀴즈 주변 슬픈 0 시간 종류. 142 00:08:23,640 --> 00:08:26,800 그리고 머리 TF Zamyla, 자신의 TF, 저에게 연락 바랍니다 143 00:08:26,800 --> 00:08:31,180 당신이 일을 택한 방법에 대해 논의하려는 경우 귀하가 알고있는 인증 기관 (CA) 또는 하나입니다. 144 00:08:31,180 --> 00:08:35,539 >> 그래서 방에 여기 부모 인상을, CS50 라이브러리는 무엇인가? 145 00:08:36,429 --> 00:08:40,390 [웃음] 잘 했어. 146 00:08:40,390 --> 00:08:48,340 CS50 라이브러리는 무엇입니까? 그래. >> [학생] 그것은 코드의 사전 서면 세트입니다 [안 들리게] 147 00:08:48,340 --> 00:08:49,750 그래, 좋아. 148 00:08:49,750 --> 00:08:53,240 그것은 우리 직원이 쓴 코드의 사전 서면 세트있어, 우리는 당신에게 제공 149 00:08:53,240 --> 00:08:55,030 즉, 몇 가지 일반적인 기능을 제공합니다 150 00:08:55,030 --> 00:08:59,020 나에게 문자열을 같은 물건 좀 치워 정수 - 여기에 나와있는 모든 기능. 151 00:08:59,020 --> 00:09:02,260 >> 지금부터는 우리가 정말 이러한 훈련 바퀴를 벗을 시작합니다. 152 00:09:02,260 --> 00:09:05,050 우리는 당신에게서 문자열을 멀리하기 시작 할거야 153 00:09:05,050 --> 00:09:08,870 어느 리콜 어떤 실제 데이터 유형에 대해 단지 동의어 였어요? >> [여러 학생] 숯불 *. 154 00:09:08,870 --> 00:09:12,730 숯불 *. 부모를위한, 아마 우리가 [만들어 whooshing 소리]이었습니다. 좋아. 155 00:09:12,730 --> 00:09:17,550 숯불 * 우리는 우리의 어휘에서 문자열을 삭제할 때보다도 더 화면에 표시하기 시작합니다 156 00:09:17,550 --> 00:09:19,730 실제로 코드를 작성하는에 제공 적어도 때. 157 00:09:19,730 --> 00:09:22,840 마찬가지로, 우리는 이러한 기능의 일부를 많이 사용을 중지합니다 158 00:09:22,840 --> 00:09:25,280 우리의 프로그램은 더 정교하고 있잖아 때문입니다. 159 00:09:25,280 --> 00:09:28,480 보다는, 그냥 프롬프트 점멸과 함께 앉아 프로그램을 작성 160 00:09:28,480 --> 00:09:31,870 에 뭔가를 입력 할 사용자를 기다리고, 당신은 다른 곳에서 입력을받을 수 있습니다. 161 00:09:31,870 --> 00:09:35,490 예를 들어, 로컬 하드 드라이브에 비트 일련의에서 그들을 얻을 수 있습니다. 162 00:09:35,490 --> 00:09:38,580 대신, 네트워크 연결에서 미래에 가져올 게 163 00:09:38,580 --> 00:09:40,230 어디에 선가 어떤 웹 사이트입니다. 164 00:09:40,230 --> 00:09:44,110 >> 그래서 처음으로 돌아 레이어 껍질을 벗기면하자 및 CS50 어플라이언스를 끌어 165 00:09:44,110 --> 00:09:49,010 당신은 # 주를 포함 봤는데 cs50.h 전화이 파일, 166 00:09:49,010 --> 00:09:51,140 하지만 우린 실제로이 안에 뭐가 보자. 167 00:09:51,140 --> 00:09:54,430 파란색으로 파일의 상단은 코멘트를 왕창입니다 168 00:09:54,430 --> 00:09:57,050 보증 정보 및 라이센스. 169 00:09:57,050 --> 00:09:59,050 이 소프트웨어의 일반적인 패러다임의 일종입니다 170 00:09:59,050 --> 00:10:01,580 소프트웨어의 많은 이러한 일이 오픈 소스라는거야 때문에하면, 171 00:10:01,580 --> 00:10:05,220 어떤 사람이 코드를 작성하고 자유롭게 사용할 것을 의미합니다 172 00:10:05,220 --> 00:10:10,470 단지 실행하고 사용할 수 있지만 실제로 읽고 변경하고 자신의 작품에 통합 할 수 있습니다. 173 00:10:10,470 --> 00:10:14,660 그럼 당신은 매우 작은 형태이라도, 오픈 소스 소프트웨어를 사용하여 온거야. 174 00:10:14,660 --> 00:10:18,560 나는 코멘트를지나 아래로 스크롤하면,하지만, 우리는 좀 더 친숙한 것을 확인할 수 있습니다. 175 00:10:18,560 --> 00:10:25,010 cs50.h 파일이 헤더 파일의 전체 많이 포함되어 여기에 상단에있는 공지 사항. 176 00:10:25,010 --> 00:10:28,560 이들 중 대부분, 우리는 전에 못 봤어요,하​​지만 그 중 하나가 잘 알고 있습니다. 177 00:10:28,560 --> 00:10:32,270 이 중 우리는 지금까지, 짧게이라도 본 적 있어요? >> [학생] 표준 라이브러리를 제공합니다. 178 00:10:32,270 --> 00:10:35,810 네, 표준 라이브러리. stdlib.h는 malloc이 있습니다. 179 00:10:35,810 --> 00:10:38,320 일단 우리는 동적 메모리 할당에 대해 얘기하기 시작 180 00:10:38,320 --> 00:10:41,650 우리는뿐만 아니라 다음 주에 돌아 오면되는, 우리는 그 파일을 포함 시작했다. 181 00:10:41,650 --> 00:10:46,640 이 BOOL, 그리고 진실과 거짓이 실제로 C 이라기보다는 존재하지 않는 것이 밝혀졌다 182 00:10:46,640 --> 00:10:49,440 여기이 파일을 포함하지 않는 한. 183 00:10:49,440 --> 00:10:52,710 우리는 주 동안 stdbool.h을 포함 된 184 00:10:52,710 --> 00:10:55,620 당신은의, BOOL true 또는 false를 반환합니다. 개념을 사용할 수 있도록 185 00:10:55,620 --> 00:10:58,620 이 없으면, 당신은 가짜 그것을 정렬하여 정수를 사용해야 186 00:10:58,620 --> 00:11:02,610 불과 임의로 0 거짓 1에 해당하는 것으로 가정합니다. 187 00:11:02,610 --> 00:11:07,150 우리가 더 아래로 스크롤하면, 여기 문자열의 우리의 정의입니다. 188 00:11:07,150 --> 00:11:11,390 그것은이 별이 어디에 정말 중요하지 않습니다, 우리가 전에 말했듯이, 밝혀졌다. 189 00:11:11,390 --> 00:11:13,720 당신은 모든 주위 공간을 가질 수 있습니다. 190 00:11:13,720 --> 00:11:16,740 우리 이번 학기 명확하게이로 추진 된 191 00:11:16,740 --> 00:11:18,620 스타의 유형과해야한다고 192 00:11:18,620 --> 00:11:21,700 좀 더 일반적인 않을 경우하지만, 단지와 같은 일반적인 실현 193 00:11:21,700 --> 00:11:24,430 거기에 뒀을 것입니다하지만, 기능적으로는 같은 일입니다. 194 00:11:24,430 --> 00:11:27,720 우리가 더 아래로 읽을 수 있다면 이제, GetInt를 살펴 보자 195 00:11:27,720 --> 00:11:32,190 우리는 무엇 이번 학기 전에 아마도 처음 사용 때문입니다. 196 00:11:32,190 --> 00:11:37,440 여기 GetInt입니다. 이 무엇입니까? >> [학생] 프로토 타입. >> 이건 그냥 프로토 타입입니다. 197 00:11:37,440 --> 00:11:41,410 종종, 우리는 우리의 정상에 프로토 타입을 넣어했습니다. C 파일은, 198 00:11:41,410 --> 00:11:46,690 뿐만 아니라이 개 같은 헤더 파일. h 파일에 프로토 타입을 넣을 수 있습니다 199 00:11:46,690 --> 00:11:50,840 수 있도록 당신은 몇 가지 기능을 쓸 때 당신은 다른 사람들이 사용할 수 있도록 할 200 00:11:50,840 --> 00:11:53,550 이는 정확히 CS50 라이브러리 경우가 있습니다 201 00:11:53,550 --> 00:11:57,040 당신은 cs50.c 같은 귀하의 기능을 구현뿐만 아니라 202 00:11:57,040 --> 00:12:02,790 여러분은 안 파일의 상단에 있지만 헤더 파일의 상단에있는 프로토 타입을 넣어. 203 00:12:02,790 --> 00:12:07,170 해당 헤더 파일은 친구와 동료 등이 무슨 204 00:12:07,170 --> 00:12:09,760 으로는 # 자신의 코드에 포함되어 있습니다. 205 00:12:09,760 --> 00:12:12,210 모든 이번에는이 프로토 타입을 모두 포함 봤는데 206 00:12:12,210 --> 00:12:16,580 효율적으로 파일의 상단에 있지만,이 방법으로는 # 메커니즘을 포함 207 00:12:16,580 --> 00:12:20,070 자신에 어떤 본질적으로 복사하여 페이스트이 파일. 208 00:12:20,070 --> 00:12:23,070 다음은 몇 가지 매우 자세한 설명서입니다. 209 00:12:23,070 --> 00:12:25,640 GetInt은 정수를 얻을 수 있다는 당연한 우리는 꽤 많이 촬영 한 210 00:12:25,640 --> 00:12:27,640 일부 코너 경우가 밝혀. 211 00:12:27,640 --> 00:12:31,810 무엇 quintillion, 너무 커요 번호를 사용자가 타입 경우, 212 00:12:31,810 --> 00:12:35,490 그건 단지 정수의 내부에 맞지 수 있습니까? 예상 행동은 무엇입니까? 213 00:12:35,490 --> 00:12:38,020 이상적으로, 그것은 예측입니다. 214 00:12:38,020 --> 00:12:40,280 따라서이 경우에는, 사실의 작은 글씨도 읽을수 경우 215 00:12:40,280 --> 00:12:44,500 당신은 실제로 라인을 읽을 수없는 경우,이 반품 INT_MAX를 볼 수 있습니다. 216 00:12:44,500 --> 00:12:48,320 우리는이 얘기를하지 않았지만 그 대소에 따라, 무슨 아마 못 했어? 217 00:12:48,320 --> 00:12:50,640 [학생] 상수입니다. >>는 상수입니다. 218 00:12:50,640 --> 00:12:54,770 아마 그 헤더 파일 중 하나에 선언있어 특별한 상수입니다 219 00:12:54,770 --> 00:13:00,090 , 그 파일에 이상이고, INT_MAX는 약 2,000,000,000처럼 아마 어떤이 220 00:13:00,090 --> 00:13:04,990 우리가 어떻게 든 무언가를 의미해야하기 때문에 있다는 생각은 잘못 됐어요 221 00:13:04,990 --> 00:13:10,700 우리는, 그래, 우리 처분 4,000,000,000 번호를 : -2 억 최대 2 억에 있지만요. 222 00:13:10,700 --> 00:13:14,710 음, 프로그래밍에서 자주 발생하면, 당신은 단지 그 숫자 중 하나를 훔쳐입니다 223 00:13:14,710 --> 00:13:18,920 어쩌면 0, 어쩌면 2000000000, 어쩌면 -2 억 224 00:13:18,920 --> 00:13:23,280 당신이 세계에 커밋 할 수 있도록 그래서 당신이 수있는 값 중 하나를 지출 225 00:13:23,280 --> 00:13:26,820 뭔가 일이 잘못되면 즉,이 슈퍼 큰 값을 반환합니다. 226 00:13:26,820 --> 00:13:31,030 하지만 당신은 사용자가 234와 같은 이상한 일을 입력하지 않으 ... 정말 큰 숫자입니다. 227 00:13:31,030 --> 00:13:34,060 당신은 상수로 대신을 일반화. 228 00:13:34,060 --> 00:13:38,060 당신이 지난 몇 주 항문 존재 한다면 정말 모든 시간은 당신이 GetInt라고 229 00:13:38,060 --> 00:13:42,900 조건이 INT_MAX에 사용자 유형을 한 경우로 확인 된 것, 230 00:13:42,900 --> 00:13:46,590 또는 더 구체적으로, 만약 그랬다면 때문에 GetInt 반환 INT_MAX 했어요, 231 00:13:46,590 --> 00:13:51,830 그 사실은 그들이 입력하지 않은 것을 의미합니다. 일이이 경우에 문제가 발생했습니다. 232 00:13:51,830 --> 00:13:56,080 그래서 일반적으로 단지 특별한 의미의 기계 값으로 알려진 곳입니다. 233 00:13:56,080 --> 00:13:58,120 >> . C 파일에 설정 지금 보자. 234 00:13:58,120 --> 00:14:01,340 C 파일은 시간이를 위해 어플라이언스에 존재하고 있습니다. 235 00:14:01,340 --> 00:14:06,840 그리고 사실, 어플라이언스는 미리 컴파일 된 우리가 오브젝트 코드를 호출 그곳으로 당신을 위해,이 236 00:14:06,840 --> 00:14:09,540 시스템이 알고 있기 때문에이 어디에하지만 그냥 당신에게 중요하지 않습니다 237 00:14:09,540 --> 00:14:11,730 이 경우에 어디있어 : 어플라이언스. 238 00:14:11,730 --> 00:14:17,400 이 모든 시간을 GetInt과 GetInt가 작동 된 방법에 대해 알아 보려면 지금 아래로 스크롤 보자. 239 00:14:17,400 --> 00:14:19,460 여기 이전의 유사한 의견이 있습니다. 240 00:14:19,460 --> 00:14:21,660 난 그냥 코드 부분에 확대 봅시다. 241 00:14:21,660 --> 00:14:23,900 그리고 우리가 GetInt에 대해이 것은 다음과 같습니다. 242 00:14:23,900 --> 00:14:25,700 아무런 입력을지지 않습니다. 243 00:14:25,700 --> 00:14:29,510 , 그것은 (사실) 동안 정수를 반환, 우리는 고의적 무한 루프가 244 00:14:29,510 --> 00:14:33,180 하지만 아마도 우리는 어떻게 든이 탈옥 또는 내에서 반환합니다. 245 00:14:33,180 --> 00:14:34,870 >> 가 어떻게 작품을 보자. 246 00:14:34,870 --> 00:14:39,240 우리는 루프 내부의 첫 번째 줄에 166 GetString을 사용 할 것 같습니다. 247 00:14:39,240 --> 00:14:43,780 어떤 경우에도 GetString이 회복 될 수있을 것이다 때문에이 지금은 좋은 습관이다 248 00:14:43,780 --> 00:14:47,660 특별 키워드 NULL? >> [학생] 뭔가 일이 잘못되면합니다. 249 00:14:47,660 --> 00:14:51,630 뭔가 잘못되면. 그리고 당신이 GetString 같은 것을 호출 할 때 잘못 되었을까요? 250 00:14:54,960 --> 00:14:57,640 그래. >> [학생] Malloc이에게 ints를 제공하지 못합니다. 251 00:14:57,640 --> 00:14:59,150 그래. 아마 malloc이 실패합니다. 252 00:14:59,150 --> 00:15:03,190 어딘가에 후드 아래에, GetString 메모리를 할당 malloc을, 부르고 253 00:15:03,190 --> 00:15:06,020 이는 문자의 모든 컴퓨터 상점을 할 수 있습니다 254 00:15:06,020 --> 00:15:07,750 그 키보드로 사용자 유형입니다. 255 00:15:07,750 --> 00:15:11,590 그리고 사용자가 무료로 많은 시간을했고 예를 들어, 더 많은 입력 가정 256 00:15:11,590 --> 00:15:16,160 컴퓨터보다 더 많은 문자보다 2,000,000,000 문자는 RAM이 있습니다. 257 00:15:16,160 --> 00:15:19,250 GetString 너에게 그런 의미 할 수 있습니다. 258 00:15:19,250 --> 00:15:22,560 이 슈퍼, 슈퍼 드문 코너 경우하더라도 259 00:15:22,560 --> 00:15:24,340 그것은 어떻게 든이 일을 처리 할 수​​있다 260 00:15:24,340 --> 00:15:28,750 그래서 우리가 돌​​아 가서 그 문서를 읽을 경우, GetString, 실제로 반환 NULL로하지 않습니다. 261 00:15:28,750 --> 00:15:34,460 GetString는 NULL을 반환하여 실패 그래서 지금 경우, GetInt는 INT_MAX를 반환하여 실패 할 것이다 262 00:15:34,460 --> 00:15:37,690 단 보초 있습니다. 이것들은 인간의 관례입니다. 263 00:15:37,690 --> 00:15:41,450 이 사건인​​지 알고 싶으있는 유일한 방법은 문서를 읽는 것입니다. 264 00:15:41,450 --> 00:15:45,040 >> INT가 실제로이라도되는 아래로 스크롤 보자. 265 00:15:45,040 --> 00:15:51,160 내가 좀 더 아래로 스크롤하면 라인 170에서, 우리는이 선 위의 의견이 있습니다. 266 00:15:51,160 --> 00:15:55,100 우리는 172 년 후 정수, N, 그리고 숯불, C 및 새로운 기능을 선언 267 00:15:55,100 --> 00:15:58,930 둘 중에 일부는 sscanf 전에 운 좋게 발견했습니다. 268 00:15:58,930 --> 00:16:00,870 이 문자열 scanf를 의미합니다. 269 00:16:00,870 --> 00:16:05,700 즉, 나에게 문자열을 제공하고 관심 정보의 조각을 위해 스캔합니다. 270 00:16:05,700 --> 00:16:07,360 그게 무슨 뜻 이죠? 271 00:16:07,360 --> 00:16:11,800 나는 Enter 키를 누르 다음 키보드에서 123 문자에 입력하고 있다고 가정합시다. 272 00:16:11,800 --> 00:16:16,470 GetString에 의해 반환 된 123의 데이터 유형은 무엇입니까? >> [학생] 문자열. 273 00:16:16,470 --> 00:16:18,380 그것은 바로, 분명히 문자열거야? 나는 문자열을 가지고. 274 00:16:18,380 --> 00:16:23,220 그럼 123 정말 견적 - 인용을 끝 맺다, 그것의 끝에 \ 0 123입니다. 275 00:16:23,220 --> 00:16:27,110 그 정수가 아닙니다. 그은 (는) 숫자가 아닙니다입니다. 이 숫자처럼 보이지만 사실은 없습니다. 276 00:16:27,110 --> 00:16:29,080 그래서 GetInt이 짓을 했을까? 277 00:16:29,080 --> 00:16:35,750 123 \ 0 - - 그리고 어떻게 된 일인지 실제 정수로 변환은 왼쪽에서 오른쪽으로 해당 문자열을 검색 할 수 있습니다. 278 00:16:35,750 --> 00:16:37,850 이 작업을 수행하는 방법을 알아내는 수 있습니다. 279 00:16:37,850 --> 00:16:41,450 당신이 pset2로 생각한다면, 당신은 아마 카이사르가 좀 편한 옷으로 갈아 입고 280 00:16:41,450 --> 00:16:44,820 또는 Vigenere, 그래서 당신은 문자열을 통해 반복 할 수 있습니다, 당신은 ints로 문자를 변환 할 수 있습니다. 281 00:16:44,820 --> 00:16:46,710 그러나 도대체,이 일이 많이 있습니다. 282 00:16:46,710 --> 00:16:49,860 왜 당신을 위해 그렇게하지 ​​sscanf와 같은 함수를 호출하지? 283 00:16:49,860 --> 00:16:54,230 따라서 sscanf는 인수가 필요합니다 -이 경우 줄은 문자열입니다,라고. 284 00:16:54,230 --> 00:17:01,840 그런 다음이 문자열에 표시 기대, 매우 유사한에 printf, 따옴표를 지정합니다. 285 00:17:01,840 --> 00:17:09,000 그리고 내가 여기서 말은 나 10 진수와 어쩌면 문자를 볼 것으로 기대합니다. 286 00:17:09,000 --> 00:17:12,000 이 단지 한 순간의 경우 이유를 우리는 볼 수 있습니다. 287 00:17:12,000 --> 00:17:15,869 그리고이 표기법 지금 물건을 연상 것이 밝혀 우리에 대해 얘기하기 시작 288 00:17:15,869 --> 00:17:17,619 단지 일주 전. 289 00:17:17,619 --> 00:17:21,740 무엇입니까 & N과 & C 우리를 여기서 뭐하는거야? >> [학생] n의 주소와 C의 주소. 290 00:17:21,740 --> 00:17:25,400 그래. 그것은 나에게 C의 N과 주소의 주소를주고 있어요. 그게 왜 중요합니까? 291 00:17:25,400 --> 00:17:30,220 당신은 C 함수와 함께, 당신은 항상 모든에서 값 또는 값 없음을 반환 할 수 있다는 사실을 알고. 292 00:17:30,220 --> 00:17:34,530 당신은 정수, 문자열, 부동, 문자, 뭐든간에, 또는 무효를 반환 할 수를 반환 할 수 있습니다 293 00:17:34,530 --> 00:17:38,030 하지만 당신은 단지 maximally 하나를 반환 할 수 있습니다. 294 00:17:38,030 --> 00:17:42,760 하지만 여기 우리는 sscanf는 어쩌면 정수, 10 진수를, 저를 반환 할 295 00:17:42,760 --> 00:17:46,220 또한 숯, 나는 순간에 왜 숯불을 설명 할 것이다. 296 00:17:46,220 --> 00:17:51,460 당신은 효과적으로 sscanf는 두 가지를 반환하려면,하지만 그건 C.에 단지 수 없습니다 297 00:17:51,460 --> 00:17:55,200 두 주소를 전달함으로써 해결할 수 있습니다 298 00:17:55,200 --> 00:17:57,370 빨리 당신이 함수에게 두 개의 주소를 손으로 때문에, 299 00:17:57,370 --> 00:18:00,470 그 기능은 그들과 함께 무엇을 할 수 있습니까? >> [학생] 해당 주소로 작성해주세요. 300 00:18:00,470 --> 00:18:02,010 이 해당 주소로 쓸 수 있습니다. 301 00:18:02,010 --> 00:18:05,770 당신은 별 작업을 사용하여 해당 주소의 각, 거기로 갈 수 있습니다. 302 00:18:05,770 --> 00:18:11,260 이 변수의 값을 변경하는 정렬이 다시 도어 메커니즘을하지만 매우 일반적 303 00:18:11,260 --> 00:18:14,870 이 경우, 두 - 한 곳 이상. 304 00:18:14,870 --> 00:18:21,340 지금은 == 1을 확인하고 그 사실을 true로 평가 않는 경우 n을 돌아가는거야 확인합니다. 305 00:18:21,340 --> 00:18:26,170 그래서 무슨 일이에요? 기술적으로 우리가 GetInt으로 발생하려는 모든이 있습니다. 306 00:18:26,170 --> 00:18:30,740 견적 - 인용을 끝 맺다 123 - 우리가 말하자면, 구문 분석하려면, 우리는 문자열을 읽을 수 있습니다 - 307 00:18:30,740 --> 00:18:34,560 그리고 우리가해야 할 sscanf 말을하는지 거기에 번호가있을 것 같은데 경우 308 00:18:34,560 --> 00:18:38,190 이 변수에 N 날 위해 - 123 - 해당 번호를 집어 넣습니다. 309 00:18:38,190 --> 00:18:42,090 왜 그때 난 사실이뿐만 아니라 했죠? 310 00:18:42,090 --> 00:18:48,220 당신은 또한 여기에 문자를 할지도 모른다 sscanf의 역할은 무엇입니까? 311 00:18:48,220 --> 00:18:53,470 [안 들리게 학생 응답] >> 소수점 실제로 일 수 있습니다. 312 00:18:53,470 --> 00:18:56,330 잠시 생각하는가 개최 보자. 또 뭐가 있지? 313 00:18:56,330 --> 00:18:59,270 [학생]은 NULL이 될 수 있습니다. >> 좋은 생각. 이 널 (null) 문자가 될 수 있습니다. 314 00:18:59,270 --> 00:19:01,660 이 경우는 실제로 없습니다. 그래. >> [학생] ASCII. 315 00:19:01,660 --> 00:19:04,340 ASCII. 아니면 나를 더욱 일반화 보자. 316 00:19:04,340 --> 00:19:06,640 이 %의 C는 오류 검사를위한 것입니다. 317 00:19:06,640 --> 00:19:09,300 우리는 숫자 뒤에 문자가있을하지 않으 318 00:19:09,300 --> 00:19:11,870 하지만이 내가 어떻게 할 수는 다음과 같습니다. 319 00:19:11,870 --> 00:19:18,210 그렇게 sscanf 여기이 예제에서 N과 C의 값을 저장 게다가, 밝혀 320 00:19:18,210 --> 00:19:24,890 이 또한 변수의 수를 반환합니다 않습니다 어떻게하면 인치 값을 입력 321 00:19:24,890 --> 00:19:30,260 만 123에 입력하면 그럼, 만 % d는 일치 것입니다 322 00:19:30,260 --> 00:19:33,880 단 N은 123 같은 값으로 저장됩니다 323 00:19:33,880 --> 00:19:35,640 그리고 아무는 C에 넣어되지됩니다. 324 00:19:35,640 --> 00:19:37,620 C는 말하자면, 쓰레기 값이 남아 있습니다 - 325 00:19:37,620 --> 00:19:40,730 쓰레기 때문에 어떤 값으로 초기화 적이있어. 326 00:19:40,730 --> 00:19:45,520 내 말은, 그 포인터의 1 인구가 있기 때문에, 그렇다면, sscanf는 1을 반환 327 00:19:45,520 --> 00:19:50,190 제가 메모리를 확보하기 위해 줄을 풀 수 있도록하는 좋은 케이스는, 내가 정수가 328 00:19:50,190 --> 00:19:54,000 그 GetString는 실제로 할당하고 나서, n을 반환 329 00:19:54,000 --> 00:19:58,500 그 문에서 유래 재시도 위치를 궁금해 본 적 다른 경우, 바로 여기에서 비롯됩니다. 330 00:19:58,500 --> 00:20:04,390 면이 대조적으로, 나는 123foo 입력 - 텍스트 중 일부 무작위 순서 - 331 00:20:04,390 --> 00:20:08,490 sscanf는 숫자, 숫자, 숫자, F를 볼 것입니다 332 00:20:08,490 --> 00:20:16,410 그리고 N에서 123 줄거야, 그것은 C에서 F를 넣고 다음 2 반환하는거야. 333 00:20:16,410 --> 00:20:20,640 그래서 우리는 단지 sscanf의 행동은 매우 간단한 방법의 기본 정의를 사용하여이 - 334 00:20:20,640 --> 00:20:23,900 아, 처음 보면하지만 하루 간단 메커니즘의 끝에서 단지 - 335 00:20:23,900 --> 00:20:28,320 말씀의 정수가 있으며,이 경우입니다 제가 찾은 유일한? 336 00:20:28,320 --> 00:20:29,860 여기 공백이 고의적입니다. 337 00:20:29,860 --> 00:20:34,000 당신은 sscanf에 대한 문서를 읽는다면, 당신이 공백의 조각을 포함 할 경우 있음을 알려줍니다 338 00:20:34,000 --> 00:20:38,810 시작 또는 끝 부분에, sscanf도 어떤 이유로 사용자 수 339 00:20:38,810 --> 00:20:41,860 스페이스 바 (123)를 공격하고는 합법적 될 것입니다. 340 00:20:41,860 --> 00:20:44,150 그들은 스페이스 바를 누르해서 당신은 사용자가 소리 치지 않습니다 341 00:20:44,150 --> 00:20:48,640 시작 또는 끝 부분에, 어떤 사용자 친화적 인 단지 조금 더 있습니다. 342 00:20:48,640 --> 00:20:52,300 >> 다음 질문 GetInt에? 그래. >> [학생]는 당신이 단지 숯불에 넣어 경우 어떻게해야합니까? 343 00:20:52,300 --> 00:20:54,030 좋은 질문입니다. 344 00:20:54,030 --> 00:20:59,890 당신이 방금 F와 같은 문자를 입력하고 다시 123를 입력​​하지 않고 Enter 키를 누르면? 345 00:20:59,890 --> 00:21:02,420 당신은이 코드 라인의 동작이 다음 것 어떻게 생각하십니까? 346 00:21:02,420 --> 00:21:04,730 [안 들리게 학생 응답] 347 00:21:04,730 --> 00:21:08,790 이 경우는 n 또는 C를 작성하지 않을 때문에 그래, sscanf는 너무 커버 할 수 있습니다. 348 00:21:08,790 --> 00:21:15,310 이 경우있는 나 또한 시나리오를 타야 해요 대신, 0을 반환하는거야 349 00:21:15,310 --> 00:21:18,750 내가 원하는 건 예상 값은 1이기 때문이다. 350 00:21:18,750 --> 00:21:22,000 난 한마리 만 원하는 단 한 가지가 기입 할 수 있습니다. 좋은 질문입니다. 351 00:21:22,000 --> 00:21:24,290 >> 기타? 괜찮아요. 352 00:21:24,290 --> 00:21:26,250 >> 여기에 모든 기능을 가지 말자, 353 00:21:26,250 --> 00:21:29,500 하지만 나머지 관심 아마 것 같다 하나는 GetString입니다 354 00:21:29,500 --> 00:21:32,790 이 GetLongLong, GetFloat, GetInt이 GetDouble 것이 밝혀 때문 355 00:21:32,790 --> 00:21:36,260 모든 펀트 GetString에 대한 그들의 기능이 많습니다. 356 00:21:36,260 --> 00:21:39,750 그럼 그가 여기 구현하는 방법을 살펴 보자. 357 00:21:39,750 --> 00:21:43,630 이 녀석은 좀 복잡한 보이는,하지만 같은 기본을 사용합니다 358 00:21:43,630 --> 00:21:45,670 우리가 지난 주에 대해 얘기하기 시작하는. 359 00:21:45,670 --> 00:21:49,490 GetString에있는 여기까지 무효에 따라 더 주장을지지 않습니다 360 00:21:49,490 --> 00:21:53,730 그리고 내가 분명히 버퍼라는 문자열을 선포하는거야, 문자열을 반환합니다. 361 00:21:53,730 --> 00:21:56,270 정말 그 아직 사용 할 무슨 모르지만, 우리는 볼 수 있습니다. 362 00:21:56,270 --> 00:21:58,390 용량이 기본 공입니다 것 같습니다. 363 00:21:58,390 --> 00:22:01,350 확실치는 곳이 n은 아직 사용할 수 것입니다할지,하지 것이다, 364 00:22:01,350 --> 00:22:03,590 하지만 지금은 좀 더 흥미로운지고있어. 365 00:22:03,590 --> 00:22:06,520 라인 243에서, 우리는 정수, C를 선언합니다. 366 00:22:06,520 --> 00:22:08,800 이 바보 같은 세부의 일종입니다. 367 00:22:08,800 --> 00:22:15,820 문자는 8 비트이며, 8 비트 얼마나 많은 다른 값을 저장할 수 있습니까? >> [학생] 256. >> 256. 368 00:22:15,820 --> 00:22:20,730 너 거기있어 서로 다른 256 개의 ASCII 문자를 가지고하려는 경우 문제는 369 00:22:20,730 --> 00:22:23,340 다시 생각하면 - 그리고이 기억하는 것이 아닙니다. 370 00:22:23,340 --> 00:22:25,710 당신이 큰 ASCII 차트로 생각한다면 우리는 주 전에 있었는데 371 00:22:25,710 --> 00:22:30,600 128 또는 256 ASCII 문자는이 경우가있었습니다. 372 00:22:30,600 --> 00:22:32,940 우리는 0s와 1 초까지의 모든 패턴을 사용했습니다. 373 00:22:32,940 --> 00:22:36,210 오류가 감지 할 수 있도록하려는 경우 그건 문제 374 00:22:36,210 --> 00:22:40,190 이미 문자 256 값을 사용하는 경우 때문에, 375 00:22:40,190 --> 00:22:43,050 지금 당신은 말하는 방법이 없기 때문에 당신은 정말로, 미리 계획하지 않은 376 00:22:43,050 --> 00:22:46,270 이 합법적 문자이며,이 몇 가지 잘못된 메시지입니다. 377 00:22:46,270 --> 00:22:50,270 그래서이 세상이 수행하는 것은 그들이 다음 큰 값 int는 같은 것을 사용합니다 378 00:22:50,270 --> 00:22:54,720 당신은 4,000,000,000 가능한 값에 대해 비트, 32 미친 번호가 있도록 379 00:22:54,720 --> 00:22:58,860 당신은 단순히 본질적 257 중를 사용하여 종료 할 수 있도록 380 00:22:58,860 --> 00:23:01,720 한 중 오류로 일부 특수 의미가 있습니다. 381 00:23:01,720 --> 00:23:03,120 >> 그럼 어떻게이 작품을 보자. 382 00:23:03,120 --> 00:23:07,760 라인 246에, 난 fgetc를 호출이 커다란 동안 루프를 가지고 383 00:23:07,760 --> 00:23:11,090 F 의미 파일 때문에 getc하고 표준 입력. 384 00:23:11,090 --> 00:23:15,520 그것은이 그냥 키보드에서 입력을 읽을 말하는 더 정확한 방법입니다 밝혀졌다. 385 00:23:15,520 --> 00:23:19,300 표준 입력 수단 키보드, 표준 출력, 화면을 의미합니다 386 00:23:19,300 --> 00:23:23,310 우리는 pset4에 표시됩니다 표준 오류는 화면을 의미합니다 387 00:23:23,310 --> 00:23:27,490 그러나 그 실제 출력 화면의 특별한 부분을 conflated 않아 있도록 388 00:23:27,490 --> 00:23:30,750 당신은 인쇄하기위한 것으로. 미래에 그 자리에하지만 더. 389 00:23:30,750 --> 00:23:34,440 그럼 fgetc는 키보드에서 한 문자를 읽고 곳을 저장할 의미? 390 00:23:34,440 --> 00:23:37,350 C에 저장합니다. 391 00:23:37,350 --> 00:23:41,360 그리고 확인 - 그래서 난 그냥 여기 부울 접속사를 사용 - 392 00:23:41,360 --> 00:23:46,000 그 같지 않음 확인 - \ N 때문에 사용자가 입력에 충돌했다고, 우리는 그 시점에서 중지하려면, 393 00:23:46,000 --> 00:23:49,850 루프의 끝 - 우리는 또한 특별한 상수 EOF를 확인하려면, 394 00:23:49,850 --> 00:23:53,610 당신이 알고 또는 추측 경우, 무엇을하는의 약자입니까? 파일의 >> [학생] 끝. 파일의 페이지 >> 끝. 395 00:23:53,610 --> 00:23:56,560 이건 어떤 종류의 무의미한 때문 제가 키보드에 입력하는 경우, 396 00:23:56,560 --> 00:23:58,870 이 일에 끼어은 파일, 정말 없습니다 397 00:23:58,870 --> 00:24:01,150 그러나 이것은 단지 의미하는 데 사용되는 일반적인 용어 정렬되어 있습니다 398 00:24:01,150 --> 00:24:04,220 다른 그 어떤 것도 인간의 손가락에서 오는되지 않습니다. 399 00:24:04,220 --> 00:24:06,460 EOF - 파일의 끝. 400 00:24:06,460 --> 00:24:09,920 지금까지 키보드에서 컨트롤 D를 누르 한 경우는 둘째 치고,, 아직이 없을 거라는으로 - 401 00:24:09,920 --> 00:24:15,230 당신은 컨트롤 C를 누르어요 - 컨트롤 D는 EOF라는이 특별한 상수를 보냅니다. 402 00:24:15,230 --> 00:24:19,850 이제 우리는 좀 동적 메모리 할당을 갖추고 있습니다. 403 00:24:19,850 --> 00:24:23,440 >> 그래서, 만약 (N + 1> 용량). 지금은 n을 설명합니다. 404 00:24:23,440 --> 00:24:26,100 N은 얼마나 많은 바이트는, 버퍼에 현재있다 405 00:24:26,100 --> 00:24:28,620 현재 사용자의 구축하고있는 문자열입니다. 406 00:24:28,620 --> 00:24:33,450 당신이 버퍼 용량을 가지고보다 버퍼에 더 많은 문자가있는 경우는, 407 00:24:33,450 --> 00:24:37,410 직관적으로 우리가 원하는 일을 더 많은 용량을 할당 할 수 있습니다. 408 00:24:37,410 --> 00:24:43,330 그래서 여기에 산술의 일부를 통해 탈지 여기에만이 기능에 초점을거야. 409 00:24:43,330 --> 00:24:46,070 당신은 malloc이 뭔지 적어도 일반적으로 잘 알고 있습니다. 410 00:24:46,070 --> 00:24:48,970 realloc은 무엇을 맞춰보세요. >> [학생] 메모리를 추가합니다. 411 00:24:48,970 --> 00:24:52,920 꽤 메모리를 추가 없어. 그것은 다음과 같이 메모리를 reallocates. 412 00:24:52,920 --> 00:24:57,220 당신에게 기억을 더 많이 제공 할 수있는 문자열의 끝에서 객실 아직 거기 있다면 413 00:24:57,220 --> 00:25:00,000 그것은 원래를 제공하는 대신 다음은 추가 메모리를드립니다. 414 00:25:00,000 --> 00:25:03,460 그래서 그냥 백업 백업 백업 다시 문자열의 문자를 넣어 보관할 수 있습니다. 415 00:25:03,460 --> 00:25:05,830 그런 경우가 아니라면 당신은 너무 오래 기다린 때문에 416 00:25:05,830 --> 00:25:07,940 그리고 무작위로 뭔가가 메모리에 plopped 어 417 00:25:07,940 --> 00:25:10,290 하지만 추가 메모리가 여기에있어, 괜찮아요. 418 00:25:10,290 --> 00:25:13,100 Realloc, 당신에 대한 모든 무거운 리프팅을 할거야 419 00:25:13,100 --> 00:25:16,750 당신이 지금까지 여기에서 읽은 문자열을 이동을 내려 놓고 420 00:25:16,750 --> 00:25:19,460 그리고 여러분에게 그 점에서 좀 더 활주로를 제공합니다. 421 00:25:19,460 --> 00:25:22,550 >> 그래서 손의 물결과 함께, 제가 어떤 GetString이하는 말하자 422 00:25:22,550 --> 00:25:26,330 그것은 작은 버퍼, 어쩌면 하나의 문자로 시작해야 해 423 00:25:26,330 --> 00:25:30,820 두 개의 문자로 사용자가 유형의 경우 GetString는 realloc를 호출 마무리하는 말 424 00:25:30,820 --> 00:25:33,150 한 문자가 충분하지이었고, 나 한테 2 문자를 제공합니다. 425 00:25:33,150 --> 00:25:35,950 당신은 루프의 논리 읽어 그런 경우, 말거야 426 00:25:35,950 --> 00:25:39,600 3 자에 입력 한 사용자는,, 지금은 2 위이지만 4 자 내놔 427 00:25:39,600 --> 00:25:42,320 그럼 날 16 및 32을 제공 한 후, 내게 팔을 제공합니다. 428 00:25:42,320 --> 00:25:45,000 나는 용량 할 때마다 두 배로 증가한다는 사실 429 00:25:45,000 --> 00:25:48,570 버퍼가 천천히 성장하지 않을 것을 뜻하는 바는, 그것이 매우 빨리 성장거야. 430 00:25:48,570 --> 00:25:51,380 그리고 그의 장점이 될 수 있을까요? 431 00:25:51,380 --> 00:25:54,600 이유는 버퍼의 크기를 두 배로 무엇입니까 432 00:25:54,600 --> 00:25:58,020 사용자는 키보드에서 하나 추가 문자를해야 할 수도 있습니다에도 불구? 433 00:25:58,020 --> 00:26:01,750 [안 들리게 학생 응답] >> 그게 뭐야? >> [학생] 당신은으로 자주 성장을 할 필요가 없습니다. 434 00:26:01,750 --> 00:26:03,300 그렇지. 당신은 자주 성장을 할 필요가 없습니다. 435 00:26:03,300 --> 00:26:05,510 그리고이 일이 당신이긴 것은, 여기에 돈을 hedging하고 436 00:26:05,510 --> 00:26:10,850 아이디어는 속도가 느린 경향이 있기 때문에 realloc 많은 전화를하지 않으려는 것. 437 00:26:10,850 --> 00:26:12,910 당신이 메모리 운영 체제에게 모든 시간을 438 00:26:12,910 --> 00:26:16,990 당신은 곧 미래의 문제 세트에 볼 수로, 그것은 시간이 좀 걸릴 경향이있다. 439 00:26:16,990 --> 00:26:20,010 그럼 당신은 공간을 낭비하는 경우에도, 시간의 양을 최소화 440 00:26:20,010 --> 00:26:21,900 좋은 일이 될 경향이있다. 441 00:26:21,900 --> 00:26:24,060 >> 그러나 우리는 여기 GetString의 마지막 부분을 읽어 경우 - 442 00:26:24,060 --> 00:26:27,950 다시 여기에 모든 한 줄을 이해하는 것은 오늘날 매우 중요하지 않습니다 - 443 00:26:27,950 --> 00:26:30,530 결국에는 다시 malloc 호출 것을 알 444 00:26:30,530 --> 00:26:33,880 이 문자열을 필요로하고 많은 바이트로 정확히 할당 445 00:26:33,880 --> 00:26:38,060 그리고 무료로 과도하게 큰 버퍼를 호출하여 버리 겠어요 446 00:26:38,060 --> 00:26:40,080 그것은 실제로 너무 많이 두 배로라도한다면. 447 00:26:40,080 --> 00:26:42,730 그래서 짧은에, 그 GetString이 모든 시간을 작업 한 방법입니다. 448 00:26:42,730 --> 00:26:47,060 모두는 또 한번, 또 한번 다시 한 번에 한 문자를 읽어 않습니다 449 00:26:47,060 --> 00:26:50,750 하고 몇 가지 추가 메모리를 필요로 할 때마다, 그것은을 위해 운영 체제를 묻는 450 00:26:50,750 --> 00:26:53,670 realloc를 호출하여. 451 00:26:53,670 --> 00:26:57,890 >> 질문? 괜찮아요. 452 00:26:57,890 --> 00:26:59,270 >> 공격. 453 00:26:59,270 --> 00:27:04,060 지금 우리는 포인터를 이해하거나 적어도 포인터와 점점 더 잘 알고 있습니다 454 00:27:04,060 --> 00:27:06,700 온 세상이 파괴되기 시작하는 방법의이 생각해 보자 455 00:27:06,700 --> 00:27:10,030 당신은 매우 적대 사용자에 대해 변호하지 않는 경우, 456 00:27:10,030 --> 00:27:11,850 시스템을 해킹하려고하는 사람들 457 00:27:11,850 --> 00:27:16,890 일부 등록 코드를 우회하여 소프트웨어를 훔치려 사람들 458 00:27:16,890 --> 00:27:19,090 그들은 다른 인치를 입력해야 할 수도 459 00:27:19,090 --> 00:27:22,990 >> 맨 아래에있는 주요 기능이 바로 C 코드, 여기에이 예를 살펴 460 00:27:22,990 --> 00:27:26,380 그 함수 foo는를 호출합니다. 그리고 어떻게하면 foo는에 전달됩니까? 461 00:27:26,380 --> 00:27:29,680 [학생] 하나의 인수입니다. >> [Malan] 하나의 인수입니다. 462 00:27:29,680 --> 00:27:33,450 따라서 변수는 argv [1], 어떤 사용자가 명령 줄에서 입력 한 첫 번째 단어를 의미 463 00:27:33,450 --> 00:27:36,360 a.out 뭐든간에 한 후 프로그램이 호출됩니다. 464 00:27:36,360 --> 00:27:41,680 상단에있는 foo는 숯불 *에 소요하도록합니다. 그러나 문자 *는 무엇인가? >> [학생] 문자열입니다. 465 00:27:41,680 --> 00:27:43,350 [Malan] 문자열, 새로운 게 여기 필요가 없습니다. 466 00:27:43,350 --> 00:27:45,420 그 문자열은 임의의 줄이라고하고 있습니다. 467 00:27:45,420 --> 00:27:51,430 여기에서이 행에서 문자는 C [12], 반 기술 영어의 종류,이 라인은 뭐하는 거지? 468 00:27:51,430 --> 00:27:55,220 의 [학생] 배열 중 - >> 배열? >> [학생] 문자. >> 캐릭터. 469 00:27:55,220 --> 00:27:58,870 나에게 12 자의 배열을 제공합니다. 그래서 우리는이 버퍼 전화 할 수 있습니다. 470 00:27:58,870 --> 00:28:02,920 그것은 기술적으로 C라고하지만, 프로그래밍의 버퍼은 그냥 우주의 무리를 의미있어 471 00:28:02,920 --> 00:28:04,800 당신은 어떤 걸 인치를 넣을 수 있다는 472 00:28:04,800 --> 00:28:07,940 그런 다음 마지막으로, memcpy 우리는 이전에 사용하지 않을했지만, 당신은 아마 그것이 무엇 추측 할 수 있습니다. 473 00:28:07,940 --> 00:28:10,480 이 메모리를 복사합니다. 는 무엇입니까? 474 00:28:10,480 --> 00:28:19,270 그것은 분명 C로, 그 입력, 줄을 복사 만까지 줄의 길이 있습니다. 475 00:28:19,270 --> 00:28:24,930 그러나 여기에 버그가 있습니다. >> [학생] 당신은 sizeof 문자가 필요합니다. 좋아요 >>. 476 00:28:24,930 --> 00:28:30,860 기술적으로는, 우리가 정말 나 strlen을 (바) * sizeof (숯불)).해야 맞습니다. 477 00:28:30,860 --> 00:28:33,930 하지만, 여기에 최악의 경우에, 씨가 도대체​​ 가정 보자 - 478 00:28:33,930 --> 00:28:35,950 좋아요. 그럼 두 버그가 있습니다. 479 00:28:35,950 --> 00:28:39,160 그래서 sizeof (자)); 480 00:28:39,160 --> 00:28:41,290 의이 조금 넓은 만들어 보자. 481 00:28:41,290 --> 00:28:44,910 이제 무슨 버그가 아직 거기 있어요? >> [안 들리게 학생 응답] 482 00:28:44,910 --> 00:28:46,990 어떤 확인? >> [학생] NULL이 있는지 확인합니다. 483 00:28:46,990 --> 00:28:50,270 나쁜 일이 생긴다 때문에 일반적으로 NULL을 확인해야합니다 484 00:28:50,270 --> 00:28:53,200 당신이 거기가는 결국 있기 때문에 귀하의 포인터가 NULL 인 경우 485 00:28:53,200 --> 00:28:57,630 그리고 당신은 별 연산자로 dereferencing하여 NULL 것하지 말아야합니다. 486 00:28:57,630 --> 00:29:01,050 그럼 잘 됐네. 그리고 우리는 다른 뭐하는거야? 논리적 결함도 여기에있다. 487 00:29:01,050 --> 00:29:04,450 [학생] argc가> = 2 인 경우 확인합니다. 488 00:29:04,450 --> 00:29:10,550 argc가> = 2면 확인합니다. 자,이 프로그램에서 세 버그는 여기에 혼자 야. 489 00:29:10,550 --> 00:29:16,630 사용자가 실제로 변수는 argv에 아무것도 입력하면 우리는 지금 확인하고 [1]. 좋아. 490 00:29:16,630 --> 00:29:20,950 따라서 세 번째 버그가 뭐죠? 그래. >> [학생] C만큼 큰되지 않을 수 있습니다. 491 00:29:20,950 --> 00:29:23,320 좋아. 하나는 시나리오를 확인 했어요. 492 00:29:23,320 --> 00:29:29,520 우리는 암시 적 줄의 길이를 초과하는 것보다 더 많은 메모리를 복사하지 않습니다 확인 했어요. 493 00:29:29,520 --> 00:29:32,510 그래서 문자열 경우에 입력 한 사용자는 10 자이며, 494 00:29:32,510 --> 00:29:36,020 이 10 문자를 복사 답니다. 그건 괜찮아. 495 00:29:36,020 --> 00:29:39,940 그러나 사용자가 20 문자 단어와 같은 프롬프트에서 단어에 어떤 입력한다면? 496 00:29:39,940 --> 00:29:44,900 이 일에 바에서 사본 20 자 말인가요? 497 00:29:44,900 --> 00:29:49,750 그렇지 않으면 우리의 버퍼로 알려진 C는, 어느 방금 데이터를 쓴 의미 498 00:29:49,750 --> 00:29:52,540 자신이 소유하지 않은 것을 8 바이트 위치에, 499 00:29:52,540 --> 00:29:54,870 당신은 당신이 그들을 할당 없다는 점에서 소유하고 있지 않습니다. 500 00:29:54,870 --> 00:30:00,370 그래서 일반적으로 버퍼 오버 플로우 공격 또는 버퍼 오버런 공격으로 알려진 곳입니다. 501 00:30:00,370 --> 00:30:05,580 그리고 의미의 공격이야 경우 사용자 또는 함수를 호출있어 프로그램 502 00:30:05,580 --> 00:30:10,490 실제로 옆에 무슨 일이, 악의적으로이 일을 것은 실제로 매우 나쁜 될 수 있습니다. 503 00:30:10,490 --> 00:30:12,450 >> 그럼 여기이 그림을 살펴 봅시다. 504 00:30:12,450 --> 00:30:16,060 이 그림은 메모리의 스택을 나타냅니다. 505 00:30:16,060 --> 00:30:19,580 당신이 함수를 호출 할 때마다 당신은 스택이 작은 프레임을 얻을 리콜 506 00:30:19,580 --> 00:30:21,520 그리고 또 다른 한 다음 다른 또 다른. 507 00:30:21,520 --> 00:30:24,300 그리고 지금까지, 우리는, 그냥 왔어요하면 이러한 직사각형과 같은 추상적 인 508 00:30:24,300 --> 00:30:26,290 보드 나 여기 화면 중. 509 00:30:26,290 --> 00:30:30,580 하지만 당신은 함수 foo는 전화를 그 사각형 중 하나를 확대하면, 510 00:30:30,580 --> 00:30:35,880 그게 더 그 사각형에서 해당 프레임의 스택 안쪽에있을거야 밝혀 511 00:30:35,880 --> 00:30:40,060 보다 우리가 스왑에 대해 얘기했던 것처럼 x와 y와 a와 b. 512 00:30:40,060 --> 00:30:44,410 그것은 일부 낮은 수준의 세부 반환 주소가들이 있다는 밝혀졌다. 513 00:30:44,410 --> 00:30:49,550 메인은 ​​foo는 호출 할 때이 밝혀 주는 푸 알려있다 514 00:30:49,550 --> 00:30:53,520 어떤 메인의 주소는 컴퓨터의 메모리에 515 00:30:53,520 --> 00:30:57,770 달리하기 때문에, 가능한 한 빨리 foo는 등, 여기이 경우에서와 같이 실행 완료 516 00:30:57,770 --> 00:31:00,830 일단, foo는의 끝에이 폐쇄 둥근 중괄호에 도달 517 00:31:00,830 --> 00:31:05,310 프로그램의 컨트롤이 가야되는 방법을 대체 foo는 알 수 있습니까? 518 00:31:05,310 --> 00:31:08,970 그것은 그 질문에 대한 답이 여기에 빨간색 사각형에있는 것을 밝혀졌다. 519 00:31:08,970 --> 00:31:12,670 이 포인터를 나타냅니다, 그것은 일시적으로 저장하기 위해 컴퓨터에 일이에요 520 00:31:12,670 --> 00:31:17,030 소위 스택에 해당하므로 가능한 한 빨리 푸 등 주요의 주소가 실행되면, 521 00:31:17,030 --> 00:31:21,120 컴퓨터는 어디으로 돌아가려면 메인에 어떤 줄 알고 있습니다. 522 00:31:21,120 --> 00:31:23,940 저장된 프레임 포인터는 비슷하게 관련이 있습니다. 523 00:31:23,940 --> 00:31:26,310 여기에 숯불에 * 표시 줄이 무엇을 제시 하는가? 524 00:31:26,310 --> 00:31:31,350 이제이 파란색 세그먼트는 여기 foo는의 프레임입니다. 바는 무엇입니까? 525 00:31:31,570 --> 00:31:35,010 바는 빌어 먹을 함수에 대한 인수입니다. 526 00:31:35,010 --> 00:31:37,500 그래서 지금 우리는 익숙한 그림의 종류 돌아 간다. 527 00:31:37,500 --> 00:31:39,850 화면에 더 많은 것들을 더 산만가 있어요 528 00:31:39,850 --> 00:31:43,380 하지만 하늘색 구간은 우리가 칠판에 그리기 봤는데 무슨 529 00:31:43,380 --> 00:31:45,790 스왑과 같이하십시오. 그 foo에 대한 프레임입니다. 530 00:31:45,790 --> 00:31:51,490 그리고 하나 밖에 없던 지금이 매개 변수입니다, 바 있습니다. 531 00:31:51,490 --> 00:31:55,220 하지만 다른 무슨 일이이 코드에 따라 스택에해야하나요? 532 00:31:55,220 --> 00:31:57,760 [학생] 숯불 C [12]. >> [Malan] 숯불 C [12]. 533 00:31:57,760 --> 00:32:02,810 또한, C라는 변수에 할당 된 메모리의 12 제곱이 표시됩니다 534 00:32:02,810 --> 00:32:04,970 그리고 실제로 우리는 화면에 해당있어. 535 00:32:04,970 --> 00:32:08,480 맨 위에가 C [0]이 다이어그램의 다음, 저자 536 00:32:08,480 --> 00:32:11,850 사각형의 그리기 귀찮게하지만, 거기에 12 실로 있습니다 않았어 537 00:32:11,850 --> 00:32:16,590 너 때문에 오른쪽 하단에 보면, C [11] 당신이 0에서 계산하면 12 등 바이트입니다. 538 00:32:16,590 --> 00:32:18,400 그러나 여기 문제입니다. 539 00:32:18,400 --> 00:32:22,390 C는 어떤 방향으로 성장입니까? 540 00:32:22,390 --> 00:32:27,080 정렬은 상단에있는 시작하고 아래로 자라는 경우 아래 상단의. 541 00:32:27,080 --> 00:32:30,110 우리 모두가 이곳 우리에게 많은 활주로를 떠난 것처럼 보이지 않습니다. 542 00:32:30,110 --> 00:32:32,090 우리는 가지, 구석에 자신을 색칠 한 543 00:32:32,090 --> 00:32:36,940 그 C [11] 저장된 프레임 포인터에 대한 바로입니다 바,에 대한 바로이며, 544 00:32:36,940 --> 00:32:39,960 이는 반환 주소에 대한 바로입니다. 더 이상 공간이 없습니다. 545 00:32:39,960 --> 00:32:42,810 당신이 실수다면 의미는 뭐죠 546 00:32:42,810 --> 00:32:46,500 당신은 12 바이트 버퍼에 20 바이트를 읽어보세요? 547 00:32:46,500 --> 00:32:50,060 어디 그 여덟 추가 바이트가는거야? >> [학생] 내부 - 548 00:32:50,060 --> 00:32:53,200 다른 모든 내부, 그 중 일부는 중요한 슈퍼입니다. 549 00:32:53,200 --> 00:32:57,260 그리고 가장 중요한 것은, 잠재적으로,,, 거기에 반환 주소 빨간 상자입니다 550 00:32:57,260 --> 00:33:03,560 때문에, 당신이 중 실수로 또는 adversarially 그 4 바이트를 덮어 쓰게했다고 가정 551 00:33:03,560 --> 00:33:07,260 쓰레기 만 있고 번호가 아니라 그 포인터 주소, 552 00:33:07,260 --> 00:33:09,810 그 메모리에 실제 주소를 나타 내기 위해 발생합니다. 553 00:33:09,810 --> 00:33:13,880 논리적으로 의미가 무엇입니까? >> [학생] 기능이 다른 곳으로 돌아 예정이다. 554 00:33:13,880 --> 00:33:15,250 그렇지. 555 00:33:15,250 --> 00:33:19,170 foo는 반환 및 조회수 곱슬 괄호 것으로, 프로그램은 진행하려고하는 경우 556 00:33:19,170 --> 00:33:25,060 메인으로 돌아하지, 그 빨간 상자에있는 모든 주소로 돌아거야. 557 00:33:25,060 --> 00:33:28,600 >> 우회 소프트웨어 등록의 경우, 558 00:33:28,600 --> 00:33:32,260 에 반환되고 있어요 주소는 일반적으로 호출됩니다 함수인지하는 경우 559 00:33:32,260 --> 00:33:35,690 당신은 소프트웨어를 지불하고 등록 코드를 입력 된? 한 후 560 00:33:35,690 --> 00:33:39,870 당신은 여기 안에 트릭 컴퓨터의 정렬 대신 여기에 갈 수 있습니다. 561 00:33:39,870 --> 00:33:45,100 당신이 정말로 똑똑한 경우 또는 상대는 실제로 예를 들어, 키보드에서 입력 할 수 있습니다 562 00:33:45,100 --> 00:33:50,690 하지 실제 단어가 아닌 20 자하지만, 자신이 실제로 종류의 가정 563 00:33:50,690 --> 00:33:52,770 코드를 나타냅니다 일부 문자. 564 00:33:52,770 --> 00:33:55,320 그리고 C 코드로 보낸다는 뜻이 아니라, 실제로 문자 될거야 565 00:33:55,320 --> 00:33:59,290 그 0s와 1S 바이너리 기계 코드를 나타냅니다. 566 00:33:59,290 --> 00:34:01,290 그러나, 그들은 그 일을 할 정도로 똑똑 겠지 567 00:34:01,290 --> 00:34:06,500 어떻게 든 본질적으로 컴파일 된 코드입니다 GetString 프롬프트 무언가에 붙여 넣으려면 568 00:34:06,500 --> 00:34:09,980 그리고 마지막 4 바이트는 반환 주소를 덮어 씁니다. 569 00:34:09,980 --> 00:34:13,360 그리고 입력 어떻게 주소를하나요? 570 00:34:13,360 --> 00:34:18,630 사실은이 빨간 사각형 버퍼의 첫번째 바이트의 주소를 저장합니다. 571 00:34:18,630 --> 00:34:23,070 , 그래서 당신은 정말 똑똑한해야하고,이 밖에 나쁜 사람들을위한 시행 착오가 상당히 많은데 572 00:34:23,070 --> 00:34:25,639 하지만이 버퍼가 얼마나 커 알아낼 수 있다면 573 00:34:25,639 --> 00:34:28,820 입력의 마지막 몇 바이트는 사용자가 프로그램에 제공하는 등 574 00:34:28,820 --> 00:34:33,540 귀하의 버퍼의 시작의 주소에 해당 될 일이, 당신은이 작업을 수행 할 수 있습니다. 575 00:34:33,540 --> 00:34:39,320 우리가 일반적으로 인사하고 \ 0라고하면, 그 버퍼에 봤 구요. 576 00:34:39,320 --> 00:34:44,420 그러나 우리는 더 똑똑 하구나 우리는 우리가 총칭 공격 코드를 뭐라고 부를와 그 버퍼를 작성하는 경우 - 577 00:34:44,420 --> 00:34:48,860 AAA, 공격, 공격, 공격 -이는 뭔가 나쁜 일을 수행 거고, 578 00:34:48,860 --> 00:34:51,820 당신이 정말로 현명하다면 어떻게, 당신은이 작업을 수행 할 수 있습니다. 579 00:34:51,820 --> 00:34:58,610 80, C0, 35, 08 - 여기 빨간 상자에있는 숫자의 순서입니다. 580 00:34:58,610 --> 00:35:01,610 그 여기 있어요 수를 일치하는지 확인합니다. 581 00:35:01,610 --> 00:35:04,430 이 반대 순서로하지만 그 어떤 다른 시간에 더. 582 00:35:04,430 --> 00:35:08,140 이 반환 주소가 의도적으로 변경되었는지 확인합니다 583 00:35:08,140 --> 00:35:12,020 여기에 주소를 동일하기 위해, 메인의가 아닌 주소를 입력합니다. 584 00:35:12,020 --> 00:35:17,500 나쁜 남자가 슈퍼 똑똑하면, 그 또는 그녀는 공격 코드에 포함 것입니다 585 00:35:17,500 --> 00:35:20,930 사용자의 모든 파일을 삭제하거나 암호를 복사 같은 걸 586 00:35:20,930 --> 00:35:24,680 또는 그때에 로그인 할 수있는 사용자 계정을 만들 - 아무것도 전혀. 587 00:35:24,680 --> 00:35:26,950 >> 그리고이 위험과 C.의 힘이기도하다 588 00:35:26,950 --> 00:35:29,840 당신은 포인터를 통해 메모리에 액세스 할 수 있습니다 때문에 589 00:35:29,840 --> 00:35:32,520 그리고 따라서, 컴퓨터의 메모리에 당신이 원하는 무엇이든을 작성할 수 있습니다 590 00:35:32,520 --> 00:35:35,080 당신은 컴퓨터가하고 싶은 일을 할 수 있습니다 591 00:35:35,080 --> 00:35:39,550 간단하게하는 것은 자신의 메모리 공간 내 주위에 뛰어든지. 592 00:35:39,550 --> 00:35:44,650 그리고이 일을 너무 많이 프로그램 및 많은 웹 사이트가 손상됩니다 593 00:35:44,650 --> 00:35:46,200 이 활용 사람들에게 졸이다. 594 00:35:46,200 --> 00:35:50,760 그리고이 슈퍼 정교한 공격처럼 보일 수도 있지만 항상 그런 식으로 시작되지 않습니다. 595 00:35:50,760 --> 00:35:53,560 현실은, 어떤 나쁜 사람들이 일반적으로 할 것 것이 때문입니다 596 00:35:53,560 --> 00:35:58,200 이 명령 줄에서 프로그램이나 GUI 프로그램이나 웹 사이트, 고갈 된 것인지 597 00:35:58,200 --> 00:35:59,940 당신은 헛소리를 제공 시작합니다. 598 00:35:59,940 --> 00:36:03,980 당신은 검색 필드를 누르 입력에 아주 큰 단어를 입력 599 00:36:03,980 --> 00:36:05,780 그리고 당신은 웹 사이트가 충돌하는지 기다려 600 00:36:05,780 --> 00:36:09,990 또는 프로그램이 몇 가지 오류 메시지가 명부 지켜보기로 하죠 601 00:36:09,990 --> 00:36:14,330 당신은 나쁜 사람으로 운이 좋고 경우에 당신은 어떤 미친 입력을 제공하기 때문에 602 00:36:14,330 --> 00:36:18,980 프로그래머가 나쁜 행동을 예상하지 않았다는 프로그램을, 충돌 그 603 00:36:18,980 --> 00:36:23,630 이것은 당신이 충분한 노력을 충분히 시행 오류가있을 수 있습니다 의미 604 00:36:23,630 --> 00:36:26,650 보다 정확한 공격을 임금하는 방법을 알아 봅시다. 605 00:36:26,650 --> 00:36:31,410 보안이 너무 많은 부분은 모두 이러한 공격을 피할 수 있지 않습니다 606 00:36:31,410 --> 00:36:34,100 하지만 그들을 감지하고 실제로 로그를보고 607 00:36:34,100 --> 00:36:36,780 그리고 미친 입력 귀하의 웹 사이트에 입력 사람들이 어떤 그림을 그릴 지, 608 00:36:36,780 --> 00:36:38,960 어떤 검색어가 귀하의 웹 사이트에 사람들을 입력 한 609 00:36:38,960 --> 00:36:42,870 일부 버퍼를 넘쳐의 희망 인치 610 00:36:42,870 --> 00:36:45,500 그리고 일의 간단한 기본이 모든 때문인는 배열 611 00:36:45,500 --> 00:36:49,080 과가 메모리를 할당하고 사용한다는 것은 무슨 뜻입니까. 612 00:36:49,080 --> 00:36:51,710 >> 그 후도 이것과 관련. 613 00:36:51,710 --> 00:36:54,280 그냥 이번에도 하드 드라이브의 내부 훑어 보자. 614 00:36:54,280 --> 00:36:58,440 당신은 전에 한 두 주에서 기억 당신이 휴지통 또는 휴지통에 파일을 드래그 할 때 615 00:36:58,440 --> 00:37:03,710 어떤 일이 벌어 질까요? >> [학생] 아무것도. >> 물론 아무것도, 맞죠? 616 00:37:03,710 --> 00:37:05,740 당신은 디스크 공간이 부족, 결국 경우 617 00:37:05,740 --> 00:37:08,190 Windows 또는 Mac OS 당신을 위해 파일을 삭제하기 시작합니다. 618 00:37:08,190 --> 00:37:10,390 당신이 거기에 뭔가를 드래그한다면, 그 모든 안전에 있지 않습니다. 619 00:37:10,390 --> 00:37:13,800 모든 룸메이트 나 친구 나 가족이해야 할 일이 두 번 클릭하고, 좋아,있다 620 00:37:13,800 --> 00:37:16,310 삭제할하려고하는 모든 스케치 파일이 있어요. 621 00:37:16,310 --> 00:37:19,590 우리 대부분은 적어도 당신은 마우스 오른쪽 버튼을 클릭하거나 클릭을 제어해야 겠지만 622 00:37:19,590 --> 00:37:22,310 그 같은 쓰레기거나 빈. 623 00:37:22,310 --> 00:37:25,000 하지만 그렇다하더라도 매우 트릭을하지 않는 624 00:37:25,000 --> 00:37:28,010 귀하의 하드 드라이브에 파일이있을 때 어떤 현상이 발생하기 때문에 625 00:37:28,010 --> 00:37:32,770 그 몇 가지 Word 문서 또는 일부 JPEG를 나타내고,이 하드 드라이브를 나타냅니다 626 00:37:32,770 --> 00:37:35,350 그리고 시작하자 여기 조각이 그 파일을 나타냅니다 말 627 00:37:35,350 --> 00:37:38,390 그리고 그것은 0s와 1S의 전체 무리로 구성있어. 628 00:37:38,390 --> 00:37:42,470 무슨 만 휴지통으로 해당 파일을 드래그하면 어떻게됩니까 또는 bin을 재활용 할 수 629 00:37:42,470 --> 00:37:48,020 뿐만 아니라 그것을 비우? 아무것도의 정렬. 630 00:37:48,020 --> 00:37:49,640 지금은 아무것도 아니예요. 631 00:37:49,640 --> 00:37:54,290 작은 일이이 테이블의 형태로 발생하기 때문에 지금은 그냥 아무것도 없습니다. 632 00:37:54,290 --> 00:37:58,370 따라서 컴퓨터의 메모리 내부 데이터베이스 또는 테이블의 어떤 종류가 있어요 633 00:37:58,370 --> 00:38:03,850 이는 본질적으로, 파일에 대해 하나의 열 '이름과 파일에 대한 하나의 열'위치를 자랑합니다 634 00:38:03,850 --> 00:38:07,720 곳이 위치 123 만 임의의 숫자 일 수 있습니다. 635 00:38:07,720 --> 00:38:14,560 그래서 우리는 x.jpeg 및 위치 123 같은이있을 수 있습니다. 636 00:38:14,560 --> 00:38:18,800 당신은 실제로 휴지통을 비울 때 그런데 무슨 일 이죠? 637 00:38:18,800 --> 00:38:20,330 멀리해라. 638 00:38:20,330 --> 00:38:23,610 그런데 멀리하지 않는 것은 0s와 1 초입니다. 639 00:38:23,610 --> 00:38:26,270 >> 따라서 pset4에 연결 한 다음 뭐죠? 640 00:38:26,270 --> 00:38:31,240 음, pset4과 함께 우리가 실수 컴팩트 플래시 카드를 삭제 한 이유는 641 00:38:31,240 --> 00:38:35,750 불운 이러한 사진의 전부 또는 단지 때문에를하던 그 손상되었다 642 00:38:35,750 --> 00:38:38,000 0s와 1S가 아직 없습니다 것을 의미하는 것은 아닙니다. 643 00:38:38,000 --> 00:38:40,410 무언가가 손상 죽었 기 때문에 아마 그 중 몇은 손실됩니다 644 00:38:40,410 --> 00:38:43,320 일부 0s는 1 초되었고, 1 초는 0s 된 이었어요. 645 00:38:43,320 --> 00:38:47,240 버그가 소프트웨어 또는 하드웨어 결함 때문에 나쁜 일이 발생할 수 있습니다. 646 00:38:47,240 --> 00:38:50,370 그러나 그 비트의 대부분은, 아마도 그들도 100 %, 아직 거기있다. 647 00:38:50,370 --> 00:38:55,050 이 JPEG1 시작 위치를 컴퓨터 나 카메라가 모르는 단지 648 00:38:55,050 --> 00:38:56,910 및 위치 JPEG2가 시작되었습니다. 649 00:38:56,910 --> 00:39:01,070 그러나 경우 프로그래머는 이러한 JPEG 파일이 이해가 약간을 가진 650 00:39:01,070 --> 00:39:06,010 또는 그들이 모습은 그래서 당신은 0s와 1 초와 말 JPEG, JPEG를 분석 할 수 있습니다 651 00:39:06,010 --> 00:39:09,440 당신은 본질적으로 단지에있는 프로그램을 작성하거나 할 수 있지만 루프 652 00:39:09,440 --> 00:39:12,820 그게 그 파일들 하나 하나를 복구합니다. 653 00:39:12,820 --> 00:39:16,030 강의는 안전하게 파일을 지우고 시작하는 것입니다 654 00:39:16,030 --> 00:39:18,340 당신은 모두 이러한 일을 방지하려면. 예. 655 00:39:18,340 --> 00:39:21,010 >> [학생] 어째서이 컴퓨터에 말한다 656 00:39:21,010 --> 00:39:23,550 당신은 전에했던 것보다 더 많은 메모리를 가지고? 657 00:39:23,550 --> 00:39:27,820 당신은 전에했던 것보다 더 많은 메모리를 가지고 - >> [학생] 더 사용할 수있는 메모리. 658 00:39:27,820 --> 00:39:29,630 오. 좋은 질문입니다. 659 00:39:29,630 --> 00:39:32,360 왜 다음 휴지통을 비우는 후 컴퓨터가 말 않습니다 660 00:39:32,360 --> 00:39:34,910 당신이 전에보다 더 많은 여유 공간이 있는지? 661 00:39:34,910 --> 00:39:36,770 간단히 말해서, 그건 거짓말이 없기 때문입니다. 662 00:39:36,770 --> 00:39:40,740 지금 당신이 한 말 때문에 더 기술적으로, 당신은 더 많은 공간을해야합니까 663 00:39:40,740 --> 00:39:43,680 그 파일이 있었던 위치를 다른 물건을 넣을 수 있습니다. 664 00:39:43,680 --> 00:39:45,450 하지만, 비트 멀리가는 것은 아닙니다 665 00:39:45,450 --> 00:39:48,590 그리고 그 비트 예를 들어, 모든 0s으로 변경되는 것은 아닙니다 666 00:39:48,590 --> 00:39:50,150 당신을 보호하기 위해. 667 00:39:50,150 --> 00:39:54,640 그럼 반대로, 당신은 안전하게 파일을 삭제하거나 물리적 장치를 파괴 할 수 있다면 668 00:39:54,640 --> 00:39:57,300 그건 정말 그 주변에 가끔있는 유일한 방법입니다. 669 00:39:57,300 --> 00:40:02,020 >> 그럼 왜 우리는 그 반 무서운 쪽지를 떠나지 말아요, 우리는 월요일에 표시됩니다. 670 00:40:02,020 --> 00:40:07,000 [박수] 671 00:40:07,780 --> 00:40:10,000 >> [CS50.TV]