[음악 연주] DAVID J. 마란 : 좋아요. [웃음] 다시 오신 것을 환영합니다. 이 CS50입니다. 이 주 5의 끝. 그리고 지금까지, 우리는 꽤 많이했습니다 부여를 위해 복용하고 거기 당신이가이 컴파일러 연타를 존재 이 방식으로 호출되어 다른 도구는 어떻게 든 확인 전화 마법의 소스 코드를 변환 오브젝트 코드를 0과 1로 당신의 컴퓨터 CPU, 중앙 처리 장치는, 실제로 이해한다. 의 숫자가 거기 밖으로하지만 변 에 후드 아래에가는 입력과 출력 사이. 그리고 나는 우리가 육체 제안하고 싶습니다 좀 더 자세하게에있는 것을 밖으로 이 네 단계라는 뭔가를 사전 처리, 뭔가 우리가 보았 컴파일,라는 뭔가 조립라고하며, 뭔가 연결했다. 그래서 지금까지, 우리의 일부 프로그램은, 우리는 날카로운 포함 했어. 더 최근에 우리는 일부 날카로운 했어 상수를 정의합니다. 그래서 밝혀 것들이 그 해시 기호 또는로 시작하는 파운드 기호는 전 처리기입니다 지시어. 그건 그냥 그건 말하는 멋진 방법 실제로 코드의 라인 전에 다른 무언가로 변환 컴퓨터도 변환하려고하여 0과 1로 프로그램입니다. 예를 들어, 날카로운 표준을 포함 I / O. 시간이 꽤 많이 그냥 가서 의미 앞서, 파일의 내용을 잡아 stdio.h에 오른쪽이 붙여 넣습니다. 그래서 아무 제로하지 않으며 사람 아직 그 시점에서. 그것은 정말로 단지 대체입니다. 그리고는 소위 동안 이루어집니다 사전 처리 단계 때 실제로 구체적으로 연타를 실행하거나 대부분의 경우에서 확인합니다. 그래서이 모든 일이되었습니다 먼저 자동으로 지금까지. 그런 다음 컴파일 단계가 온다. 그러나 우리는 단순화 봤는데 컴파일. 프로그램을 컴파일하는 것은 정말로 의미 , C 같은로부터 받아 소스 코드를 우리는 아래로, 쓰기 봤는데 뭔가 어셈블리를 호출합니다. 어셈블리 언어는 낮은 수준 언어에게 다행히도, 우리는하지 않습니다 많은에 기회있다 이번 학기를 작성합니다. 그러나 그것은에서 가장 낮은 수준의 당신은 문자 그대로 쓰기 시작하는 의미 더하기 및 빼기와 곱하기 및로드 메모리와 저장 메모리, 아주 기본적인 지시하는 컴퓨터 후드 아래, 실제로 이해한다. 마지막으로, 조립은 언어를 걸립니다 우리가 있었다는 것을 0과 1로 지금까지 설명. 그리고 정말 마지막으로, 소위 거기 단계를 연결, 어떤 우리가 거 결합 잠시,에서 볼 여러분의 0과 0으로 사람과 전에 사람 다른 사람 당신이 만들었습니다. 그래서 매우 간단한 프로그램을 고려하십시오. 그것은 1 주에서였다. 다만, Hello World를 말했다, 화면에. 우리는 연타를 통해이 달렸다. 또는 우리는 그것을 통해 확인 실행 이는 연타를 달렸다. 그리고 시간 출력 위치 약간의 0과 1. 거기 밖으로하지만 변 중간 단계. 여기에 가면 - 죄송합니다,하지 않았다 아직 그를보고 싶어요. 내 장비에 여기에 가면 나는 hello.c의, 여기 열어 같은 프로그램입니다. 그리고 내가 내 터미널에서 할거야 여기에 윈도우가 나는 갈거야 있습니다 , 연타를 실행하기보다는 확인하는 의 네 가지를 자동화 우리 그 단계. 그리고 연타-S를 할 건데 입력 한 후 hello.c를하고. 그리고 깜박이는 프롬프트가 다시, 이것은 좋은 것입니다. 그리고 지금 큰 창에서, 여기의 gedit를 열고거야. 그리고 그 파일을 열거야 밝혀 hello.s에게이라고합니다 해당 어셈블리 언어를 포함 아까 언급. 이 어셈블리라는거야 언어를 매우 낮은 수준 지시 당신의 인텔 CPU 또는 무엇이든 그것은 내부의 즉 이해한다. 그리고 운동은 움직임입니다. 호출입니다 , 매우 낮은 수준 함수를 호출. 서브 빼기위한 것입니다. 당신은 내부에 특정 CPU가 그렇게 할 때 귀하의 컴퓨터에서, 무엇을 만든다 에 별개 대 다른 CPU를 시장되는 지시 해 이해하고 종종 어떻게 효율적으로 해 그것은 어떤을 실행에 얼마나 빠르게이며, 이러한 지침. 지금이에 대한 자세한 내용은, 당신은 걸릴 수 있습니다 대학에서 다음 가을 CS61. 그러나 여기에서 우리는 몇 가지, 예를 들어,이 잘 보일 수 있습니다 식별자. hello.c를 프로그램의 이름입니다. . 텍스트 - 그 정도는 거기 아니다 지금, 기억하는 텍스트 여기서의 세그먼트는, 월요일로입니다 메모리는 프로그램이 실제로 끝납니다. 그래서 적어도 막연의 이 익숙한. 여기에 물론, 언급하다 우리의 주요 기능. 아래로 스크롤, 이러한 것들을 참조 라는 레지스터의 아주 작은 덩어​​리 실제 CPU의 메모리 내부. 그리고 난 아래로 스크롤하면 또한, 나는 어떤 종류의를 참조하십시오 ASCII의 간접적 인 언급. 그리고 실제로, 해당 문자열이 있습니다 안녕하세요, 쉼표 세계. 그래서 긴 이야기 짧은이되었습니다 자동으로 당신을 위해 발생 후드 아래에이 모든 시간. 그리고 어떤 일이 있었 정말 한 번입니다 당신은 연타를 실행하거나의 방법으로 한 , 먼저 받고있어, 확인 소스 코드에서, 어셈블리 언어 소위. 다음 연타이 어셈블리로 변환합니다 아래로 0과 1로 언어입니다. 그리고 이것은 우리가 시작하는 슬라이드입니다 에 주 0에서 논의 - 다음에 주 1. 그리고 마지막으로, 이러한 0과 1 0과 1로 결합 이러한 라이브러리에서 우리가 받고 있어요 표준 I / O 나처럼 부여 문자열 라이브러리 또는 CS50 라이브러리입니다. 그래서 더이 그림을 그릴 시각적으로, 우리는 hello.c의가 있습니다. 그리고 물론, printf를 사용 안녕하세요 세계, 말을 작동합니다. 컴파일 단계에 내려 간다 해당 파일 우리는 단지 심지어 hello.s를 보았다 일반적으로 삭제됩니다 그 생각 자동으로. 하지만 그 어셈블리 코드의 중간 단계에있다. 그리고, 우리는 어셈블리를 조립하는 경우 때 언어는, 말하자면, 그건 이러한 0과 1을 얻는다. 그래서 우리는에 오늘 효율적으로 확대 한 무엇을 당연한 우리가 복용 한 것은, 소스 코드를가는 방법 개체 코드. 하지만 마지막으로, 지금 같은 그림 - 그것을 통해에 밀어하자 왼쪽. 그리고 참고 상단에가 나는 stdio.h에 언급. 그것은 우리가 포함했던 파일의 거의 모든의의 우리가 작성한 프로그램. 그리고 그 내용이 파일의 복사 붙여 넣기 얻을, 효과적으로 코드 꼭대기. 그러나 그것은 즉, 컴퓨터에서 밝혀 시스템 어딘가에 아마 거기 누군가 년 쓴 stdio.c 파일 전 그 모두 구현 선언 된 기능 stdio.h에있다. 지금 현실에서 그것은에 아마의 심지어 당신의 Mac 또는 PC를 CS50 어플라이언스는 원시 C 코드입니다. 누군가가 이미 그것을 컴파일 및 포함 . 오 오브젝트 코드 파일이나. 공유 라이브러리를 참조 파일 그는 미리 설치되어있어 당신을 위해 미리 컴파일. 그러나 실제로 존재한다고 가정 병렬로 우리의 컴퓨터 stdio.c에 연타로. 귀하의 코드는 컴파일되는 것 및 조립. stdio.c의 코드는 컴파일되고 조립, 그래서 이것은 매우 마지막으로 그 여기까지, 단계, 우리는 어떻게 든해야만 링크 말하자면, 당신의 0과 1 하나에 자신의 0과 1로 궁극적으로 간단한 프로그램 안녕하세요 방금 전화. 그래서 그건 마법의 전부 지금까지 일어나고. 그리고이를 취할 것 에 대한 프로세스를 부여하지만, 실현 수분이 많은 세부 사항이있다 이 아래에있는 것. 그리고이 만드는 것입니다 귀하의 인텔 내부 컴퓨터 특히 독특한. 그래서 메모, 당신이 좋아 한 경우에 이번 주 금요일 점심에 우리와 함께 가야 할 일반적인 장소 cs50.net/rsvp에, 오후 1시 15분 이번 주 금요일. 지금은 몇 가지 공지 사항. 그래서 우리는 몇 가지 좋은 소식이있다. 그리고 우리는 나쁜 소식이있다. 여기에 몇 가지 좋은 소식으로 시작합니다. [신음 소리]를 좋아. 음, 그래서 기술적 휴일의 그것은 순전히 저희에게서 선물이 아니다. 물론 그런데 나쁜 소식. [신음 소리]를 나는 많은 시간을 보냈다 이 애니메이션에. [웃음] 리뷰 세션이있을 것 이 월요일오고. 그것은 오후 5:30에있을거야. 우리는 모든 세부 사항을 당신을 생각 나게합니다 코스의에 이메일을 통해 일 시간의 단지 몇 웹 사이트. 그것은 촬영과 제공 될 것입니다 잠시 후. 당신이 만들 수없는 경우에 그 월요일 밤 슬롯, 걱정하지 마십시오. 섹션이 오는 주는 것 퀴즈에 대한 검토에 초점을 맞 춥니 다. 귀하의 섹션은 월요일에있을 경우 실제로 대학 공휴일, 우리가 ... 여전히 절에서 만난다. 당신은 단순히 그렇게 할 수없는 경우 섹션 거 야 때문에 멀리, 저 괜찮아요. 일요일 또는 화요일 섹션이나 참석 제이슨의 섹션 튜닝에서, 어느 것 온라인. 그래서, 더 나쁜 소식. 따라서 교과에 따라, 우리는 다음 주 금요일 강의가 있습니다. 하지만 좋은 소식 - 분명히,이에 너무 많은 시간을 보냈다. [웃음] 우리는 금요일 강의 다음주 취소 할 것이다. 그래서 우리를위한 선물이 될 것이다, 그래서 당신 정말 좋은 휴식에있을 수 있습니다 이번 주에 따라서 이주 사이. 없이 강의를 다음 주, 단지 작은 그래서 당신이해야하는 약간의 퀴즈 점점 흥분. 그럼 이제 우리의 관심을 돌려 보자 실제로 시각적 인 무언가 더 흥미로운 무대를 설정 수평선에있을거야 무엇을 위해 주 시간이 단지 몇한다. 첫 번째 퀴즈 후, 우리는 회전합니다 우리의 문제 세트의 또 다른 초점 특정 도메인 문제, 그 더 일반적으로 수사 또는 보안. 이 문제와 사실, 전통 세트는 나를 위해 중 하나입니다 활보하는 동료 또는 CA를 가르치는 몇 가지 사진을 찍는 캠퍼스 식별하지만 비 명백한 사람 다음 장소 또는 물건, 매년 I 어떻게 든 실수로 삭제 관리 또는 디지털 미디어 카드가 손상 그것은 우리 카메라의 내부입니다. 하지만 큰 문제. 내가 가서 연결할 수 있습니다 내 컴퓨터로합니다. 나는 그래서 그것의 법정 이미지를 만들 수 있습니다 0을 복사하여, 말하고하는 그 메모리 카드의 것들 해제 여부 는 SD 카드 나 컴팩트 플래시 카드 당신은에 익숙 뭐든간에. 그리고 우리는 밖으로 손 수 있습니다. 그리고 다른 사이에 앞으로 도전 당신을위한 일들이 작성하는 것 의 전체 무리를 복구 C 코드 나를 위해 JPEG 파일과 공개가 될 것입니다 사람, 장소 또는 물건. 우리는 또한이 문제에 얘기하자 설정하고 일에 대해, 올 더 일반적으로 그래픽. 우리는, 물론 그들을 사용했습니다 탈출합니다. 당연하지만 당신은 일종의 촬영했습니다 이러한 높은 수준의 개념이 존재 사각형 및 타원형의. 하지만 후드 아래에 픽셀이 있습니다. 그리고 당신은 시작해야했습니다 그 생각. 또는 당신은 P-4 세트 생각해야합니다에 대한 귀하의 벽돌 사이의 차이에 대해 어떻게 빨리 당신이 공을 가로 질러 이동하고 의 화면 탈옥. 따라서이 개념은있다 의 화면에 점 이미 재생에 와서. 지금 당신이 보는 무슨은하지만, 무엇 당신은 컴퓨터 화면에 얻을. 당신은 좋은 또는 시청 한 경우 나쁜 TV는 확률은 꽤 많이 있습니다 technophobes 같은 청중을 치료 사람 정말 싫어요 많은 컴퓨팅에 대해 알고있다. 그리고 그것은 경찰 아주 쉽다 말할 형사, 당신은 할 수 있습니다 나를 위해 그 업을 청소? 또는 오른쪽으로 향상? 강화는에서 버즈 단어처럼 대부분의 모든 범죄 관련 보여줍니다. 당신은 아주 가지고가는 경우와 현실은 하는 의심의 흐릿한 사진 뭔가 나쁜, 당신은 할 수 없습니다 다만 그것을 향상시킬 수 있습니다. 당신이 무한히 확대 할 수 없습니다. 당신은 누군가의의 반짝임에서 볼 수 없습니다 그 노력의 눈 에도 불구하고 특정 범죄, TV에서 본의 보급. 그리고 그의 동기를 부여하자로하는 곧 문제에서 엿볼으로 설정 일부 방송되는 당신 잘 될 수 있습니다. [동영상 재생] -OK. 자, 당신에서 좋은 모습을하자. 해를 누릅니다. 그 다시 실행합니다. 분을 기다립니다. 오른쪽으로 이동합니다. -가. 그 고정. 화면 전체를 선택합니다. -OK. 그 고정. 나중에 그에 대한 것까지 조입니다? 그 사람에에 - 벡터 다시 휠 있습니다. 이 자리에서 바로 여기에 급상승한다. -와 오른쪽 장비, 군데 확대 날카롭게 할 수 있습니다. - 뭐라 구요? - 그것은 향상 프로그램입니다. - 수 당신은 어떤쪽으로 그 선택을 취소합니다? - 나도 몰라. 의 그것을 향상시킬 수 있습니다. 섹션 A-6을 향상시킬 수 있습니다. -I는 세부 사항을 강화하고 - -I 확대 할 수있을 것 같아요. 내 화면에 놓습니다. 그녀의 눈에서 반사를 향상시킬 수 있습니다. 의이 통해 실행-합시다 비디오 향상. - 에드거, 당신이 향상시킬 수 있습니다? - 잠깐만. - 난이 반영에 노력하고. - 누군가의 반사. 반사. 반사 -있다 남자의 얼굴. - 반사. -이 반사입니다. 거울에있는 줌. - 당신은 반사를 볼 수 있습니다. -CAN 여기에서 이미지를 향상? - 수 당신이 바로 여기에 그를 향상? - 수 당신은 그것을 개선? - 수 당신은 그것을 개선? - 할 수있다 우리는이 향상? - 수 당신은 그것을 개선? 두 번째에 - 잠깐, 향상됩니다. 문에 줌. - 10 배. - 줌. [웃음] 인치 - 이동 중지 - 기다립니다. - 중지합니다. 를 - 일시 중지. 주위에 75도를 회전 수직하시기 바랍니다. [웃음] 부분에 백 중지 및 문에 대해 다시. 이미지 보정기를 얻었다 즉, 비트 맵 수 있습니까? - 어쩌면 우리는 Pradeep 센 사용할 수 있습니다 방법은 Windows에 볼 수 있습니다. -이 소프트웨어는 예술의 상태입니다. - 아이콘은 OFF입니다. -와 적절한 조합 알고리즘. - 그는에 조명 알고리즘을 가지고있어 다음 단계 나는 그들을 사용할 수 있습니다 이 사진을 향상시킬 수 있습니다. 에 - 잠금 및 z 축 확대. - 강화. - 강화. - 강화. 동결 강화. [END 동영상 재생] DAVID J. 마란 : 그래서 문제 세트 5가 앞에 놓인 것입니다. 그래서 우리는 곧 더 나은 이해를 얻을 것이다 언제 그리고 왜 당신이 할 수의 우리는 그런 식으로 개선 할 수 없습니다. 하지만 먼저,의는 우리의 관심을 돌려 보자 우리가 거​​의 빌딩 블록 중 일부 그 이야기를 할 수 있어야합니다. 그래서 우리는이 그림을 그린 것을 기억 월요일 조금 지난 주. 그리고 이것은 사물의 레이아웃을 설명 컴퓨터의 메모리에있는 경우 어떤 프로그램을 실행할 수 있습니다. 맨 위로 기술 분야, 리콜, 의미 실제 0과 1로 그 프로그램을 구성합니다. 거기에, 그 아래의 몇 가지 초기화 또는 초기화되지 않은 데이터, 이는 일반적으로 또는 상수 같은 것들을 의미합니다 문자열이나가 전역 변수 미리 선언. 이 힙하지만 우리는 올 것이다 다시 비트에서 해당합니다. 그리고 스택이있다. 대부분의 트레이 스택처럼 메모리 가져 곳에 식당이 있습니다 계층화 때마다 계층화 당신이 프로그램에서 무엇을합니까? 에 대한 스택 사용은 무엇입니까? 그래? 함수 호출합니다. 당신이 함수를 호출 할 때마다, 그것은의 그것의 메모리 짜 개진 조각에 주어진 지역 변수 또는 매개 변수입니다. 그리고 그림으로, 우리가 볼 수있는 각각 경우 연속 함수 호출 전화 B 전화 C 호출 D, 그들은 스택에 계층화됩니다. 그리고 그 조각의 각 내 메모리는 기본적으로 고유 한 범위입니다 해당 기능의, 어떤, 물론, 당신이 손하려는 경우 문제가 하나의 함수에서 다른 부분에 당신이 그것을 할 데이터의 변형 또는 변경할 수 있습니다. 그래서 사용에 대한 우리의 해결책은 무엇 이었습니까 하나의 스택으로 표현하는 기능 내부 메모리를 변경하는 프레임 다른 스택 프레임? 어떻게 다른 두 이야기를합니까? 그래서 포인터 또는 주소의 방법으로, 어디의 어떤, 다시, 단지 설명 특정의 메모리에 의한 방법 바이트 수, 특정 값을 찾을 수 있습니다. 그래서도 우리는 계속 지난 시간을 기억 에서 이야기를 보았다 상당히 버그 프로그램입니다. 이 프로그램은 몇 가지에 대한 버그가 이유가 있지만, 가장 우려 하나입니다 그것은 무엇을 확인하지 못하기 때문에? 그래, 입력을 확인하는 데 실패합니다. 네? 그것은 12 자보다 더합니다. 그래서 매우 세련되게, memcopy를 호출 할 때, 어느 이름에서 알 수 있듯이, 단지 두 번째 인수의 복사본을 메모리 첫 번째 인수로. 세 번째 인수는 매우 똑똑하다 당신이하지 않도록하기 위해 검사 이 경우, 길이 이상 복사 바, 문자 수, 대상으로, 어떤이입니다 배열 C. 그러나 문제는 그 무엇 C 자체가 충분히 크지 않은 경우 그 처리하려면? 당신의 번호를 복사하는거야 당신이 주어 졌어 바이트 수. 하지만 실제로는 더 무엇을해야합니까 당신이 공간을 가지고보다 바이트? 음,이 프로그램을 매우 어리석게 단지 맹목적 그건 어떤 걸릴 진행 주어진 안녕하세요 백 슬래시 0입니다 문자열은 짧은 큰 경우 충분히 다섯 문자처럼. 하지만 실제로 12 문자의 경우, 또는 1,200 자, 우리는 지난 시간에 본 당신은 완전히에가는 걸 메모리 덮어 쓰기 당신에 속하지 않습니다. 그리고 최악의 경우, 당신은 덮어 쓸 경우 그 우리 불리는이 붉은 부분 주소를 반환 - 이 단지 여기서 컴퓨터 자동으로 당신을 위해, 뒤에 거리 장면, 정력 32 비트 값입니다 정상적으로 어떤 주소로 상기 돌아 왔을 때 foo는,이 다른 기능, 실행 완료됩니다. 그것은 종류의 빵 부스러기의 어떤 그것을 반환합니다. 당신은 잠재적으로 그렇게 덮어 쓰면 당신이 나쁜 사람이라면, 할 수 있었다 잠재적 인수 다른 사람의 컴퓨터. 그리고 당신은 가장 확실거야 대부분의 경우에 충돌이 발생합니다. 이제이 문제는 더욱 악화되었다 우리는 메모리에 대해 말하기 시작으로 더 일반적으로 관리 할 수​​ 있습니다. 그리고 malloc에​​는 메모리 할당입니다 우리가 할당하는 데 사용할 수있는 기능 우리가 사전에 모르는 메모리 우리는 몇 가지해야 할 수도. 그래서, 예를 들어, 내가 다시 가면 여기에서 장비에. 그리고, 마지막으로 hello2.c에서 열어 보고 여기에이 프로그램을 호출 이 같은 작은 선물, 단지 세 줄 - 귀하의 이름, 다음 문자열 이름을, 주 왼쪽에 getString는 같습니다. 그리고 우리는 그것을 밖으로 인쇄 사용자의 이름을 입력합니다. 그래서 이것은 매우 간단한 프로그램이다. 명확하게, 내가 앞서 가자 여보세요 - 2합니다. 나는 점 슬래시 안녕하세요-2를 할거야. 당신의 이름을 명시 - 데이비드. 입력합니다. 데이비드 안녕하세요. 그것은 확인을 작동하는 것 같다. 그러나 실제로 일어나고 여기에 후드 아래? 먼저하자 일부 계층 뒤로 껍질. 문자열은 우리가했습니다 그냥 동의어입니다 무엇을 실현? 문자 스타. 그럼이 좀 더 난해하게하자 하지만 더 기술적으로 정확이 그 것을 의미 문자 스타입니다 이름, 예, 변수이다. 하지만 이름을 저장하는의 주소입니다 조금 이상한 느낌 문자, 내가 문자열을 다시 받고 있어요 때문이다. 난 다시 여러 개의 받고 있어요 문자 문자 수 없습니다. 물론, 당신은 첫 번째 필요 기억하는 문자의 주소 위치 때문에 이유는 전체 문자열은? 당신은 어떻게 알아낼 않는 곳의 끝 문자열의 시작을 알고있다? 백 슬래시 제로. 그래서 그 두 가지 단서가 파악 시작과 끝 전 모든 문자열들이있어 너무 오래 같이있다 제대로이 널 (null)로 형성 터미네이터, 그 역 슬래쉬 제로. 하지만이 getString에 호출된다. 그리고 그 getString는 밝혀 지 모든 시간은 종류의되었습니다 우리를 위해 속임수. 그것은 확실하게이 노동을하고있어 사용자로부터 문자열을 받고. 하지만 그 기억은 어디에 에서오고? 우리는 여기 사진에 돌아가서 경우 단지에서 정의를 적용 순간 전 그 스택은 어디에 함수가 호출 될 때 메모리가 간다 그 논리에 의해, 당신은 getString에 호출 할 때, 그리고 난에 입력 D-A-V-I-D 입력, 어디에 D-A-V-I-D 백 슬래시 제로에 따라 저장 이야기 우리는 지금까지 우리에게 말 했어요? 그것은에있을 것 같다 스택, 오른쪽? 당신이 문자열을 호출 할 때 얻을 스택에 메모리의 작은 조각. 그래서 그 D-A-V-I-D 추론하는 서 백 슬래시 제로가 저장됩니다 거기에 스택합니다. 그러나 반환하는 GetString, 잠깐만 해당 문자열은, 말하자면, 의미 그것은 식당에서 트레이의 스택에서 수행됩니다. 그리고 우리는 즉시로 지속 시간을 말했다 함수가 반환, 당신은 걸릴 스택 트레이, 말하자면, 어떤 당신의 나머지에 대해 가정 할 수 그 기억? 나는 일종의 물음표를 redrew 그들은 효과적으로되기 때문에 알 수없는 값입니다. 때 어떤 이들은 재사용 할 수 있습니다 다음 함수가 호출됩니다. 즉, 우리가 발생하는 경우 저장한다 - 나는 빨리 그림을 그릴 수 있습니다 여기에 스택. 우리는 바닥을 그리기 할 일이 있다면 내 메모리 세그먼트, 우리는 말할 것 이 메모리의 장소입니다 메인 어쩌면 인자 C에 의해 점유 인수 v 및 프로그램의 아무것도, getString는이 호출 될 때, 아마도 getString는이옵니다 여기에 메모리의 청크. 그리고 D-A-V-I-D 든 이 함수에서 끝납니다. 그리고 지나치게 단순화거야. 그러나 가정하자의 D-A-V-I-D가 백 슬래시 제로. 그래서 많은 바이트가 사용됩니다 getString에 대한 프레임. 그러나 곧 getString에 반환으로, 우리는 마지막으로 말했다 통해이 메모리 여기 모든이됩니다 - woops! - 모두 효과적으로 삭제됩니다. 그리고 우리는 문제로 지금 생각할 수 부호 알고 있기 때문에 어떻게하는 메모리가 될거야. 실제로, 나는 매우 자주 함수를 호출 getString 나 이외의 다른. 그리고 최대한 빨리 다른 전화로 getString 나보다 기능, 아닐 수도있는 우리가 본이 특정 프로그램 하지만 다른, 확실히 다른시 기능이 주어지고 끝날 수도 스택이 다음 자리. 그래서 그 getString에 저장 될 수 없습니다 스택에 D-A-V-I-D 난 것이기 때문에 즉시 액세스를 잃게됩니다. 그러나 우리는 그들이하는 GetString 알고 것만을 반환? 그것은으로 돌​​아 아니에요 나 6 자합니다. 그것은 진정으로 무엇 않은 반환 우리는 지난 시간에 결론? 첫번째의 주소입니다. 그래서 어떻게 든, 당신은 getString에 전화했을 때, 그것은의 메모리 덩어리를 할당하는 것 문자열이 사용자 유형 및 그것의 다음 반환 주소. 그리고 그것은 당신이 때 당신이 원하는 것이 밝혀 이 메모리를 할당하는 기능 방법과라는 사람에게 반환 그 함수의 주소 메모리의 청크, 당신이 절대적으로 에서 스택에서 그것을 둘 수 없다 바닥 때문에 기능적으로 그냥 매우 당신이되지 것 신속하게, 당신은 아마 추측 할 수있는 우리는 아마 그것을 던져거야 대신, 소위 힙. 그래서 메모리의 하단의 사이 레이아웃과 메모리의의 상단 레이아웃 세그먼트의 전체 무리이다. 하나는 스택이며, 오른쪽 그 위에 힙입니다. 그리고 힙은 서로 다른 덩어리입니다 기능에 사용되지 않을 메모리 그들은 호출 할 때. 이 때, 장기 메모리 사용되는 당신은 하나의 함수 몇 가지를 잡아하려면 메모리와에 걸 수있을 그 위에 컨트롤을 잃지 않고. 지금 당신은 아마 즉시 ​​수 이없는 것을 볼 수 완벽한 디자인을 반드시. 프로그램이에 메모리를 할당하여 스택, 또는 전화로 더 더 많은 기능, 또는 할당으로 로 해제 malloc을 가진 힙 메모리 getString는이 일을 무엇 명확하게 피할 수없는 문제가 될 것 같다? 오른쪽. 사실 좋아하는이 화살표 서로를 가리키는 잘 징조하지 않습니다. 그리고 실제로, 우리는 매우 신속하게 중단 될 수 가지 방법으로 수있는 프로그램입니다. 사실, 우리가 가지고있는 것 같아요 이 실수 번만 수행. 아니면하지 않을 경우, 그것을하자 의도적 지금. 내가 가서 빨리 슈퍼 작성할 수 이 프로그램은 dontdothis.c했다. 그리고 지금 여기에 갈거야 날카로운 stdio.h에 포함 않습니다. foo 함수가 수행 선언하자 인수, 이는 없다 무효로뿐만 아니라 나타낸다. 그리고 foo는 할 것입니다 만 점은 아마없는 호출 foo는, 똑똑한 생각하지만, 그렇게해야합니다. 엔트 주요 무효. 지금 메인이가는 유일한 할 것이 아니라 foo는 호출입니다. 그냥 재미를 위해, 내가 갈거야 앞으로 여기에서 "안녕하세요 printf의 말 foo는. " 확인을 클릭합니다. 내가 어떤 실수를하지 않았다 만약 그렇다면, dontdothis 점 슬래시를 확인합니다. 그리고하자 더 큰 창에서이 작업을 수행 - 점 슬래시, dontdothis. 어서. 어 오. 분명히, 당신은이 작업을 수행 할 수 있습니다. 젠장. 확인을 클릭합니다. 기다립니다. 대기. 우리는 한 - 우리는 확인과 함께 사용했다. [한숨] 알아요하지만 우리 생각 그냥 삭제됩니다. 어, 그래. 젠장. 이 로브를 해결합니다. 무엇인가? 그것은 매우 간단합니다. 그래, 우리는 최적화를 해제. OK, 안녕하라. 지금은 잘 생각합니다. 확인을 클릭합니다. 좋아. 그럼이를 다시 컴파일하자 - 당신이 dontdothis합니다. 당신이 이름을 변경해야 할 수도 있습니다 잠시 후에 dothis.c. 거기 우리는 간다. 감사합니다. 확인을 클릭합니다. 그래서 인쇄 된 사실 뭔가 아웃 하필 프로세스를 느리게하는 우리 그 시점에 도달 한 것이다. 확인을 클릭합니다. 휴! 그래서 사실이야? 단지 옆으로도 이유는있다 입력의 관점에서 무엇을하고 출력 속도가 느린 경향이 있기 때문에 당신 에 문자를 작성해야 화면이 스크롤 할 수 있습니다. 너무 오래 짧은 이야기, 내가 실제로 있었다 이렇게 참을성이 일어난, 우리는 것 이뿐만 아니라 최종 결과는 본. 나는 인쇄 올린다 타고있어, 이제는 우리는 바로 그것을 참조하십시오. 그럼 왜이 일어나고있다. 음, 물론 간단한 설명, 그 foo는 아마 안된다입니다 자신을 호출 할 수. 이제 일반적인 용어에서, 이 재귀이다. 그리고 우리는 몇 주 생각 전 재귀 좋다. 재귀는이 마법의 방법입니다 간결 최고 자신을 표현. 그리고 그냥 작동합니다. 그러나의 모든 주요 기능이 있습니다 우리가 얘기했습니다 재귀 프로그램 약 및 보았다 지금까지, 어떤 그들이 무엇을했다고했다? 일부 하드 코딩 된 기본 케이스, 어떤 상황에서 말했다 경우 명확하게 foo는 호출하지 않습니다 여기에없는 경우. 그래서 정말 무슨 일이 일어나고 이 그림의 측면에서? 잘 때, 주요 foo는, 그 호출 기억의 조각을 가져옵니다. foo는 foo는 호출 할 때 얻을 기억의 조각. foo는 foo는 호출 할 때 슬라이스를 가져옵니다. 그것은 조각을 가져옵니다. 그것은 조각을 가져옵니다. foo는은 반환되지 않습니다 때문입니다. 우리는 그 중 하나를 삭제하지거야 스택 프레임입니다. 그래서 우리는 힙을하지 불고있어 누가 무엇을 다른 사람 알고 있고, 물론, 우리는 우리의 경계를 넘고있어 메모리 세그먼트 소위. 분할이 거짓 가서 오류가 발생했습니다. 따라서이 솔루션 명확하게이 작업을 수행하지 않습니다. 그러나 더 큰 의미는, 예이며, 절대적으로 몇 가지 한계가있다 그것은 잘 방법으로 정의 아닌 경우에도 당신이에서 호출 할 수 많은 기능 프로그램을 몇 번 기능 자신을 호출 할 수 있습니다. 우리는 재귀를 전파했다 그래서 비록 이 잠재적 마법 것으로서 시그마 전 몇 주 기능 및 때 우리가 데이터를 얻을 구조와 CS50, 당신은 다른 볼 수 있습니다 그것을 위해 응용 프로그램은 그렇지 않아 반드시 좋은 것은. 함수 자체를 호출하는 경우 때문에, 베이스가있다하더라도, 자신을 호출 경우, 당신은 그 기저 케이스에 충돌하지 않는 경우 1000 통화 또는 10,000 통화에 의해 당신은 공간이 부족했을 가능성이있는 시간 귀하의 이른바 스택 히트에 메모리의 다른 부분. 그래서 너무 디자인 트레이드 오프입니다 우아함 사이 사이 특정의 견고성 구현. 그래서 또 다른 단점이나 거기 우리가 한 것을 또 다른 잡았다 지금까지 해왔. 나는 getString에 전화했을 때 - 나를 안녕하세요-2로 다시 가자. 내가 getString는 호출 해요 통지 이는 주소를 반환합니다. 그리고 우리는 오늘날 주장하는 주소 힙입니다. 지금은 밖으로 인쇄하고 해당 주소 문자열입니다. 그러나 우리는이라는 적이 getString에 반대. 우리는 같은 기능을 calll 할 필요가 없었어요 당신이 손 다시 ungetstring, 해당 메모리. 그러나 솔직히 우리는 아마 되어 있어야합니다. 때문에 우리는 컴퓨터를 질문을 계속하면 같은 사람의 메모리에 의한 방법 getString는하지만 확실히 다시 포기하지 않을 너무 이어질에 바인딩 우리는 메모리를 실행하는 그것에 문제. 그리고 사실, 우리는이를 찾을 수 있습니다 사용 새로운 도구 문제 입력 할 조금 이상한 것입니다. 그러나 내가 가서 그것을 튀하자 잠시 후에 화면에. 내가 가서 Valgrind를 실행하는거야 그 첫 번째 명령 매개 변수 라인 인수의 이름입니다 이 프로그램 안녕하세요 - 2. 불행히도 그것은이다 출력 atrociously입니다 이유없이 복잡한. 그래서 우리는 그 모든 혼란을 참조하십시오. 다윗은 내 이름을 상태입니다. 그래서이 프로그램의 실제로 실행할 수 있습니다. 그리고 지금 우리는이 출력을 얻을. 그래서 Valgrind는 유사하다 GDB에 정신을합니다. 그것은 자체 디버거 아니다. 그러나 메모리 검사입니다. 그것은 당신을 실행하는 프로그램입니다 프로그램 및 요구한다면, 당신에게 메모리 컴퓨터 결코 그것을 손으로 다시, 따라서 당신이 가지고있는 의미 메모리 누수가 발생합니다. 메모리 누수가 나쁜 경향이있다. 그리고 당신은 컴퓨터 사용자가 가지고 있습니다 아마 이것은 당신이 있는지 여부를 느꼈다 Mac 또는 PC. 당신은 컴퓨터를 사용했다 여러 재부팅되지 동안 일, 아니면 그냥 많이있어 실행중인 프로그램, 그리고 빌어 먹을 것 연삭 중단 느리게, 또는 적어도 있기 때문에, 사용하기 매우 성가신 모든 것이 매우 느린 얻었다. 이제 그 이유 중의 임의의 숫자 일 수 있습니다. 그것은 무한 루프에 버그가있을 수 다른 사람의 코드 또는, 더 간단하게, 그 당신이 더 많은 것을 사용하고 있다는 것을 의미 할 수 귀하의보다 메모리 또는하려고 컴퓨터가 실제로있다. 그리고 어쩌면 어떤 프로그램에 버그가있다 메모리 질문을 계속합니다. 년 동안 브라우저는 악명이 있었다 이, 더 많은 메모리를 요구 하지만 다시 나눠되지 않습니다. 확실히, 당신은 단지 유한이있는 경우 메모리 양, 당신은 질문 할 수 에 대한 무한히 많은 시간 해당 메모리의 일부. 그래서 당신은, 비록 여기에서 보는 무슨 다시 Valgrind는의 출력은 언뜻 불필요하게 복잡 먼저,이 흥미로운 부분입니다. 힙 - 출구를 사용합니다. 그래서 여기에 얼마나 많은 메모리가 있었다이다 에서 힙에서 사용 시간 내 프로그램 종료 - 한 블록에 분명히 6 바이트. 그래서 난 내 손을 흔드는거야 무엇 블록입니다. 더, 그냥 덩어리 생각할 청크에 대한 기술 단어입니다. 6 바이트 만 - 그 6 바이트는 무엇입니까 아직 사용했다? 정확히. D-A-V-I-D 백 슬래시 제로 다섯 글자 이름과 null 종결. 그래서이 프로그램은 발견 Valgrind의 그 I 에 의해 분명히 6 바이트를 요청 getString에의 길, 그러나 결코 그들을 다시했다. 그리고 사실, 이건 너무하지 않을 수 있습니다 내 프로그램은 세없는 명백한 경우 라인,하지만 300 선입니다. 그래서 우리는 실제로 다른 명령을 줄 수 있습니다 라인 인수로 Valgrind의합니다 그것은 더 자세한 확인합니다. 그것은 기억을 좀 짜증나. 하지만 난 할 경우 - 보자. 누출 - 그것은 누출 된 - 심지어 기억이 안나요 그것은 손 떨어져 무엇인지. - 누출 검사가 가득 같습니다. 네, 감사합니다. - 누출 검사가 가득 같습니다. 입력합니다. 같은 프로그램이 실행됩니다. 또 다윗 입력합니다. 지금은 조금 자세한 내용을 참조하십시오. 그러나 힙 요약 아래있는 네 동일합니다 - 아, 이것은 좋은 종류이다. 지금 Valgrind는 실제로 찾고 있습니다 내 코드에서 더 작은. 그리고 그것은 분명히 그 말 것 라인 malloc에​​ - 우리는 축소. 에서 선 - 우리는 그것이 무엇인지 라인 표시되지 않습니다. 하지만, malloc을 첫 번째 원인이다. malloc에​​있는 블로그가있다. 모든 권리? OK, 아니. 오른쪽? 내가하는 GetString했다. getString는 분명히 malloc을 호출합니다. 그래서 코드 라인은 분명히 있습니다 하는 데에 대한 장애에 이 메모리를 할당? 하자 누구 malloc을 쓴 것으로 가정 충분히 그건 그 주변왔다 아니 그들의 잘못. 그래서 아마 내 꺼야. cs50.c에서 getString 나 - 그건 너무 컴퓨터에 어딘가에 파일 - 라인에 286 원인 것 같습니다. 이제이 CS50가되었음을 가정하자 그렇게 시간이 상당한 금액에 대한 주위 우리도 전혀 틀림이 있습니다. 그리고 그것은 getString에있는 아마의 버그 거짓말, 오히려있는 것이 안녕하세요-2.C 라인 18. 그러니 살펴 보자 그 라인 18 것이었다. 오. 어떻게 든이 줄 필요는 없습니다 버그 라기보다는,하지만 이유 이 메모리 누수 뒤에. 그래서 슈퍼 단순히 어떤 일이 직관적 것 여기 해결책이 될 수? 우리는 메모리를 요구한다면, 결코 없었다 다시주고, 그 것으로 보인다 문제는 시간 때문에 내 컴퓨터에 메모리가 부족할 수도 느려질 수 있습니다 아래로, 나쁜 일, 잘 일어날 수 간단한 직관적 인 해결책은 무엇인가? 그냥 다시 제공합니다. 어떻게 당신은 메모리를 확보해야합니까? 음, 다행히도 그것은 매우 간단 그냥 무료로 이름을 말할 수 있습니다. 그리고 우리는 전에 해본 적이 없다. 하지만 당신은 본질적으로 생각할 수 의 malloc 반대, 무료. 자유의 반대 메모리를 할당. 이제 날이 다시 컴파일 할 수 있습니다. 안녕하세요-2를 확인합니다. 저를 다시 실행하자. 안녕하세요-2 데이비드. 그래서에서 작동하도록 보인다 동일한 방법입니다. 하지만 Valgrind의 다시 가서 다시 실행하면 나의 최근에서 동일한 명령 컴파일 된 프로그램을 입력 이전과 내 이름으로 - 좋은. 힙 요약 - - 출구 사용 제로 블록에 0 바이트. 그리고 이것은 매우 좋은, 모든 것입니다 힙 블록이 해제되었다. 누출이 가능합니다. 그래서,없는 문제 4 세트와 함께 올라오고 하지만 문제 세트 5, 법의학에 그리고 이후이 너무 될 것입니다 여러분의 정확성의 측정 당신이 있는지 여부를 프로그램 또는 메모리 누수가 없습니다. 그러나 다행히도, 당신은 추론 할 수 있습니다뿐만 아니라, 그 직관적으로, 어떤 통해 작은 프로그램을 쉽게, 틀림없이이다 하지만 큰 프로그램에 대한 더, 그 큰 프로그램, Valgrind의 당신이 식별 할 수 있습니다 특정 문제. 그러나 다른 하나의 문제가있다 그가 발생할 수 있습니다. , 어떤은, 내가 여기서이 파일을 열어 보자 또, 다소 간단한 예제. 그러나하자 무엇에 초점을 이 프로그램을 수행합니다. 이 memory.c에 호출된다. 우리는이 나중에 오늘 게시합니다 오늘의 소스 코드를 우편. 그리고라는 기능을 가지고 것을 알 수 인수를 취하지 않습니다 F 아무 것도 반환하지 않습니다. 라인 20에서, 내가 분명히 선언하고 있습니다 INT와 X 호출에 대한 포인터. 내가 할당있어이 반환됩니다 malloc에​​ 값. 다만 얼마나 많은 바이트, 명확하게 아마 malloc에​​에서 돌아와 이 상황에서? 아마 40. 어떻게 알아? 글쎄, 당신은 INT는 종종 것을 기억하는 경우 4 바이트는, 적어도 그것은에 제품은 배 4 10 분명히 40입니다. 그래서 malloc에​​의 주소를 반환 메모리 청크와 저장이 X 궁극적으로 해결합니다. 그래서, 명확하게 무엇을 다음 일 이죠? 물론, 내가 다시 전환 할 여기에 우리의 그림에. 내가 내의 바닥을 그리하지 말자 컴퓨터의 메모리 나 앞서 가자와 전체 사각형을 그리는 내 RAM을 모두 나타냅니다. 우리는 말할 것 그 스택 하단에 있습니다. 그리고 텍스트 세그먼트에있다 초기화되지 않은 데이터입니다. 하지만 난 그냥 추상적 사람들에게 갈거야 멀리 점, 점 점 다른 확인해보세요. 난 그냥이 참조하는거야 상단에 힙으로. 그리고이 그림의 하단에, 주를 대표하는, 내가 갈거야 그것을 슬라이스 메모리를주는 스택에. F를 들어, 나는 그것을 슬라이스를 줄거야 스택에 메모리가 부족합니다. 지금, 나는 나의 상담을 얻었다 다시 소스 코드입니다. 주에 대한 로컬 변수는 무엇입니까? 분명히 아무것도, 그래서 슬라이스입니다 효과적으로 비어 있거나 심지어 같은 큰 내가 그린 것 같은. 그러나 F에, 나는 지역 변수가 어떤이 X라고합니다. 그래서 내가 가서 F를 줄거야 그것은 X 호출 메모리 덩어리. 10 시간 4 지금 malloc에 그건 malloc에​​ 40, 그래서 메모리에서 오는? 우리는 그림을 그려 적이 없다 전에이 좋아합니다. 그러나의 그것은 효과적으로 있다고 가정하자 그래서 하나가 여기에서 오는, 둘, 셋, 넷, 다섯. 그리고 지금이 40이 필요합니다. 그래서 난 그냥 제안하는 점, 점, 점을 다하겠습니다 더 많은 메모리가 있다는 것을 힙에서 오는. 현재 주소는 무엇입니까? 하자 우리의 임의의 선택 언제나 해결 - 아마 무슨하더라도 Ox123, 완전히 다른 것이 될 수 있습니다. 그의 첫 번째 바이트의 주소입니다 나는을 위해 malloc을 부탁 해요 기억합니다. 그래서 짧은 한 줄에 20 실행 말 그대로 무엇인가 여기에서 X의 내부에 저장된? Ox123. Ox123. 그리고 황소는 재미있다. 그것은 단지 여기에 의미 진수. 그러나 중요한 것은 내가 가게를 한 내용이다 X에서, 어느 지역 변수입니다. 그러나 해당 데이터 형식, 다시, INT의 주소입니다. 글쎄, 난 Ox123를 저장하는거야. 그러나 다시, 너무 그건 경우 내가 스크롤하면, 불필요하게 복잡 다시, 우리는이 추상화 할 수있는 매우 합리적 그냥 말하는 X는 메모리의 청크에 대한 포인터. 확인을 클릭합니다. 지금 손에 질문 다음과 같습니다 - 라인 (21)은, 그것은 밝혀, 버그이다. 왜? 네? 그것은하지 않습니다 - 한번 더 그런 말. 글쎄요, 그것은 무료로하지 않습니다. 그래서 두 번째이지만. 그래서 다른 그러나 구체적으로 하나가있다 라인 21에서. 정확히. 코드의이 간단한 라인은 단지입니다 버퍼 오버플로, 버퍼 오버런. 버퍼는 단지 메모리 청크를 의미한다. 그러나 메모리의 청크 크기입니다 10, 10의 정수, 그 의미가 우리 문법 설탕을 사용하여 그것으로 인덱스 배열 표기법의, 광장 괄호, 당신은에 액세스 할 수 있습니다 x 부류 0 X 브라켓 1 개, 브래킷 점, 점, 점. x 부류 9 가장 큰 하나입니다. 나는 x 부류 10을 할 그렇다면 여기서 실제로 메모리에 갈거야? 글쎄, 난 10 지능이있는 경우 - 하자 실제로 모든 그리기 다음은 이러한 중. 그래서 첫 번째 다섯이었다. 여기에 다른 다섯 개의 정수이다. 그래서 x 부류 0 여기에있다. x 부류 1은 여기에. x 부류 9 여기에있다. x 부류 10 여기, 이는 내가 말하고 의미 21 행에서, 컴퓨터를 넣어 숫자 어디? 숫자 0 어디? 음, 예, 0이다. 하지만 단지 사실의 0 우연의 일종이다. 그것은 수 수 50, 우리는주의 모든. 그러나 우리는 x 부류에 넣어 위해 노력하고 곳에서 10, 물음표가 그려지는 좋은 일이 아닙니다. 이 프로그램은 아주 잘 수도 그 결과로 충돌이 발생합니다. 자, 가서 보자이 경우 실제로 어떤 일이 발생합니다. 추억을 만들어 이후 파일 memory.c에 호출됩니다. 자, 가서 실행 프로그램 메모리. 그래서 우리는 행운이있어, 실제는 것 같다. 우리는 운이 좋았어요. 그러나 우리가 지금 Valgrind의를 실행하는 경우 보자. 첫눈에, 내 프로그램은 수도 완벽하게 맞는 것 같습니다. 하지만 함께 Valgrind의 날 실행할 수 - 누출 검사는 메모리에 전체 같습니다. 그리고 지금 나는이 프로그램을 실행할 때 - 흥미 롭군요. 잘못된에서 크기가 4 쓰기 memory.c에 라인 21. memory.c에 라인 21 어느입니까? 아, 흥미 롭군요. 하지만 기다립니다. 크기 4, 언급하는 무엇입니까? 나는 단지 하나 작성 않았다 하지만 크기는 4입니다. 왜 4인가요? 그것은 어떤 INT, 때문에 그것은이다 다시 4 바이트입니다. 그래서 Valgrind의 버그를 발견 I, 내 코드에서 반짝이기는하지만,하지 않았다. 그리고 어쩌면 당신의 TF는 것 또는하지 않을 것입니다. 하지만 확실히 발견을 위해 Valgrind의 어떤 우리는 심지어 거기에 실수를 한 것 우리는 행운이있어, 그리고 비록 컴퓨터 결정, 어, 내가 충돌하지 않을거야 당신은 한 바이트를 접촉해서 당신이하지 않은 메모리 INT의 가치 실제로 자신의. 음, 여기에 버그가 다른 것입니다. 주소 - 이 미친 찾고 주소 진수있다. 그냥 어딘가에 힙을 의미하는 사이즈 40의 블록 후 0 바이트 할당됩니다. 내가 여기서 축소하고 보자하는 경우 이것은 좀 더 도움이됩니다. 흥미 롭군요. 40 바이트는 확실히 손실 1 손실 기록 1인치 또,보다 더 많은 단어는 여기에 유용합니다. 하지만, 강조 라인에 따라 어디 아마 집중해야 내 또 다른 버그에 대한 관심? memory.c에의 라인 (20)처럼 보인다. 우리는 라인 (20)으로 돌아가 그렇다면 그건 당신이 이전에 발견 한. 그리고 버그가 반드시 아니에요. 그러나 우리는이 그 효과를 반전했다. 그래서 어떻게 최소한 수정합니까 그 실수 중 하나? 나는 21 행 이후에 무엇을 할 수 있습니까? 나는 그렇게, X 무료입니다 할 수 그 기억을 돌려 줄 수 있습니다. 그리고이 버그를 어떻게 해결합니까? 나는 확실히 가야한다 더 멀리 0보다 않습니다. 그래서 나는 시도하고이를 다시 실행하자. 죄송합니다, 확실히 이동 더 멀리 9보다가 없습니다. 메모리를 확인합니다. Valgrind의 나를 다시 실행하자 큰 창을합니다. 지금 봐. 좋은. 모든 힙 블록이 해제되었다. 누출이 가능합니다. 그리고 여기까지 위의 언급은 없습니다 잘못된 오른쪽으로 더 이상. 그냥 욕심, 그리고하자하기 볼 경우, 다른 데모 의도 한대로 이동하지 않습니다 - 나는 순간 전 운이 좋은 거죠. 이 0이라는 사실은 아마도 불필요한 오해. 단지 50, 다소 임의의 작업을 수행하자 수, 메모리 점 슬래시 추억을 만들어 - 아직 운. 아무것도 충돌 없어요. 내가 정말 뭔가를 가정 바보, 나는 100을. 나 메모리를 리메이크하자 점 슬래시 메모리 - 다시 행운이있어. 어떻게 약 1,000? 이후 정수, 약, 어디서해야하나요? 메모리를 확인합니다 - 젠장. [웃음] 확인을 클릭합니다. 의 이상 주변에 흩 뜨리지 수 있습니다. 메모리를 다시 실행하십시오. 거기 우리는 간다. 좋아. 그래서 분명히 당신은 인덱스 만 정수를 당신이에 있었던 위치를 넘어 메모리, 나쁜 일이 일어날. 그래서 이것은 분명하지 않습니다 하드 빠른 규칙입니다. 나는 시험을 사용하여 친절했다 에러가를 얻을 수 있습니다. 하지만이 때문에 긴 이야기를 짧은 컴퓨터의 메모리는 구분됩니다 이러한 것들로 세그먼트했다. 그리고 때때로, 컴퓨터 실제로 당신에게 조금 더 많은 메모리를 제공하고 있습니다 당신을 요구보다. 하지만 효율성을 위해, 그것은 바로 쉽게 더 많은 메모리를 얻을 수 있지만 당신에게 당신은 그것의 부분을 얻고 있다고. 그리고 당신은 때때로 운 경우, 따라서 당신은 접촉 할 수있을 것 그 기억은 당신에 속하지 않습니다. 당신은 보장이 없다는 것을 어떤 값을 당신은 거기에있을 것 넣어 있기 때문에 컴퓨터가 여전히 아니다 생각 당신,하지만 반드시 않을거야 메모리의 또 다른 세그먼트를 칠 컴퓨터와 실수를 같이 유도 여기 하나. 좋아. 다음 질문 메모리? 좋아. 에서 다음의 여기 살펴 보자 우리가 복용 한 것을 꽤 많은 시간 동안 부여하는 cs50.h.이라는 파일에 그래서이 파일입니다. 이들은 단지 전체 무리입니다 맨 위로 댓글. 그리고 당신이 경우에보고했을 수 있습니다 당신은 제품에 주위에 찌르고. 그러나, 그 모든 시간을 밝혀 우리는 a로 문자열을 사용하는 데 사용하는 경우 동의어, 우리가 선언하는 방법 그 동의어이 함께했다 유형 정의에 대한 형식 정의 키워드. 그리고 우리는 본질적으로 말하고, 만들기 문자 스타 동의어를 문자열입니다. 그 의미하는 스택 로 알려진이 훈련 바퀴를 생성 문자열입니다. 지금 여기에 그냥 프로토 타입의 getchar합니다. 우리는 전에 볼 수도 있지만, 그건 실제로 무엇을 수행합니다. getchar 인수를 취하지없는 문자를 반환합니다. getdouble는, 인수를 취하지 않습니다 배를 반환합니다. getfloat 인수 없음 반환한다 플로트, 등등. getInt는 여기에 있습니다. getlonglong 여기에 있습니다. 와 getString는 여기에 있습니다. 그리고 그것입니다. 이 보라색 선은 다른 처리기입니다 때문에의 지침 그것의 시작 부분에 해시 태그. 좋아. 그래서 지금 내가 cs50.c.에 가자 그리고 우리는 이것에 너무 오래 얘기하지 않습니다. 그러나 당신에게 무엇을 엿볼주는 이 모든 진행되고 시간이 날에 가자 - 하자 getchar 않습니다. 그래서 getchar는 대부분 의견이다. 그러나 다음과 같습니다. 그래서 이것은 실제 기능입니다 우리가 있었다는 것을 getchar 당연한 복용 존재합니다. 우리는이 하나를 사용하지 않은 경우에도 자주하는 경우도, 그것은 최소한의 것을 비교적 간단합니다. 그래서 복용 가치 여기에 빠른 봐주세요. 그래서 getchar는 무한 루프가 의도적으로 그렇게 분명히. 그런 다음 호출 - 이것은 일종의 코드의 좋은 재사용은 우리 자신이 썼다. 그것은 getString에 호출합니다. 그것을 무엇 때문에 문자를 얻을 수 의미? 글쎄, 당신은뿐만 아니라를 얻기 위해 시도 할 수 있습니다 전체 사용자의 텍스트 라인 그 하나 봐 그 문자. 라인 60에서, 여기에 약간의 전성 검사 비트. getString는 null을 반환 경우, 의 진행되지 보자. 문제가 발생했습니다. 지금이 다소 성가신하지만, 아마 C. 문자 최대 종래의 무엇을 나타내는 지 단지 그 이름을 기반으로? 그것은 상수이다. 그것은의 숫자 값처럼 당신이 나타낼 수있는 문자 최대 아마 번호 하나 물린, 가장 큰 숫자 당신이다 255, , 8 비트를 나타냅니다 0부터 시작. 그래서 때,이 함수에서,이 기능을 사용했습니다 만 있기 때문에,이 코드를 작성 뭔가 getchar 잘못된 부분이있을 때 만하면 삶의 목적이를 반환하는 것입니다 문자, 어떻게 든 할 수 있어야합니다 해당 사용자에게 신호하기 뭔가 잘못 됐어요. 우리는 NULL을 반환 할 수 없습니다. 그것은 NULL은 포인터임을 밝혀졌습니다. 그리고 또, getchar에는 문자를 반환합니다. 그래서 대회, 뭔가 될 경우 잘못, 당신은 프로그래머, 또는에있다 이 경우, 저 라이브러리와, 내가했다 다만, 경우 임의로 결정 뭔가 잘못되면, 내가 갈거야 진정한 번호 255을 반환 우리는 사용자가 입력 할 수 없음을 의미 에 의해 나타내지는 캐릭터 우리가했기 때문에 숫자 255를 훔치는 에 소위 센티넬 값으로 문제를 나타냅니다. 지금은 밝혀 그 문자 255 당신이 입력 할 수있는 일이 아닙니다 키보드, 그래서 그것은 더 큰 문제가 없습니다. 사용자가 인식하지 않습니다 나는이 문자를 도난했습니다. 하지만 당신은에 남자 페이지에 표시하는 경우 에 컴퓨터 시스템을 일부 참조 말한다, 상수 같은 모두 대문자 오류이 일정한 세력에게의 경우 반환, 그 한 모두가 어떤 인간의 년 전에 임의의로 결정했다 이 특별한 값을 반환 그 경우 일정한 전화 뭔가 잘못갑니다. 이제 마법은 여기로 발생합니다. 첫째, 67 행에서 선언 해요 두 문자, C1 및 C2. 그리고 라인 68에서, 실제로있다 연상의 코드 라인 우리의 친구 printf는, 주어진 그것 따옴표 %의 고사가 없습니다. 그러나 여기에서 무슨 일이 일어나고 있는지 알 수 있습니다. sscanf에서 문자열 검색을 의미합니다 - 포맷을 스캔 의미 문자열, 에르고 sscanf에서. 그게 무슨 뜻 이죠? 그것은 당신이 문자열을 sscanf를 전달할 것을 의미한다. 그리고 라인은 무엇입니다 인치 사용자 유형 당신은 형식 문자열처럼 sscanf를 전달할 무엇 scanf와 지시하는이 당신은 사용자가 로그인 입력했다 바라고 그런 다음 전달 - 두의 주소 이 경우 메모리 덩어리, 저는 두 자리를 가지고 있기 때문이다. 그래서 나는 그것에게 주소를 줄거야 C1과 C2의 주소. 그리고 당신이 함수에게을주는 기억 어떤 변수의 주소, 무엇 의미? 이 함수는 결과로 무엇을 할 수 그것의 주소를주는 변수로 반대 변수 자체? 그것은 바로, 그것을 변경할 수 있습니까? 당신은 사람 신체에 대한지도를 가지고 있다면 주소, 그들은 거기 가서 할 수 있습니다 그들은 그 주소에서 원하는. 여기에 같은 생각. 우리는 sscanf에서 두 가지의 주소로 전달하는 경우 심지어 메모리 덩어리,이 작은 메모리, C1과 C2의 작은 덩어​​리지만, 우리는 그것에게 그들의 주소를 알려 sscanf를 그것을 변경할 수 있습니다. 인생에서 sscanf에서의 목적 때문에, 우리가 읽으면 매뉴얼 페이지는 읽을 수 무엇 사용자의 입력, 가지고있는 사용자에 대한 희망 문자의 입력 및 아마 다른 문자, 그리고 어떤 사용자 입력, 첫 번째 문자는 간다 여기, 두 번째 문자는 간다. 지금, 옆으로,이, 당신은 것 만 문서에서 알아 내가 거기에 빈 공간을두고 있다는 사실 그냥 난 상관하지 않는 것을 의미하는 경우 사용자가 스페이스 바를 몇 안타 그 또는 그녀는 소요 시간 전 문자 나 무시하는거야 공백. 그래서, 나는에서 알고 설명서를 참조하십시오. 두 번째 %의 C가 있다는 사실 공백 다음은 실제로 고의적. 내가 감지 할 수 있도록하려면 사용자 엉망 또는 협조하지 않았다. 그래서 사용자는 입력 한 바라고 있어요 하나의 문자에, 그러므로 나는 바라고 있어요 그 sscanf를 단지를 반환하는 것입니다 값을 1 내가 읽은 경우 다시 때문에 문서, sscanf에서의 목적에 생명의 수를 반환하는 것입니다 가득 차 있었다 변수 사용자 입력. 나는 두 변수에 전달 주소, C1 및 C2. 나는 그것을하지만, 기대하고 단 하나의 그들은 죽고 있기 때문에 경우 sscanf에서 2를 반환, 아마도 무엇 논리적 의미? 사용자는 다만 저에게 하나를 포기하지 않았다 문자처럼 나는 그에게 혹은 그녀. 그들은 아마로 입력 최소한 두 문자. 내가 대신 두 번째를 가지고 있지 않은 경우 그럼 % C는, 난 그냥 하나를 가지고있는 솔직히 더 직관적 일 것 접근, 나는 언뜻 생각, 당신은 검색 할 수하지 않을거야 사용자가 당신에게를 제공 한 경우 당신이 실제로 원하는 것보다 입력. 그래서 이것은 암시 적 형태이다 오류 검사. 하지만 여기서 무엇을 알 수 있습니다. 일단 사용자가 하나를 내게 준 확신 자, 내가하고, 선을 해제 getString에의 반대, 차례 차례로 내가 복귀 후 malloc을 사용하고, C1, 내가 기대하는 문자 사용자는 제공된 만 제공. 그래서 빨리는 얼핏하지만, getchar에 대한 질문? 우리는 다른 사람의 일부 돌아올 것이다. 글쎄, 내가 가서 이렇게하자 - 다만 동기를 부여하기 위해, 지금은 가정 우리 주 플러스 시간에 토론이 structs.h라는 파일입니다. 다시, 이것은 단지 맛 껀 뭔가. 그러나 예고하는 많은 의이 댓글이 있습니다. 그럼 내가 강조하게 만 지금은 흥미로운 부분. 형식 정의 - 같은 키워드는 또있다. typedef는 우리가 문자열을 선언하는 데 사용 특수 데이터 유형으로. 당신이 새로운을 만들 typedef를 사용할 수 있습니다 존재하지 않는 데이터 유형 C가 발명되었다. 예를 들어, Int는 C. 문자와 함께 제공 C. 더블 C.와 함께 제공 함께 제공하지만, 학생의 아무 개념이 없습니다. 그럼에도 불구하고 수 꽤 유용 할 것이다 저장하는 프로그램을 작성할 수 변수, 학생의 ID 번호, 자신의 이름, 자신의 집. 즉, 세 가지 데이터, INT와 좋아 문자열과 다른 문자열. 형식 정의와 함께, 어떤은 매우 강력 이 및 키워드 sturct에 대한 구조, 당신은, 2013 년 프로그래머, 실제로 자신을 정의 할 수 있습니다 년을 존재하지 않는 데이터 유형 전하지만 그 목적에 맞게. 그리고 여기에 19을 통해 선 13, 우리는 같은 새로운 데이터 형식을 선언하고 INT하지만 학생의 호출. 그리고 안쪽이 변수가가는 INT, 문자열 - 세 가지 수 그리고 문자열입니다. 그래서 당신이 정말로 무엇을 생각할 수 이 경우에도, 무슨 일이 일어난 오늘 단순화 비트, 학생은 본질적 것입니다 다음과 같이합니다. 그것의 덩어리가 될 것 ID와 메모리의 이름 필드 및 집 필드입니다. 그리고 우리는 그 덩어리를 사용하실 수 있습니다 메모리에 액세스 다음과 같습니다. 내가 struct0.c에 가면 여기입니다 비교적 긴하지만, 다음과 같은 코드의 패턴이 이 새로운 트릭을 사용합니다. 그래서 일단, 내가 관심을 끌어 보자 맨 위로 흥미로운 부분. 샤프 학생 3 정의, 선언 라는 상수 학생 및 양수인 그것은 단지 임의의 숫자 3, 그래서 나는 사용하여 세 학생들이 지금이 프로그램. 여기에 주요 온다. 통보는 어떻게 선언 않는다 학생의 배열? 글쎄, 난 그냥 같은 구문을 사용합니다. 단어 학생은 분명히 새로운 기능입니다. 하지만, 학생, 클래스 브래킷 학생. 그래서 불행하게도 많은있다 여기에 용어의 재사용. 이것은 단지 숫자입니다. 그래서이 세 가지를 말하는 것과 같다. 클래스는 내가 원하는 그냥 뭐 것입니다 변수를 호출합니다. 나는 학생을 호출 할 수 있습니다. 그러나 클래스는,이에서 클래스가 아닙니다 객체 지향 자바 종류의 방법. 그것은 단지 학생들의 수업입니다. 그리고 모든 요소의 데이터 유형 그 배열의 학생입니다. 그래서 이것은 조금 다르다 뭔가 말에서 이처럼, 그것은 단지 - 나는 나에게 세 학생들에게 말하는거야 그 배열 클래스를 호출합니다. 좋아. 지금 여기에 네 개의 루프입니다. 이 남자의 잘 - 반복하는 업에 0에서 3 개. 여기 구문의 새 작품이다. 이 프로그램은 나에게 묻는거야 그것을 학생을 줄 수있는 사람, int이며 ID. 그리고 여기 당신이 할 수있는 구문이다 에서 ID 필드에 어떤 것을 저장 위치 클래스 브래킷 그래서 난 이 구문은 새로운 것이 아니다. 이것은 단지 나에게 여덟째을주는 의미 클래스의 학생. 하지만이 기호는 새로운 기능입니다. 지금까지, 우리는 점을 사용 할 수있어 다음과 같은 최소한의 코드입니다. 의미로 알려진 구조체로 이동 학생 뭔가를 넣어. 마찬가지로,이 다음 줄에, 31 일 이동 미리 넣어 어떤 사용자 유형 여기에 이​​름과 그들이 위해 할 집 같은 것, 가서 . 집에 넣어. 그래서이 프로그램은 무엇을합니까 궁극적으로합니까? 당신은 거기에 약간의 맛보기를 볼 수 있습니다. 내가 가서 구조체 0을하자 점 슬래시 구조체 0, 학생의 ID 1, 데이비드 메이, 학생 ID 2를 말한다. 롭 커크 랜드, 학생 ID 3. 로렌 Leverit - 이 프로그램은 한 유일한 것은, 이는 단지 완전히 임의입니다 나는이 데이터로 뭔가를하고 싶어 내가 방법을 우리에게 가르쳐있어 지금 그 구조체를 사용, 난 그냥했다입니다 여기에이 여분의 루프. 나는 학생의 배열을 반복. 나는 우리, 아마도 지금은 익숙한 친구가 사용 문자열로 stircomp 비교 검사는 8 학생의 집 메이 같음? 그리고 만약 그렇다면, 뭔가를 인쇄 임의 좋아, 그래, 그것은이다. 그러나 다시, 다만 저에게 기회를주는 및을 사용하여 재사용 이 새로운 점 표기법을 재사용 할 수 있습니다. 그래서 사람은 바로, 무슨 상관이야? 학생 프로그램과 함께 오는 것은 다소 임의의,하지만 밝혀 우리와 함께 유용한 일을 할 수있는 이 예를 들면 다음과 같습니다. 이것은 훨씬 더 복잡한 구조체입니다 C에서 그것은 다스 필드를 더 있어요 다소 암호화 방식 지명했다​​. 그러나 당신은 그래픽 들었어요 경우 비트 맵이라는 파일 형식 BMP, 그 밝혀 그 비트 맵 파일 형식 꽤 많은이 그렇게 보인다. 그것은 멍청한 웃는 얼굴이다. 내가을 확대했던 작은 이미지의 꽤 큰에 나는 서로를 볼 수 있도록 개별 점 또는 픽셀. 우리를 나타낼 수 있습니다 밖으로 지금, 그것은집니다 숫자 0, 말, 검은 점. 숫자 1과 흰색 점. 그래서 다른 말로하면, 당신이 원하는 경우를 그리는 방법 웃는 얼굴에서 해당 이미지를 저장 컴퓨터는 0을 저장하고 충분 다음과 같이 것, 어디서, 다시, 사람은 백색이다 과 제로는 검은 색입니다. 과 함께, 당신은 효과적으로있을 경우 1과 0의 조롱, 당신은이 픽셀 격자, 당신은 누워 경우 그들을 밖으로, 당신은 사랑이 작은 웃는 얼굴. 이제, 비트 맵 파일 형식, BMP는,이다 효과적으로 후드 아래, 하지만 더 많은 픽셀 SOT 함께하는 당신 실제로 색상을 나타낼 수 있습니다. 하지만 당신은 더 정교한있을 때 BMP 및 JPEG 및 GIF와 같은 파일 형식 하는 당신은, 익숙한 될 수 있습니다 디스크에 파일을 일반적으로뿐만 아니라, 0과 1 픽셀에 대한 것들을 가지고 있지만, 그들은뿐만 아니라 일부 메타 데이터가 - 정말없는 의미에서 메타 데이터 만 가지고 유용합니다. 그래서 여기이 필드는 암시하고있다 우리는 P-세트에서 더 자세하게 볼 수 있습니다 5 그 0과 그 전에 , 이미지의 픽셀을 나타냅니다 메타 데이터의 무리처럼 거기 이미지의 크기와 이미지의 폭. 그리고 난 몇 가지를 따 버릴거야 알 여기에 임의의 것들 - 폭과 높이입니다. 비트 수와 몇 가지 다른 것들. 그래서 파일에 일부 메타 데이터가있다. 그러나 파일을 배치하는 방법을 이해하여 이 방법에서 밖으로, 당신은 실제로 수 다음 이미지를 조작, 이미지를 복구 디스크에서 이미지 크기를 조정합니다. 하지만 당신은 반드시 할 수 없습니다 을 향상시킬 수 있습니다. 나는 사진을 필요로했다. 그래서 당신이 본 사람, 여기 RJ으로 돌아 갔다 꽤 시간 전 화면. 여기 기조를 열고 있다면,이는 당신은 무엇을 확대하려고하면 발생하고 RJ을 향상시킬 수 있습니다. 그는 정말 더 나은 점점 아니에요. 지금 기조가 모호의 종류 조금 그냥 얼버무리고하기 RJ 특히하지 않는다는 사실 당신이 확대 강화 그리고이 방법을 수행하는 경우, 사각형을 참조하십시오? 네, 당신은 확실히 볼 수 있습니다 프로젝터의 사각형. 그게 당신이 개선 할 때 무엇을 얻을. 그러나 이해하는 방법 우리 RJ 또는 웃는 얼굴이 구현되는 것은 우리에게 드릴 것입니다 실제로 조작하는 코드를 작성 이러한 확인해보세요. 그리고 함께,이 주에 끝날 줄 알았는데 55 초, 그건 향상 나는 오히려 잘못된 말 하다니. [동영상 재생] - 거짓말이야. 무엇에 대해, 나도 몰라. - 그래서 우리는 무엇을 알 수 있습니까? - 그 9시 15분 레이 산토시 ATM했다. - 그래서 질문은 무엇인가 그는 9:16에서 일했다? - 촬영 아홉 밀리미터 뭔가. 어쩌면 그는 저격수를 보았다. - 또는 그와 함께 작업 하였다. - 기다립니다. 하나를 뒤로 이동합니다. - 어떻게 볼 수 있습니까? 전체 화면으로 자신의 얼굴을 최대로 만듭니다. - 그의 안경. -이 반사입니다. - 그게 Neuvitas 야구 팀이다. 그건 자신의 로고입니다. - 그리고 그는 누군가와 얘기 그 재킷을 입고. [END 동영상 재생] DAVID J. 마란 :이됩니다 문제 5 세트합니다. 우리는 다음 주에 볼 수 있습니다. 남성 SPEAKER : 다음 CS50에서. [귀뚜라미 지저귐] [음악 연주]