[음악 연주] 데이비드 J. 마란 : 좋습니다. 이 CS50이다. 그리고 이것은 주 5의 시작이다. 그리고 당신은 눈치 챘을 것이다으로, 재료의 일부 조금 더 받고있다 단지, 좀 더 조밀 한. 그리고 특히, 매우 쉽게 당신은 몇 시간 동안 습관을 봤는데 가장 아​​래로 낙서하려고합니다 우리가 무엇이든, 우리는 수업 시간에 말을하는지. 하지만 그건 아마도 아니라, 실현 이상적인 교육 학적 접근 소재의이 종류를 학습, 재질보다 일반적으로. 그래서 우리는 기쁘게 그 CS50 자신의 Gheng 발표 공을 준비하기 시작했다 노트의 정식 세트 코스의 희망 이는 이들도 그 하나이다 뿐만 역할 참조 및 리소스 자료를 검토하고가는 대한 다시 자료를 통해있을 수 있습니다 그 주위에 당신에게 처음으로 탈출하지만, 또한 귀하의 머리가 될 수 더 아래, 때를보다 최대 강의 시간을 제공, 당신이 참여할 수 있도록 더 신중, 같은 더 scribbly에 반대했다. 그렇게 말한다면, 당신은에서 확인할 수있는 것들 웹 사이트는이 같은 문서입니다. 그리고주의 사항, 좌측 상단에, 거기에 뿐만 아니라, 콘텐츠의 테이블, 뿐만 아니라, 그 타임 코드 바로 점프합니다 해당 부분 비디오 온라인에서. 그리고 여기에 어떤 장 수행 한 본질적으로 설명되어 있습니다 어떤이 일어난 특히 강의. 그리고 강의의 대부분은 아르 이미 온라인 지금이 URL과 함께. 그리고 우리는 나머지를 이어갈 것 이번 주 말까지 사람들의, 그래서 자원을 활용 않습니다. 그래서 소동, 우리는 벗겨 시작 경우에, 계층 시간에 대한 문자열입니다. 그리고 우리는 문자열을 말 했는가 실제로 지난 주입니까? 그래서 문자 스타. 그리고 문자 스타, 그럼, 그건 정말 뜻 이죠? 음,이 모든 시간, 우리는했습니다 경우 함수를 호출하고, 있는 getString 및 저장 등 소위 복귀 에있는 getString의 값 variable-- 그것은이라고 우리가 쓰고있어 string--의 유형 거기 위의 코드의 라인. 내가 볼 때 그것은 단지의 내 필기 여기 확대 나는이 얼마나 형편 실현 않습니다. 그러나 이제 그 가정 해 봅시다, 우변 그럼에도 불구하고, 합리적이다 무엇 묘사 이 모든 것들이 한 getString에와 시간입니다. 있는 getString는 물론, 문자열을 가져옵니다. 하지만 정말 무엇을 의미 하는가? 그것은의 덩어리를 얻는다 수단 운영 시스템으로부터 메모리 함수를 호출하여, malloc을 불렀다. 그러나 더 자세한 내용은 나중에 다루겠습니다. 그리고, 그것은 웁니다 메모리의 덩어리 문자로 사용자가있다 에 입력 한 후, 물론 널 문자 또는 백 슬래시 맨 마지막에서 0. 한편, 왼쪽에 이 이야기의 모든 시간, 우리의 같은 변수를 선언했습니다. 그리고 그 변수는 이제 무엇을이다 포인터를 호출 시작합니다. 그것은있는 내부 상자 아니다 우리는 문자열을 넣어 Daven, 그 자체, 오히려 우리는 광장에 넣어 왼쪽 정확히 무엇에 상자? 그래? 청중 :의 주소 어디 메모리에 위치하고. 데이비드 J. 마란 : 그렇지. Daven의 주소 메모리에 있습니다. 그리고 Daven의 모두가 위치한 곳이 아니 본질적으로, 그러나 구체적으로는 어드레스 무엇을? 그래? 청중 : 첫 번째 문자. 데이비드 J. 마란 : 첫 번째 문자 이 경우 Daven,에서, 내가 임의로했다 제안했다 그리고 비현실적 일, OX1, 이는 단지 의미 하나의 16 진수. 그러나 그것은 아마거야 훨씬 더 큰 숫자 여야합니다 우리는 그릴 수 있음 접두사로 0X와, 진수 문자를 나타내는. 그리고 우리는 위치를 알 필요가 없기 때문에 Daven의 문자의 나머지 때문에의, 무엇 심플한 디자인 결정 몇 년 전에 만들어 졌다고? 그래? 청중 : 백​​ 슬래시 0. 데이비드 J. 마란 : 네, 맞습니다. 백 슬래시 0에서이기는하지만, 당신이 할 수 있습니다 선형 시간 문자열을 통과하고, 왼쪽에서 오른쪽으로 걸어 루프 또는 동안 함께 루프 또는 뭔가처럼 즉, 여기에, 오, 결정 특정 문자열의 끝에있다. 에서 그냥 주소 그래서 문자열의 시작, 우리의 전체를 액세스 할 그것은이 모든 동안 때문에, 문자열은 문자 별이었다. 그래서 계속 사용하려면 확실히 괜찮아요 CS50 라이브러리와이 추상화, 말하자면, 그러나 우리는거야합니다 정확히보기 시작 무슨 일 됐어요 모든 시간 아래. 그래서 당신은이 예제를 불러올 수있다, 역시 마지막에서, 0 비교, 이는 실제로 비교하지 않았다. 그러나 우리는이 문제를 해결하기 시작했다. 그러나 같은 아마 재교육, 나는 누군가 관심을 수 있습니다 분홍 코끼리 오늘날, 또한 장에 의해 만들어? 어떻게 앞의 당신은? [INAUDIBLE]. 올라 와요. 그리고 그 동안, 당신이 와서 같이하자 단지 잠시 동안 무슨 생각 이 코드는 실제로 일을했다. 이 두 변수를 선언하는 것 위, s 및 t, 및있는 getString을 호출. 이것은, 매우 사용하기 쉬운 프로그램 아니다 당신을 말하지 않기 때문에 무엇을 할 수 있습니다. 그러나 단지 우리가있어 가정하자 육즙이 부분에 초점을 맞추고. 의이 동일한 경우 그리고 우리는 할 그것은 printf의 말을해야 t에 해당, 당신은 같은 일을 입력했습니다. 안녕하세요. 당신의 이름은 무엇입니까? 쟈넬 : 쟈넬. 데이비드 J. 마란 : 쟈넬, 만나서 반갑습니다. 에서 당신의 도전 그래서 이 코끼리 손 첫째 우리에게 무엇의 그림을 그릴 수있다 그 첫번째이 표현되는 선. 그래서 s와 t는 다음과 같을 수 있습니다 어떻게 화면에 표시? 그리고 당신은 그것을 그릴 수 있습니다 이 대형 스크린에 손가락. 그래서 두 개의 반쪽을 거기에 그 방정식의 각면. 그래서이 왼쪽에들, 그리고 다음 오른쪽에있는 getString. 그리고 t의 왼쪽에있다 다음 오른쪽에있는 getString. 그래서 우리는 어떻게 시작 있습니다 그림을 그리기가 무슨 일이 일어나고 있는지 나타냅니다 여기에 메모리에, 당신은 말할 것? 그리고 내가 당신이 설명합시다 당신이 가서 당신은 무엇을하고 있어요. 쟈넬 : OK. 음, 첫째, 그것은 묻는 것 당신은 입력 문자열을 얻을 수 있습니다. 그리고 아, 미안 store-- 것이다. 데이비드 J. 마란 : OK. 좋은. 그리고 이것은 무엇이라고? 아, 그렇군요. 계속하세요. 내가 방해 할 생각은하지 않았다. 쟈넬 : 죄송합니다. 그래서 입력을에 것 주소가 확실하지 집게 리아. 나는 수를 정확하게 기억할 수 없다, 하지만 난 그것을 0으로 시작했다 생각합니다. 데이비드 J. 마란 : 그건, 괜찮아 내가 번호를 만들었 기 때문에, 그래서 정답은 없습니다. 쟈넬 : 0 호를 시작으로. 데이비드 J. 마란 : OK, 그래서 요소 0. 물론. 쟈넬 : 그리고 경우 단지 두 letter-- 추천 데이비드 J. 마란 : OK, 다시 당신에게. 쟈넬 : 그래서 요소 0, 그리고 다음 요소 일 또는 요소 2. 어떤 조각 그리고 : 데이비드 J. 마란 그림은 지금 그리는? getString에 대한 호출? 또는 S의 선언? 쟈넬 : 선언 의, 나는 믿는다. 아, getString에,이 때문에 각각의 [에 입력 할 수? 영역입니다. ?] 데이비드 J. 마란 : 좋은. 정확히. 심지어이 효과적으로하지만 배열 회수 반환, 우리는 문자열을 다시 얻을 때, 우리는 할 수 01과 2를 사용하여 해당 문자열로 인덱스입니다. 기술적으로, 이들은 아마 개별 주소로 대표 하지만 괜찮아요. 그래서, 생각하면 그냥 빨리 할 수 우리가 중단 된 부분에 전달 마지막으로, 중 하나가 문자열, B 전자 g이었다 백 슬래시 공함으로써 대표 게이브의의 입력, 우리는 어떻게들 이제 나타낼 수 있는가? 이있어 메모리가 있으면 getString에 의해 반환 된? 쟈넬 : 그것은 있을까 원호로 표시? 데이비드 J. 마란 : 아크? 아, 아니. , 그냥 그림으로, 가정 해 봅시다 나 그냥 앞으로 가자 이 s의 경우,이 것을 제안 getString에의 반환 값입니다. 그리고 당신은 0, 1, 2,로이 그려 놨하는 완벽하게 합리적이다 우리 때문에 같은 문자열로 인덱스, 할 수있다. 그러나 단지와 일치합니다 마지막으로, 내가 앞서 가자 임의로이 제안합니다 주소 하나이며,이 주소 2, 본 등등 어드레스 3,이다. 그래서, 그냥 슈퍼 영웅이 될 수 있습니다 분명, 무슨 일이야 그 결과들에 이동합니다 코드의 첫 번째 줄, 당신은 말할 것? 쟈넬 : 주소 하나? 데이비드 J. 마란 : 그렇지. 그래서 0x1로를 해결합니다. 그리고 그 사이에, 내가 가서하자 당신이 한 일의 대부분을 중복 여기에 내 자신의 t을 추가합니다. 나는 게이브을 입력한다면 또, 두 번째로, getString에 묻는 메시지가 언제, 어디서, 물론, 게이브 갈거야? 음, presumably-- 쟈넬 : 여기에처럼? 데이비드 J. 마란 : 그래. 쟈넬 : 또는 동일한 상자도있어? 데이비드 J. 마란은 : 내가 그래, 제안하자 정확히 이러한 추가 상자에 이렇게. 하지만 지금은 키 것은 심지어 것입니다 나는이 아주 가까이를 그려 놨지만 랑 같이 0x1로,이 실제로 0x2--되고, 이것은 지금, 주소 0x10을 수 있습니다 예를 들면,과하게 0x11 및 0x12를, 등등. 그래서, 그런 경우가 있다면, 어떤 t 여기에 끝낼거야? 쟈넬 : 0x10을? 데이비드 J. 마란 : 그렇지. 그래서 0x10을. 그리고 이제 마지막 질문. 당신은 지금까지의 일을해야했다 지금까지 코끼리 어려운. 지금까지, 나는 코드를 당기면 다시, 내가 할 때, 선 셋에, 의 같음 t에 해당하는 경우, 사실은 무엇을 어디로 우리는 여기에 그려 놨 비교하는 것을? 쟈넬 : 두 개의 주소? 데이비드 J. 마란 : 그렇지. 그래서 t 같지 동일한 s입니다 말인지? 즉, 10과 동일한 동일한 1? 그리고 물론, 확실한 대답은 이제 더있다. 그래서이 프로그램은 궁극적으로 당신이 말하는 것이 무엇 인쇄 할 것? 쟈넬 : 그것은, 수 있을까요 당신은 같은 일을 입력? 데이비드 J. 마란 : 그래서 만약 의 1이며, t는 10? 쟈넬 : 당신은 다른 일을 입력했습니다. 데이비드 J. 마란 : 그렇지. 당신은 다른 일을 입력했습니다. 좋아. 그래서 박수, 여기, 우리가 할 수있는 경우. [박수] 즉 고통이었다. 나는 알고있다. 멋지게 수행. 그래서 지금 보자 경우 우리는 할 수 없습니다 수정이 무엇인지 떨어져 애타게. 그리고 물론, 우리는이 겁니다 고정 할 때 이는 지금 green--를 대표합니다 우리는 여기에 개선의 몇했다. 첫째, 단지 정신으로 내가 먼저 알아보고 있어요 확인 의 널 같고 t은 널 (null)과 동일합니다. 그리고 그냥 명확하게, 경우는 수도 s 또는 t이 같은 코드에서 null이? 때 s 또는 t는 널이 될 수 있습니다. 그래? 청중 : [들리지]. 데이비드 J. 마란 : 그렇지. 문자열 사용자가 해당하는 경우 에 입력 너무 깁니다 메모리에 맞게, 또는합니다 그런 이상한 코너 케이스, 우리가 볼 수 있습니다 말 그대로,있는 getString 오늘, 자사의 문서, 그것은뿐만 null를 돌려줍니다 말한다 특별 감시 값 하거나 종류의 특수 기호 그 뭔가 잘못을 의미합니다. 그래서 우리는 확인하려는 알고 보니 때문에, 그 이 널 (null)은 매우 위험한 값입니다. 종종, 당신은 뭔가를하려고하면 널 (null)을 통과하는 function--을 포함 입력으로, 그 기능을 instance--에 대한 아주 그것으로, 충돌 것이다 있습니다, 당신의 전체 프로그램을 내려. 따라서이 세 번째 줄은 이제 단지 정신입니다 당신이 경우, 오류 검사를 확인합니다. 즉, 지금 좋은 습관이야 우리는 시간에 얻을 수 있습니다 우리 값을 사용하려고하는 잠재적으로, 널 (null)이 될 수 있습니다. 지금, 여기에 네 번째 줄에서, "만약 strcmp와 (S, t),"잘​​, 무엇을 말하는 것을입니까? 음, 우리는 이것이 매우 간결을했다 문자열 비교 명명 된 함수입니다. 그리고 인생의 목적은 비교하는 것입니다 둘째 반대의 첫 번째 인수, 하지만 자신의 주소의 관점에서, 우리는 잠시 의도했던 것처럼 전 빨간색 코드 만 오히려 그 두 가지를 비교 인간적으로 직관적 인 문자열 이에 대해,이를 비교하여 방법 이,이에 대한, 그리고에 대한 다음 중지 할 때 한 경우 및 또는 내 손가락의 두 백 슬래시 공을 안타. 그래서 누군가 년 전에 구현을 strcmp 기능을 우리를 위해 구현 우리는 우리가받은 것 바란다고 단지 간단한 두 값을 비교하여. 지금 솔직히 도면을 유지 이러한 다양한 모든 숫자. 그러나 현실은 내가 봤는데입니다 전체 시간이을 만들기. 그래서 내가 그냥 앞으로 가자 이러한를 낙서 포인트를 만들기 위해 그, 말 일의 전진, 우리가 정말 걱정하지 않을거야 무슨 일이 실제로 해결 메모리. 그래서 나는이를 그릴 않을거야 너무 더 이상 숫자 가지, 난 도망이 단지 추상적 해요 그냥 화살표가 더 친절한 약간. 즉, (S)가 포인터이면, 음,, 그냥 문자 그대로를 그려 보자 포인터로, 화살표가 가리키는 , 뭔가 다른 자체에서 약을 너무 많이 더 걱정 이 주소의 특징점 이는 다시, 나는 어쨌든했다. 그러나 우리는 그 주소를 볼 수있을 것이다 때로는 코드를 디버깅 할 때. 이제 한편,이 프로그램 여기까지 수정은 물론, 비교하여 그 문제 두 문자열. 그러나 우리는 또 다른 문제 다 퉜다. 이 복사본이었다 , 마지막으로 프로그램 이에, 내가 투자하려고했다 문자열에서 단지 첫 번째 문자. 그러나 증상이 무엇 이었습니까 우리는 때 마지막으로 본 사용자는 같은 값에 입력 소문자 게이브,의에 대한, 우리는 t에의 할당 이 세 번째 행에서와 같이, 그리고, 나는에 시도 t 브래킷 공을 활용? 의 효과가 무엇인가 t 브래킷 공 여기를 변경? 청중 : 그것은의 변경. 데이비드 J. 마란 : 네, 나뿐만 아니라,의를 변경했습니다. 정말 무슨 일이 있었는지 때문에? 음, 청소 수 있다면 어디 보자 이 사진을 최대로는 다음과 같다. (S) 인 경우, 다시, 워드 g, A, B, E, 슬래시, 0, 및 S 우리는 상자로 그림을 계속해서 여기에, 그러나 더 이상 주소. 의 물건을 생산을 중단하자. 그냥 그림을 그려 보자 세계를 단순화합니다. 내가 문자열 t와 t를 선언 할 때, 즉, 메모리의 덩어리를 만듭니다. 광장은 32을 될 일이 대부분의 컴퓨터의 비트. 사실, 경우에 당신은 들었어요 컴퓨터는 32 비트 구조를 갖는 정말 멋진 발언, 즉 단지 그것은 32 비트 주소를 사용 수단. 그리고 옆으로 기술로, 당신이 궁금해 한 경우 왜 오래된 컴퓨터, 실제로 경우 RAM의 많은 수프 그들을하려 단을 가질 수있는 최대 RAM 4GB의의, 물론 그 말 그대로 때문이다, 이전 컴퓨터가 할 수 만 4만큼 높은 카운트 억, 40 억 바이트, 그 때문에 32 비트를 사용했다 주소 번호. 그러나 어떤 경우에는,이 목록 예를 들어, 이야기의 훨씬 간단. t는 또 다른 포인터, 또는 정말 문자 스타, 일명 문자열입니다. 그리고 어떻게이 사진을 업데이트 하시겠습니까 이제 코드의 두번째 라인, 도트 후, 점, 점? 내가 할 때 문자열 t는의 세미콜론과 동일 이 그림은 어떻게 변경합니까? 그래? 청중 : [들리지]. 데이비드 J. 마란 : 그래. 정확히. 나는 단지에서 화살표를 넣어 같은 주소에 t 상자, 에서 같은 첫 글자했다. 또는 기술적으로, 만약이 남자는 0x1로 여전히했다 내가 가진 것처럼입니다 여기 0x1에서 0x1로 여기. 그러나 다시, 무슨 상관이야 주소에 대한? 이제 중요한 그냥 생각입니다. 따라서이 여기서 무슨 일이 일어나고 있습니다. 물론, 당신이 경우에 t 브래킷 그래서 배열 표기법이다 영, 의 course-- 그리고 솔직히, 그것은 본다 여기에 배열이있는 것처럼, 하지만 지금은 이상한 일이있다. 그 프로그래밍 언어를 알고, C는, 당신에게이 기능을 제공합니다 이에 의해, t는 경우에도 포인터, 또는 S는 포인터이고, 당신은 여전히​​ 익숙한을 사용할 수 있습니다 편안한 대괄호 표기는 첫 번째 요소로 이동합니다, 두번째 요소, 또는 임의의 소자 나 그 포인터가 가리키는 것을 행 아마도 때문에, 그것을 이 경우에서와 같이, 인 일부 배열을 가리키는. 그래서 우리는 어떻게이 문제를 해결합니까? 그것이 어디서 났는지 솔직히,이입니다 첫눈에 약간의 압도적. 하지만, 여기에 새롭게 향상된 버전입니다. 그래서 첫째, 내가 받고 있어요 CS50 라이브러리를 제거, 다만 실제로 그 s의 폭로 문자 스타, 그냥 동의어. 그리고 t는 문자 별이다. 그러나에 무슨 일이 일어나고 있는지 그 라인의 오른쪽 t은 값이 할당되는 경우? malloc에​​ 무엇입니까? 그것은 무엇을 나 strlen입니까? 를 sizeof (문자) 란 무엇입니까? 왜 도대체이 작업을 수행 회선 너무 복잡? 그것은 무엇 높은 수준에서 뭐하는거야? 무슨 일이 t에 저장하는거야? 그래? 청중 : 그것은 할당하는 것 메모리 공간의 일정량. 그것은 저장하는 데있어 것 같아요, 편지 [INAUDIBLE]. 데이비드 J. 마란 : 완벽 한. 완벽 한. 그것은 특정 할당있어 메모리 공간의 양 아마도 미래의 편지를 저장합니다. 특히, malloc에 따라서 무엇을 반환? 청중 : [들리지]를 갈까요? 데이비드 J. 마란 : 그렇지. 해당 메모리의 주소를 반환 하는 말의 멋진 방법입니다, 의 주소를 반환 해당 메모리의 첫 번째 바이트. 내가 기억하기에 부담이다 얼마나 많은 메모리 I 실제로 할당 또는 위해 malloc을 요청했다. 이제 얼마입니까? 음, 비록 여기에 괄호를 많이, malloc에​​ 단지 하나의 인자를합니다. 그리고 난의의 strlen 함수를 지정하여 드리 해요 저 많은 바이트의에 있기 때문에, 하지만 하나를 추가 할 수 있습니다. 왜? 그래? 청중 : 백​​ 슬래시 0. 데이비드 J. 마란 : 그렇지. 우리는 약간의 가사를 할 수있어. 백 슬래시가 있기 때문에 그래서 영, 우리는 더 나은 기억 것입니다. 그렇지 않으면, 우리는거야 문자열을 만드는 그 특별한 터미네이터가 없습니다. 한편, 단지 슈퍼 영웅이 될 수 있습니다 항문, 나는를 sizeof (문자)가 단지의 경우 누군가가 내 실행 하지 CS50 어플라이언스 코드 하지만 어쩌면 다른 컴퓨터 모두 문자 관례 적으로, 한 바이트이지만 둘 바이트 또는 그보다 더 큰 것을. 그냥 슈퍼 수있어, 오류 슈퍼 싫어. 비록 실제로, 이건 가장 가능성이 하나 될 것. 지금, 그 사이에, 내가 가서 복사 문자열, t 브래킷 i는 t 브래킷의 동일합니다. 그리고 지난 주에 연기합니다 소스 코드는 무슨 일이 일어나고 있는지 볼 수 있습니다. 키 테이크 아웃하고, 그러나 이유는 녹색에서 이제 코드를 입력 , 바로 그 마지막 줄에 있기 때문이다 t 브래킷 0,인지 toupper와 동일 의 효과를 갖는다 활용되는 문자열? t 및 / 또는 S? 코드의 마지막 줄. 무엇 때문에 그냥 t 이 시간을 무슨 일이 있었 나는 약간 그 마지막 단계를 취소하는 경우, 내가 malloc을 호출 할 때 무슨 일이, 무슨 일이 있었있어 나는 기본적으로 메모리의 덩어리를 얻을 즉, 원본과 동일한 크기이며, 즉 산술 때문에 나는했다. 나는 주소 t에 저장하고있어 메모리의 청크의. 심지어이 좋은 보이지만 그리고, 꽤 좋은 빈, 현실은 우리가 지네된다 여기에, 호출 쓰레기 값을 유지합니다. 메모리의 청크 수도 매우 물론 이전에 사용되었습니다 몇 초, 몇 분 전에. 그래서 절대적으로 숫자가있을 수 있습니다 그냥 우연히이 또는 문자. 그러나 그들은 내가 때까지 유효하지있어 나 자신이 메모리 덩어리를 채 웁니다 실제 문자와 같은 I 이 for 루프에서 수행. 좋아? 그래서 지금의 절정 이 세 가지 예 즉, 겉으로는, 지난 번 졌 있었다 이 스왑 예를 들어,이 기능 의미에서 일 이는 A와 B를 바꾼 것이다. 그러나 그것은 어떤 다른 의미에서 작동하지 않았다? 그래? 청중 : [들리지]. 데이비드 J. 마란 : 그렇지. 나는이 함수를 호출한다면 예를 들어 another--에서, 여기서 주요 같은 함수에서 나는 같은 변수 X와 Y가 지난 주 한, 동일한 코드, 나는 X와 Y에 전달 로 교체 한 다음 Swap--이 전화를 걸려면 물론, 올바른 버전입니다 우리가 할 거니까 무엇인가 보라고 그것은 작동하지 않았다. 그래서 수정은 무엇입니까? 음, 그래서 그냥 할 수 분명, 내가 앞서 가자 그리고 ... 두번째 여기 나에게 하나를주고, 참조 나는 당신에게 마지막으로 하나를 표시 할 수있는 경우 내가 찾을 수 있는지 보자 받 것 이 진짜 빨리 ... OK, [INAUDIBLE]. OK, 거기입니다. 그래서 난 그냥 입력 해요 명령을 무시합니다. 나는에서 검색 할 마지막 순간 예 마지막으로,로부터의 이제 더 스왑라고하지 않습니다. 그래서 더 스왑 곳 없다 우리는 지난 시간에 중단 이에, 내가 초기화 1 x와 2 y를 입력합니다. I는 1, 2를 전달, 교환을 호출합니다. 그리고이 기능 어떤 의미에서 일 그러나 영구 없었다 (X, Y)에 영향을. 그래서 손을 문제는 어떻게 지금이다 우리는 실제로이 문제를 해결하는 방법은 무엇입니까? 손의 해결책은 무엇인가? 음, 오늘은 새로운 swap.c에서, 두 가지 점을 알 수 있습니다. X와 Y는 동일합니다. 하지만이 명확하게 25 행에 대해 다른? 당신이 기억하면 어떻게 거기에 새로운 그것은 초 전에 어떻게 생겼는지? 청중 : [들리지]. 데이비드 J. 마란 : 그래. 그래서 앰퍼샌드는 새로운 조각 아르 구문뿐만 아니라이 프로그램에, 뿐만 아니라,보다 일반적으로 CS50있다. 지금까지, 나는 생각하지 않습니다 우리는 예제를 본 적이 또는 정말 어떤에서 그들에 대해 이야기 어쩌면, 선제 적으로, 이외의 세부 사항, 섹션에서이 같은 앰퍼샌드. 음, 앰퍼샌드 하나입니다 밝혀 새로운 신택스의 마지막 조각 우리는 배울 것입니다. 간단히 말해이 일부 변수의 주소입니다. 어떤 주소에서 X는 살고 있습니까? 그러나 Y는 어떤 주소를 살고 있습니까? 때문에 경우 전에 근본적인 문제 그 x와 y를 전달되고 있었다되었다 우리가 정말 무엇을 원하는 사본 등 보물 등으로 스왑을 제공한다 여기서 x는 실제로 y로 리드지도 그래서, RAM에 스왑은지도를 따를 수 있습니다 X 또는 Y가 자리를 표시 어디서나로 이동 그리고 실제 값을 변경 한 2 가. 그래서 스왑도 약간 변경해야합니다. 그리고 첫눈에,이 힘 문자 스타에 조금 비슷한 것 같다. 그리고 실제로 그것은이다. 그래서이 어떤 유형의 데이터에 대한 포인터이며, 이 강조 부분에 따라? 그래서 정수입니다. 그래서 더 이상 INT 없습니다, 그것은 정수의 주소입니다. 그리고 유사하게, 나 지금 것입니다 int 형의 주소가 될 수 있습니다. 그래서 지금은 홈페이지에서 스왑을 호출 할 때, 나는 스왑 1 및 2 줄 않을거야. 나는처럼 주겠어 황소 뭔가 황소 뭔가 이끌이 주소 실제 위치로 스왑 내 컴퓨터의 메모리에. 그래서 지금, 내 나머지 구현 조금을 변경해야합니다. 이제 어떻게 분명히 다르다 코드의 세 가지 라인? 모든 빌어 먹을 별이있다 여기 저기, 알았지? 그래서 무슨 일이 일어나고? 그래? 청중 : 그것은 [INAUDIBLE] 분명합니다. 데이비드 J. 마란 : 그렇지. 이 context--에 따라서이 아니었다 최고의 디자인 결정, 인정 하듯이, 전 년. 이러한 맥락에서, 당신은 별이, 당신은 데이터 유형이없는, INT와 같은, 바로 왼쪽에, 대신 당신이 명확하게 등호가, 이러한 맥락에서, 당신이 말을 할 때 스타, 그로 이동을 의미 에서의 주소. 말하자면 보물지도를 따르십시오. 그리고 그 사이에, 37 행에서, 이 같은 일을 의미한다. 주소로 이동하고, 무엇을 거기에 넣어? 무슨 일이에있다 B가 지정하는 위치입니다. 즉, b에 이동합니다. 그 값을 가져옵니다. 동일 당에 가서 서명, 대입 연산자, 거기에 그 값을 넣어. 마찬가지로, INT 온도는 정수이다. 아무것도 온도에 대해 변경할 필요가 없습니다. 그것은 아넨 버그에서 단지 예비 유리하다 우유 나 오렌지 주스. 하지만, 말을 B에 갈 필요가 없습니다. 해당 대상으로 이동 이 온도의 값을 넣어. 그럼 무슨 일이 일어나고 있는지? 사실 경우이 시간을 바꿔 호출 할 때 이 첫 번째 트레이, 여기에 주를 나타냅니다 이 두 번째 트레이가 스왑을 나타냅니다 때 나는 앰퍼샌드 x와 앰퍼샌드 (Y)을 통과 주요 스왑에서, 그냥, 명확하게 이 스택 프레임 수신은 무엇입니까? 그래? 청중 : [들리지]. 데이비드 J. 마란 : 그렇지. X의 주소와 y의 주소. 그리고 당신이 생각할 수있는 우편 주소 등을들 수있다. 33 옥스포드 스트리트 (Oxford Street) 및 35 옥스포드 스트리트 (Oxford Street), 그리고 이 건물을 이동할 그 위치에 있는지. 그것은 말도 안되는 아이디어의 일종, 하지만 우리가 주소를 의미하는 전부입니다. 세계 어디에 수 당신은 그 두 개의 정수를 찾을? 세계 어디에 할 수 있습니다 이 두 건물을 찾을? 그래서 마침내 경우, 모든이 시간 I 후 오늘의 소스 코드로 가서 컴파일 스왑 및 런 ./swap 최종적 대 처음으로 우리는 실제로 보는가 내 값은 참이 성공적으로 교체되었다. 그리고 지금, 우리는 심지어 걸릴 수 있습니다 이것으로 말하자면, GDB의 노트. 그래서 나 같은 파일로 가자. 내가 가서 ./swap의 GDB를 실행하자. 그리고 지금, 스왑에, 내가 갈거야 앞서와 메인에 브레이크 포인트를 설정합니다. 지금은 갈거야 앞서 프로그램을 실행합니다. 그리고 지금 우리는 코드를 참조 그 줄에서 일시 중지되었습니다. 나는 앞서 인쇄 가면 X는 여기서 무엇을 볼 것인가? 그것은 질문입니다. 다시 말해? 청중 : [들리지]. 데이비드 J. 마란 : 그래서 임의의 숫자, 아마. 어쩌면 내가 행운, 그것은이다 공처럼 좋은 간단. 하지만 어쩌면 그것은 어떤 임의의 숫자입니다. 이 경우, 나는 운이 좋았죠. 그냥 0으로 발생합니다. 그러나, 참으로 행운입니다 하지 때까지 때문에 I 다음 입력 한 다음 인쇄 x는 것이있다 코드 라인, 라인 (19)는, 실행 된. 한편, 내가 입력하면 다음 다시, 그리고 지금은 2 참조거야, Y를 인쇄 할 수 있습니다. 내가 옆에 입력하면 지금, 그것은에 무슨 약간 혼란 스러울 지금 때문에, printf의은에 나타날 것입니다 화면은 않았다있다. 여기서 x는 1입니다. 다시 한 번이 작업을 수행 할 수 있습니다. 그리고 지금, 여기 어디 있어요 일이 흥미있어. 나는 스왑 또는 단계를 호출하기 전에 그것으로, 이제 조금 들여다 보자. X는, 또, 1이다. Y는 물론, 빠른 온건함이며 너무 어렵지도, 2를 확인합니다. 그러나 앰퍼샌드 x는 무엇인가? 답변, 그것은 가지 펑키 찾고 있습니다. 그러나 괄호 안의 INT 스타 단지입니다 이 말의 GDP의 방법은 주소입니다. 그것은, 그것의 포인터를 int이다 아니에요 INT는, 또는 다른 주소로도 알려져 있습니다. 이 미친 것은 무엇입니까? 우리는 무언가를 본 적이 이전에는 이런있다. 그래서 이것은 내 컴퓨터의 주소입니다 x는 사는 일이 곳의 메모리. 그것은 황소 뭔가. 그리고 솔직히, 왜,이다 나는 화살표를 그리기 시작했습니다, 숫자 대신, 누가 정말 걱정 때문에 당신 INT는 특정에 있음 큰 것을의 주소. bffff0c4 그러나, 이들은 모두 실제로 16 진수, f를 통해 공을있는. 그래서 우리는 너무 연연하지 않을거야 그 일이 무엇인지에 긴. 하지만 Y를 인쇄하는 경우, 물론, 나는 2를 참조하십시오. 그러나 앰퍼샌드 y를,이 주소를 참조하십시오. 그리고 예고, 호기심에 대한, 떨어져 X 및 Y는 얼마나 멀리 있는가? 당신은 주소의 대부분을 무시할 수 있습니다. 4 바이트. 그리고 그와 일치있어 우리 이전 INT 얼마나 큰이라고 주장? 4 바이트. 그래서 모든 게 안감까지처럼 보이는 잘, 당신은 메모리에 희망 수있다. 그래서 지금 그냥 빨리 감기하자 본편의 끝까지. , 이제 가서 단계를 입력하자 스왑 기능으로 다이빙합니다. 지금은 입력하면, 그것의, 알 (X)의 주소와 동일. 나는 B를 입력하면 동일하다 Y의 어드레스. 그래서 내가하면 무엇을 볼 수 , 주소로 이동 말할? 그래서 스타 인쇄 할 수 있습니다. 그래서 별은 이러한 맥락에서, 거기에 갈 것을 의미한다. 앰퍼샌드의 주소 무엇을 의미합니다. 그래서 수단 일 스타. 그리고 인쇄 스타 나 나에게이 있습니다. 그리고 내가 잠시 동안 가정하자, 적어도 코드가 그 할 수 있습니다 지금 실행 진행 그런 식으로 통해 추론. 그러나 우리는 오래 전에이 아이디어를 다시 방문합니다. 스왑의 그래서이 버전 이제 정확하고 있습니다 우리는 특정 데이터 타입을 교환한다. 그래서 질문이 다음 스왑에? 스타? 주소에? 그리고 당신과 함께 볼 수 있습니다 문제는, 일종의, 4 세트 하지만 문제는 오, 확실히, 어떻게 이러한 설정 가지 유용한 얻을 훨씬 더 결과적으로, 그들을 편안. 전혀 없나요? 좋아. 그래서 malloc에​​이 기능을 다시한다 그건 그냥 메모리, 메모리를 할당 할당. 왜이 유용합니다? 음,이 모든 시간, 당신의 malloc을 사용하고있다. 당신이 지금하는 방법을 고려하는 경우 작품을 getString는, 아마도, 그건 덩어리 누군가를 요구하고 메모리, 언제든지 사용자가 입력 문자열 에, 확실히 우리 때문에 몰랐 CS50 직원으로, 얼마나 큰 그 문자열 즉 인간 수 있습니다 입력 할 것입니다. 그럼, 처음에 시작하자 껍질 다시 어떻게 CS50 라이브러리 작품, 예를 몇 가지의 방법으로 그가 우리를 이끌 것입니다. 나는 gedit를 열어 그래서 경우 그리고, scanf와 공을 열어 우리는 다음과 같은 코드를 볼 것입니다. 의 웹 사이트에서 확인할 수 scanf와 공, 오늘, 코드의 상대적으로 적은 선이 여기, 20을 통해 14. 그리고 이제 그것이 무엇을하고 있는지 보자. 그것은 중간,라는 X를 선언합니다. 그것은 뭔가 같은 번호하시기 바랍니다 말했다. 그리고 지금은 scanf와의 %의 난, 및 X 말했다. 그래서 거기에서 새로운 물건의 무리가있다. 그러나 scanf와, 당신은 가지 생각할 수 printf와의 반대로서. printf의 물론 스크린 인쇄. 사용자의에서 검사의 scanf와 종류 키보드 무언가는 그 또는 그녀가 입력되었습니다. %의 난 그냥 printf와 같다. 이것은 기대 수단 사용자는 int를 입력합니다. 그리고 지금, 왜 내가 생각 scanf와 및 X를 통과 할 수 있는가? 만약 scanf와의 삶의 목적 사용자로부터 무언가를 얻을 수 있습니다, 의 의미는 무엇인가 지금 그것을 전달 및 X? 그래? 청중 : [들리지]. 데이비드 J. 마란 : 그렇지. 어쨌든 나는 인간, 내 입력을 입력 해당 위치에 저장 될 것입니다. 그것은 단지를하려면 불러 오기 충분하지입니다 우리가 이미 본 적이 있기 때문에, 배를 전달, 언제 당신은 단지 원시 변수를 전달 INT와 같은, 다른 기능, 확인, 그 변경할 수 있습니다 가변 아니라 영구적. 그것은 메인에 영향을 미칠 수 없습니다. 그것은 단지 자신의 로컬 복사본을 변경할 수 있습니다. 하지만, 대신에, 당신은하지 않습니다 나에게 실제 INT를 제공, 하지만 당신은 나에게 방향을 제공 그 정수는, 지금, scanf와 인 확실히, 나는 그것을 따를 수 있습니다 해결하고 거기에 숫자를 넣어 그래서 당신은뿐만 아니라 그것을에 액세스 할 수 있습니다. 나는이 프로그램을 실행할 때, 어디 보자. scanf와 0 점 슬래시를 확인, 0을 scanf. 그리고 지금은 숫자를 입력하는 경우 50 등, 50 주셔서 감사합니다. 지금 같은 번호를 입력하면 음수 대 1, 1 음. 지금 흠, 1.5과 같은 번호를 입력합니다. 왜 내 프로그램은 날 무시 했어? 음, 때문에 단순히, 나는 말했다 그것은 int를 만 기대합니다. 좋아. 그래서이 한 버전이다. 의 한 단계를 일을 보자하고 이 좋지 않은 것을 제안한다. 그리고 여기에 아주 간단한 예를 속인다 우리는 코드 작성을 시작할 수있는 방법 다른 사람들이 악용 할 수있는 나 나쁜 일을 수행하여 손상. 그래서 라인 (16), 그래서 유사한 정신 이전에, 그러나 나는이 시간을 int로 선언 아니에요. 나는 문자열 일명, 그것은 문자 스타를 선언하고 있습니다. 하지만 정말 무엇을 의미 하는가? 그래서 주소인데를 지정하지 않는 경우 내가 임의로 전화 해요, 버퍼 하지만 simple--로,이 부르심 수 다음 나는 이렇게 나에게 설명, 이전에 따라, 할 수 있다면 논리, scanf와 라인 (18)에 무엇을하고 있는지, 패스 % s 및 버퍼 경우, 주소는 무엇입니까? 당신을 적용하는 경우는 scanf는 무엇입니까 버전 0으로 동일한 로직, 여기에서하려고가는 경우 에서 사용자 유형 뭔가? 그래? 청중 : [들리지]. 데이비드 J. 마란 : 그렇지. scanf와, 이전의 논리에 의해, 문자열을 걸릴 것입니다 인간의 입력했는지 , 지금 문자열이다 받 그것은 아마도, 수 아니다 그 또는 그녀가 cooperates-- 경우 그리고 그 전환하려고 것 어떤 주소의 메모리에 문자열 버퍼를 지정합니다. 그리고 이것은 대단한 버퍼 때문에 실제로 IP 주소를 입력하기위한 것입니다. 그러나 나는이 프로그램에 버그가 주장 매우 심각한 방법, 가치가 무엇 때문에 기본적으로 버퍼? 나는 무엇을로 초기화 한? 메모리의 어떤 덩어리? 내가하지 않은, 오른쪽? 그래서 할당 한 경우에도 더 이상의라고 문자 스타, 그 대신이라고, 그래서 buffer-- 의 변수의 이름을 그려 보자 내가하지 않은 경우 지금과 같이 buffer-- 여기에서 getString 또는 malloc을 호출, 그 효과적으로 것을 의미한다 버퍼는 그냥 쓰레기 값입니다. 지금 그게 무슨 뜻 이죠? 내가 scanf를 말했다 것을 의미 사용자로부터 문자열을 기대합니다. 그리고 당신이 뭘 알아? 어쨌든이 일이 가리키는 바꿔 .. 내가 물음표를 그려 그러나 실제로, 그것은 될 것 OX1, 2, 3, 같은 맞죠? 그것은 어떤 가짜 값 난 그냥 앞에서가 발생합니다. 그래서 다른 방법을 넣어, 그것은이다 버퍼가 단지 인 것처럼 메모리에 뭔가를 가리키는. 나는 생각이 없다. 지금 게이브에 입력하면 그래서, 무슨 이 g-A-B-E / 공을 넣어하려고합니다. 하지만 누가 그게 뭔지 아는 사람? 과거에, 어떤 우리가 터치 시도한 시간 속하지 않는 메모리 우리에게 무슨 일이 일어 났는가? 또는 거의 모든 시간입니다. 분할의 오류, 오른쪽? 그것은 어디이 화살표, 나는 아무 생각이 가리키는. 그냥 어떤 임의의 값입니다. 그리고 물론, 당신은 해석하는 경우 어드레스로서 임의의 값, 당신은에 가서 어떤 임의의 대상. 그래서 게이브 충돌 참으로 수도 여기이 경우 내 프로그램. 그래서 우리는 거의 나쁜 무엇을 할 수 있는가? 이 셋째을 고려하여 scanf와의 최종 예. 이 버전은 어떤 의미에서 더 나은 무엇입니까? 당신은 편안하게하는 경우 이전 문제는이 낫다. 왜? 청중 : [들리지]. 데이비드 J. 마란 : 좋은. 라인 (16)의 그래서이 경우 점에서 더 낫다 우리는 명시 적으로 걸 일부 메모리를 할당. 우리는 malloc을 사용하지 않을 우리는 주이 사용하는 단지 배열을 선언하는 방법. 그리고 우리는 그 문자열 전에 말한 단지 문자의 배열입니다, 그래서 이것은 완전히 합법적이다. 하지만 그만큼 물론이다 당신은 16, 고정 된 크기를 확인합니다. 따라서이 프로그램은 완전히 안전, 내가 입력 한 경우 한 문자열에서 두 개의 문자 문자열, 15 문자열. 하지만 최대한 빨리 16 입력을 시작, 17, 18, 1000 문자열, 여기서 해당 문자열이 끝날까요? 그것은 부분적으로 여기에서 끝낼거야. 그러나 누가 어떤 다른 알고 경계를 넘어 이 특정한 배열의? 나는했습니다 것처럼 그것은이다 여기에 16 상자를 선언했다. 그래서 모든 16을 그리는 것이 아니라, 우리는거야 그냥 16를 그려 놨 척. 하지만 다음 문자열을 읽으려고하면 즉, 50 자처럼, 더 이상이다, 나는 퍼팅을 시작하려고 해요 A, B, C, D, X, Y, Z. 그리고 이것은 아마도입니다 다른 메모리 세그먼트 즉, 다시 발생할 수 있습니다 내 프로그램이 충돌합니다 나는 요구하지했기 때문에 단지 16 바이트보다 더 아무것도. 그래서 무슨 상관이야? 음, 여기 CS50 라이브러리입니다. 그리고 대부분의 단지입니다 맨 위로 지침 등을들 수있다. CS50 라이브러리, 모든 시간, 라인 (52)이 선을했다. 우리는 형식 정의 본, 또는 한 당신은 typedef를 볼 수 있습니다 단지를 생성하여 pset 사에 동의어 문자 별 이상이 될 수있다 단순히 문자열로 함. 그래서이 중 하나입니다 몇 훈련 바퀴 우리는 후드 아래에 비밀리에 사용했습니다. 한편, 여기에서는 GetChar 함수입니다. 이제 분명히, 여기에 시체가 없습니다. 그리고 사실, 나는 계속하는 경우 스크롤, 사실은 그렇지 어떤 구현을 참조 이러한 기능. 전성 검사로서, 그 이유는? 청중 : [들리지]. 데이비드 J. 마란 : 그래. 그래서이 헤더 파일입니다. 그리고 헤더 파일 프로토 타입을 포함, 에 몇 가지 다른 것들, 그것은 보인다 형식 정의 등을들 수있다. 그러나 CS50.c, 우리는했습니다있는 무조건 당신을 준 적이, 하지만 CS50 어플라이언스에왔다 모든 이 때, 깊은 그 폴더 안에 전체 발견 할 수있을 여기에 기능을 무리. 사실, 이제 아래로 스크롤 할 수 있습니다. 의 지금은, 대부분 무시하자. 그러나 getInt는 아래로 스크롤 및 getInt와 작동 방법을 참조하십시오. 그래서 여기의 getInt입니다. 혹시 정말 딸이 걱정된다면 어떻게 얻을 INT, 여기에 작동 설명서입니다. 그리고 무엇보다도 그것은 당신을 알려줍니다 말한다 값의 범위가 반환 할 수있는. 그것은 본질적으로 부정적 2000000000 긍정적 인 2,000,000,000로 제공하거나 걸릴. 그리고이 모든 것이 밝혀 시간, 우리는 한 번도에도 불구하고 당신이 그것을 확인했다, 뭔가 잘못되면, 모든 것이 밝혀 이번에는의 getInt에는 특별한 반환 된 , 널 (null), 일정하지 오히려, 이는 INT_MAX 다만 프로그래머의 규칙. 그것은 여기에 의미 특수 값입니다. 그냥이 있는지 확인하십시오 경우에 뭔가 잘못 간다. 그러나 우리는 귀찮게 적이 지금까지 그와 함께, 또,이 때문에 단순화하기위한 것입니다. 하지만 어떻게 getInt는 구현됩니까? 음, 한, 그것은 인수를 사용하지 않습니다. 우리는 알고있다. 그것은 int를 반환합니다. 우리는 알고있다. 그래서 어떻게 후드 아래에 작동합니까? 그래서 분명히 무한있다 루프, 적어도 하나의 등장. 우리가있는 getString을 사용하는 것을 알 수 있습니다. 그래서 재미있다. 의 getInt 우리 자신의 기능, getString에 호출합니다. 그리고 지금 왜이 경우 될 수 있을까요? 이유는 방어라고 할 수 있죠 한 줄에 165? 어떤 라인에 일어날 수 164, 그냥 명확하게하는 방법? 그것은 이전과 같은 대답입니다. 단지 메모리가 부족 될 수 있습니다. 뭔가, getString에로 잘못 우리는 그것을 처리 할 수​​있어. 그리고 그 이유는 내가 널 (null)는 반환하지 않습니다 즉, 기술적으로, 널 포인터이다. 의 getInt는 int를 반환합니다. 그래서 임의로했습니다 본질적으로, 결정 2000000000 있다는 것입니다이나 걸릴 부여 특수 값이 될 것을 나는 결코 할 수 실제로 사용자로부터 얻을. 내가 갈거야 단지 하나의 값이다 에러 코드를 나타내는 데 낭비. 그래서 지금 상황이 조금 공상을 얻을. 그리고 그것은 아주 동일한 기능이 아니다 이전과 같이, 그러나 비슷한데. 그래서 라인에, 여기 선언, 주목 172, 정수 n을 입력하고 문자 (c)과 함께. 그리고 나는이 펑키 줄을 사용 알고 보니 sscanf에서, 키보드에서 문자열을 검색하지 않습니다. 그것은 기존의 문자열을 의미하는 사용자가 이미 입력했다. 그래서 이미있는 getString을 호출하는 I 메모리에 문자열을 의미합니다. sscanf에서는 당신이 좋겠입니다 구문 분석 함수를 호출합니다. 그것은 내가 지금 문자열 본다 , 문자로, 문자의 입력 그리고 무엇인가 유용한 기능을 실행합니다. 즉, 캐릭터 라인에 저장됩니다. 그리고 나는 단지로가는 것을 알고있다 OK, 오, 여기 말하는 백업, 못의이 시간 만 줄이라고 불렀다. 그리고 지금이 약간 다릅니다. 그러나 이것은 효과적으로 이유로 수단 우리는 다소, 오늘에 우리의 손을 흔들 것이다 우리는에 체크되어 있는지 에 사용자가 입력 한 경우 참조 와 int는 아마 다른 문자. 사용자가 정수에 입력 한 경우입니다 난 때문에 갈은 N에 포함 할 수 주소로이를 전달 오늘 우리가 본 적이 새로운 마술. 사용자는 또한 입력 한 경우 같은 123x에서, 그 X 를 끝낼 것입니다 문자 c의 편지입니다. 지금은 그 sscanf에서 밝혀 지능적으로, 저를 말할 것이다, 얼마나 많은 변수 위해 sscanf했다 채울 성공적으로 수. 이 논리에 의해, 경우에 따라서 기능 나는, 나 getInt입니다 구현하고있어 하지만 난 알아보고 있어요, 잠재적으로, 사용자 INT에 입력 한합니다 뭔가 다음에, 내가 sscanf를 년대 싶어 반환 값은 진정 될? 목적은 얻을 경우 단지 사용자의 INT? 그래서 sscanf를 반환하는 경우 이, 그게 무슨 뜻 이죠? 사용자는에 입력 뭔가 같은, 말 그대로, 그냥 말도 123x. 이는 에러 상태이고, 그 확인하고 싶다. 그래서이있는 경우 사용자 유형에 의하여 이 논리 반환 sscanf에서 무엇을하는지, 당신은 말을? 그래서 때문에 2를 반환 할 것 (123)는, 여기에 갈 것입니다 그리고 X는 여기에서 생을 마감 할 것이다. 하지만 X가 가득하고 싶지 않습니다. 난 단지에서 성공하기 위해 sscanf 할 그 변수의 제 작성. 그리고 그 이유 I sscanf에서 1을 반환하려면. 그리고이 머리 위에 비트 인 경우 순간, 그건 완전히 괜찮아요. 하지만 그 일을 실현 getInt는과에서 getString 값 우리의 지옥을하고있는 것입니다 이과 같이 오류 검사의 많은 즉, 지금까지, 당신은 꽤 많은 수 키보드에서 아무 것도 입력, 우리는 그것을 잡을 것입니다. 그리고 우리는 확실히 직원이 아닌은 확실히 의 버그의 원인이 될 당신의 프로그램, 우리는 수비에있어 때문에 바보의 모든 검사 사용자가 할 수있는 일, 때 문자열을 입력하는 등의 당신은 정말 INT를 원했다. 그래서 우리는 올 거 아니예요에 대한 다시이에 long-- 전 하지만이 모든 시간, 있는 getString과의 getInt는이 이것을 이용하여 후드 밑이었다 메모리 주소의 기본 개념. 그래서 지금의 일을 만들어 보자 사용자 친화적 조금 더. 당신은 빙키 마지막에서 호출 할 수 있습니다으로 외엔 내 마우스가 너무 cooperate-- 경우 우리는이 코드를 가지고있는 솔직히 상당히 무의미하다. 이 코드는 아무것도 달성하지 유용하지만, 예였다 그 교수 Parlante 표현하기 위해 사용 무슨에 무슨 일이 있었 메모리를 포함하는 프로그램입니다. 그래서이 작업을 되풀이하자 이야기 슈퍼 잠시. 이러한 처음 두 줄에 영어, 당신은 무엇을, 말을합니까? 그냥 합리적 인간, 그러나 약간의 기술 용어는 자상을. 청중 : [들리지]. 데이비드 J. 마란 : OK, 당신은 설정하고 당신의 X와 Y 변수의 주소. 확실히, x와 y는되지 않기 때문에 전통적인 의미의 변수. X 및 Y는 어드레스 아르 또는 주소를 저장합니다. 그래서이 한 번 더 시도 할 수 있습니다. 나쁜 시작하지만. 그래? 청중 : [들리지]. 데이비드 J. 마란 : 좋은. 그 조금 청소기 생각합니다. 이 포인터, 두 개의 정수를 선언. 그리고 우리는 그들에게 X와 Y를 호출하고 있습니다. 아니면 우리가 인 경우에 그립니다 이 그림으로, 다시 아주 간단하게 모든 기억 우리는 그 첫 번째 줄에하고있는 이 같은 상자를 끌고있다, 그것에 일부 쓰레기 값, 한 다음 x를 호출하고, 이 같은 또 다른 상자 일부 쓰레기 값 거기에, Y를 호출. 우리는이 선언 한 포인터가 궁극적으로 int 형의 주소를 저장합니다. 그래서 모든있다. 빙키 이런 짓을 그래서 때, 점토는이처럼 보였다. 그리고 닉 그냥 가지 화살표를 싸서 비록 그들은 어디를 가리키는하지 않을 특히 때문에 그저 쓰레기 값. 그들은 명시 적으로 초기화하지 않을 어디 특히. 지금의 다음 행 코드, 리콜이이었다. 합리적으로 사용자 친화적 너무 하지만 다소 기술적 인 영어, 코드가 수행하는이 라인은 무엇입니까? 그래? 청중 : [들리지]. 데이비드 J. 마란 : 완벽 한. 이 청크를 할당하는 것 int 형의 크기의 메모리. 그리고 그 절반 대답이야. 당신이 바로 그 대답 식의 절반입니다. 무엇에 무슨 일이 일어나고 등호의 왼쪽? 그래? 청중 : 그리고 양수인 그 변수 x에? 데이비드 J. 마란 : 그리고 양수인 그 변수 x에. 요점을 되풀이하다, 오른쪽의 할당에 따라서 메모리가 부족 int를 저장합니다. 하지만 malloc을 구체적으로 주소를 반환 당신이했습니다 메모리의 청크의 그냥 X에 저장됩니다 제안했다. 그래서 닉 빙키와 함께 지난 시간에했던 것은 그가 그 포인터를 끌고, 점토 메모리의 흰색 덩어리에서 지금 가리 그 int 형의 크기와 같습니다. 그리고 실제로 그 의미가 있어요 4 바이트를 나타냅니다. 코드 이제, 다음 행 이했다, 스타 X 42을 가져옵니다. 그래서 42에 간단합니다 오른쪽, 삶의 의미. 왼쪽 편은, 스타 X는 무엇을 의미? 괜찮아 gone-- 그것도있을 수 있습니다. 확인을 클릭합니다. 대상 : 기본적으로, [INAUDIBLE]로 이동 데이비드 J. 마란 : 좋은. 청중 : [들리지]. 데이비드 J. 마란 : 그렇지. 왼쪽은 X로 이동을 의미한다. X는 주소입니다. 그것은 33 옥스포드 스트리트 (Oxford Street), 또는 OX1 같아요. 그리고 스타 X는로 이동을 의미 해결하고 무엇을 거기에 넣어? 42. 그래서 사실은, 그 닉이 한 정확히입니다. 그는에 의해 시작 본질적으로, 정신적으로 손가락으로 가리키는 X, 화살표 다음 오른쪽에있는 흰색 상자에 측면, 그리고이 숫자 42을 넣어. 하지만 일이있어 약간의 위험, 맞죠? 빙키의 머리를 잃게. 스타 Y는 무엇을 의미, 13, 불운 같다? 그래서 스타 Y 수단을 y 주소로 이동합니다. 그러나 Y의 주소는 무엇인가? 좋아, 그것은 쓰레기 값, 안그래? 나는 물음표로 그렸습니다. 닉은 웅크 리고 화살표로 그렸습니다. 그리고 가능한 빨리 시도로 거기에 가지 말, 스타 Y를 수행 하지만, 합법적이 아닌 주소가 어떤 가짜 위치이야 프로그램이 충돌하는 것입니다. 그리고 빙키의 머리는 것입니다 이 그랬던 것처럼, 여기에 날아합니다. 결국,이 프로그램에 따라서 그냥 플랫 아웃 결함이었다. 그것은 버그가 프로그램이었다. 그리고 그것은 고정 될 필요가 있었다. 그리고 유일한 방법은, 정말, 그것을 해결하기 위해 것, 예를 들어,이 라인, 우리는 심지어에 도착하지 않았다 때문에 이 프로그램은 너무 빨리 추락했다. 그러나 우리는이 문제를 해결한다면, 무엇을 효과는 Y와 동일한 x는이 일을합니까? 음, 기본적으로 y에 포인트 어떤 값 X 가리키는. 닉의 이야기 그래서, 또는 빙키의 이야기, 모두 x와 y를 가리키는했다 메모리의 흰색 덩어리 그래서, 마지막으로, 때를 y는 다시 13에 해당 스타 않습니다, 당신은 13을 가하고 결국 적절한 위치. 그래서 모든 줄이 완벽하다 합법적 인,이 일을 제외하고, 그것은 전에 일어 났을 때 실제로 Y 몇 가지 값을 할당. 이제 다행히도, 당신은하지 않습니다 모든 통해 추론해야 자신에 대한 이러한 종류의 문제의. 내가 가서 풀어 보자 여기에 터미널 창 최대 단지 잠시, 문 열어, 슈퍼 쇼트 프로그램이 또한 종류의 무의미. 그것은 추한. 유용 아무것도 달성하지 않습니다. 그러나 문제를 보여 않습니다 메모리, 그래서 살펴 보자. 주, 슈퍼 간단. 그것은 분명히 함수를 호출, F는 다음 0을 반환합니다. 그것은 엉망이 최대로 가지 어렵다. 그래서 메인은 지금까지 아주 좋은 것입니다. 따라서 F는 문제가있다. 그리고 그냥 많이 넣지 않았다 그것을 이름에 노력 여기에서, 코드에 초점을 유지한다. F는 두 줄이 있습니다. 그리고의 지금 무슨 일이 일어나고 있는지 볼 수 있습니다. 그래서 한편 이곳에 나를 만들어 보자 이전이 일치 한편 example--, 왼쪽은 영어에서 일을? 이 놈은 ... 청중 : 포인터를 작성. 데이비드 J. 마란은 : 포인터 만들기 int로 및 호출이 X. 그래서 그 상자 중 하나를 만드는 것 나는 터치 스크린에 그리기 계속. 그리고 지금, 오른쪽에 측의 malloc 물론 메모리 청크를 할당한다. 그리고 단지 명확하게하는 방법 많은 메모리는 분명히이다 할당, 당신이 경우 단지 가지 여기에 수학을? 그래서 40 바이트입니다. 그리고 내가 알고 내가 알고 때문 중간, CS50 어플라이언스, 적어도, 4 바이트이다. 그래서 10 배 4는 40이다. 그래서 이것은 X를 저장하고, 주소 40 정수의 첫번째 아웃의 다시 공간을 할당 된, 뒷면에, 백업하려면 백업합니다. 그리고 그 malloc에​​ 대한 주요 것이죠. 그것은 약간의 메모리를 고려하지 않습니다 여기, 여기 조금, 조금 여기. 그것은 당신에게 메모리의 청크를 제공합니다 연속적으로 운영에서 시스템. 이제 이것에 대해 무엇을, X 브래킷 (10)는 0에 해당? 코드의 임의의 라인입니다. 유용 아무것도 달성하지 않습니다. 하지만, 재미있다 X 브래킷 10-- 때문에? 그래? 청중 : [들리지? 데이비드 J. 마란 : X 브래킷 열은 널 (null) 일 필요는 없습니다. 널 (null)의 세부 사항을 게임에 제공 문자열, 문자열의 끝에. 하지만 좋은 생각. 얼마나 큰 것은도,이 배열이다 나는 40 바이트를 할당했습니다 불구하고? 그것은 바로, 구를 통해 공입니까? 그것은 총 10 정수를합니다. 40 바이트 만 10 정수, 공을 통해 공을 색인. 그래서 X 브래킷 (10)는 무엇인가? 그것은 사실입니다 일부 알 수없는 쓰레기 값입니다. 그것은 나에게 속하지 않는 메모리입니다. 나는 것을 만지지 수 없습니다 바이트 번호 41, 42, 43, 44. 나는 너무 멀리 약간거야. 그리고 실제로, 나는 실행하는 경우이 프로그램을 아주 잘 충돌 할 수 있습니다. 하지만 가끔은, 우리는 운이 좋은거야. 그래서 그냥 보여주기 위해 이 항아리 솔직히, 당신은 당신이 전에 결코 알지 못할 이게 뭐지의이 작업을 실행할 수 없습니다. 실제로 충돌하지 않았다. 그러나 나는이를 변경하는 경우 인스턴스는, 1000처럼되고 정말 만들려면 신중하고 보자 우리가 얻을 수있는 경우이 시간을 충돌합니다. OK, 그것은 충돌하지 않았다. 어떻게 100000 어떻습니까? 현실을 리메이크하자, 지금을 다시 실행하십시오. 확인을 클릭합니다. 휴. 좋아. 그래서 분명히 다시,이 메모리의 세그먼트는, 그래서, 말하자면 그래서 우리가 할 수있는 합리적으로 큰 아르 또 다시 운. 하지만 결국, 한 번 당신은 비웃음 정말 화면에 멀리 이동 당신은 그 정말 메모리를 만지지 정말 당신에 속하지 않습니다. 하지만 솔직히,이 버그의 종류 가고있다 힘들어 할 수 스스로 알아 내야합니다. 그러나 다행히도, 프로그래머, 우리는이 우리가 우리를 위해이 작업을 수행 할 수있는 도구. 그래서 이것은 아마, 하나 추악한 프로그램, GDB의 출력보다 못 생겼어. 하지만 항상 선이 나 슈퍼 유용 이아르. Valgrind의 도움 프로그램입니다 사용자가 프로그램을 디버깅 할, 그 자체 그러나 메모리 관련 발견 문제, 특히. 그것은 자동으로 코드를 실행합니다 당신은 적어도 두 가지를 찾습니다. 하나, 당신이 뭔가를 짓 터치 메모리와 같은 실수 그게 당신에 속하지 않았다? 그것은 당신이 이런 경우를 찾는 데 도움이됩니다. 그리고이, 그것은 도움이 될 것입니다 당신은라는 것을 발견 메모리 누수, 우리가 완전히 무시, 순진, 약간의 시간과 행복하게. 그러나 모든 밝혀 이 때, 때마다 당신이있는 getString에서 호출 한 우리의 프로그램의 많은, 당신은 운영을 요구하고 메모리 시스템, 하지만 당신은 어떤 기억을 가지고 의 이제까지 그것을 제공 다시 일을 unalloc 또는 무료,이 호출로. 아니, 때문에 우리는 한 번도 그렇게하기를 요구했다. 그러나이 모든 시간, 프로그램 당신은 C로 작성했습니다 메모리가 누수되고, 운영 요청 더 이상 시스템 문자열과 이것 저것 메모리, 하지만 다시 전달하지 않습니다. 그리고 지금이 비트입니다 지나친 단순화의, 그러나 당신이 이제까지했습니다 경우 것이 Mac을 실행하거나 꽤 많은 시간, 열기 위해 사용자의 PC 많은 프로그램, 어쩌면, 프로그램을 닫 그리고 비록 당신의 컴퓨터가 추락하지 않았습니다, 그것은, 너무 느린지고있어 정말 비록로 많은 메모리를 사용하거나 자원에도 불구하고, 당신이하지 않으면도 키보드를 만지고, 그건 나중에 ...하지만 always-- 수 있습니다 프로그램이 실행중인 것을 수 스스로 메모리 누수가 있습니다. 그리고 그들은 더를위한 OS 질문을 계속 더 많은 메모리,하지만 그것에 대해 잊고, 실제로는, 사용하지 않을 수 있지만 따라서 멀리 메모리를 복용 그것을 할 수있는 다른 프로그램에서. 그래서 일반적인 설명입니다. 지금 여기 어디 Valgrind의의입니다 출력은 완전히 그 이하로 극악한 그리고 모두 더 편안하게. 하지만 흥미를 물건은 바로 여기까지입니다. 이 날의 잘못된 기록을 말하고있다 네 크기는,이 프로그램에서 일어나는 특히, memory.c에 라인 (21). 나는 흠,이 사실은, 21 행으로 이동하는 경우 크기 네의 잘못된 기록이다. 이유는 크기 네? 음,이 번호도하고 증거를 없애 될 수하는 정수입니다. 그래서 4 바이트입니다. 그래서 4 바이트를 걸었습니다 그들은 어디에서 속하지 않습니다. 즉, 어떤 Valgrind의이야 실제로 저를 말하고있다. 게다가, 그것은 또한 것 우리가 볼 수 있습니다로 말해, 당신이 미래의 pset에서 실행으로, 경우 및 당신은 참으로 메모리를 유출했을 때 나는라고했기 때문에 나는이 malloc을하지만 실제로하지 않은 자유,이 경우라고 저희는 결국 볼 수 있습니다 malloc에​​의 반대입니다. 그래서 지금은, 마지막 예제를 생각합니다. 그래서이 일이 조금 더 비전하지만 아마도 야 가장 큰 이유 메모리에주의 그리고 이유는 그 많은 프로그램 심지어이 일에 / 또는 웹 서버, 어딘가에 나쁜 놈들에 의해 점령된다 인터넷에 어떻게 든 누구 서버에 가짜 패킷을 전송 계정을 손상 노력 또는 데이터를 가지고, 아니면 그냥 일반적으로 기계를 인수. 버퍼 오버 플로우로 이름이 제시 수단 int가 아닌,하지만, 버퍼 오버 플로우. 그리고 버퍼는 멋진 방법입니다 말하는 이는 메모리의 무리입니다. 그리고 실제로, 나는 문자열이라고 대신의의 버퍼 전에. 이 버퍼의 경우 때문에, 유튜브 의미에서처럼, 또는 동영상을보고있어 언제, 당신은 단어 버퍼링을 볼수있을 것이다, 점, 점 점. 그것은 매우 짜증나. 그리고 그것은 단지 의미 비디오 플레이어가 많은 다운로드를 시도한다 바이트 바이트, 많은 인터넷에서 동영상에서. 하지만 느린, 그래서하려고 그들의 무리를 다운로드 그래서 버퍼, 컨테이너를 채우는 당신은 그 다음 할 수있는 충분한 바이트가 당신에게 비디오를 보여 지속적으로 일시 정지하지 않고. 그러나 그것은 당신이 할 수있는 밝혀 이 큰에 버퍼를 가지고있다. 그러나이 많은 데이터를 넣어 시도 그것은, 매우 나쁜 일이 일어날 수 있습니다. 예를 들어 자, 살펴 보자 일례의 마지막 티저. 이것은 또 다른 프로그램입니다 즉, 첫눈에, 슈퍼 유용한 아무것도하지 않습니다. 그것은 주요 기능을 가지고있다 즉, F, 그 함수를 호출합니다. 그리고 그 함수 f를, 여기까지,이 문자 배열은, 크기 (12), C했다. 그리고, 그것은이를 사용하고 새로운 기능의 strncpy를했다. 그것은,이 간단한으로 밝혀 코드의 간단한 라인, 두 라인, 우리는 내 전체 프로그램을 만들었습니다 따라서, 내 전체 컴퓨터, 내 사용자 계정 및 내 하드 사람에게 잠재적으로 취약한 드라이브 누가 알고 실행하는 데 충분 특정 명령 줄 프로그램 인수. 즉, 만약이 나쁜 사람 입력하여 argvargv [1]의 내부에 둔다 키보드 매우 특수하게 조작 된보기에서 문자열이 아닌 abc 방송, 123, 그러나 본질적으로, 실행 나타내는 이진 기호 코드, 그 또는 그녀가 쓴 프로그램 이다이 간단한 프로그램과 프로그램의 수천의 대표 즉, daresay 마찬가지로 취약 그 또는 그녀는 궁극적으로, 전체 삭제 기능을 사용할 수 있습니다 내 하드 드라이브에있는 파일은 얻을 그 또는 그녀가 할 수 있도록 프롬프트를 깜박 자신에 명령을 입력 자신에게 모든 파일을 전자 메일을 보내주십시오. 내가 할 수있는 건, 그가 또는 그녀는이 코드를 수행 할 수 있습니다. 우리는 아직은이 문제를 해결하지 않을 것이다. 그리고 사실, 그것은에 무슨 작은 그림을 포함 이런 식으로, 우리는 곧 올 거하는 모두가 더 잘 이해합니다. 그러나 오늘,의가 종료하자 , 조금 더 희망, 무엇을 이해할 수 XKCD 농담, 우리는 다음 시간을 재개 할 때까지. 좋아. 수요일에 당신을 참조하십시오. [음악 연주] 스피커 : 그리고 지금, 깊은 Daven 판햄으로 생각. 메모리의 더미로 점프처럼 일요일 오후에 황금 나뭇잎. 바람 불고, 요동 당신의 오 hair--, 나는 일 먼저 ... 그리워 [웃음]