[음악 재생] [비디오 재생] - 그는 거짓말. 무엇 대략 125? - 난 몰라. 우리는 무엇을 알 수 있습니까 - 그래서? 9시 15분, 레이에 - 그건 산토는 ATM에 있었다. - 네. 그래서 질문은, 무엇을 그는 9:16에서 일을했다? 뭔가 9mm를 -Shooting. 어쩌면 그는 저격수를 보았다. - 아니면 그와 함께 작업했다. 잠깐. 다시 한 이동합니다. - 무슨 볼 수 있습니까? 전체 화면으로 그의 얼굴을 데려 오라고. - 그의 안경. 반사 저기입니다. - 그것은 Nuevitas 야구 팀이다. 즉, 자신의 로고입니다. - 그리고 그는에 얘기 누구든지 그 재킷을 입고있다. [END 재생] 데이비드 마란 : 좋아. 이 CS50이며,이 조금 더 의 [들림]있는 당신이있어 문제를 취미 삼아 네 가지를 설정합니다. 오늘 우리는 더 조금보고 시작 깊이 포인터라고 이런 일에, 그것이 비록 한 꽤 난해한 주제, 그것이 무슨 밝혀 수단이 될하는 우리 건설 및 조립을 시작할 수 있습니다 훨씬 더 정교한 프로그램. 그러나 우리는 지난 수요일에 그것을했다 우선 몇 가지 클레이 메이션의 방법으로. 그래서이, 리콜이며, 빙키 우리는 그를 사용 프로그램을 살펴보고 그 정말 아무것도 재미하지 않았다, 하지만 몇 가지 문제를 공개했다. 그런데 왜 우리가 걷지 않는다, 오늘을 시작합니다 빨리 다음 단계 중 몇 가지를 통해, 인간의 용어로 증류하려고 정확히 여기에 무슨 왜이 나쁜, 다음에 이동 실제로 무언가를 구축 시작 이 기술? 따라서 이러한 제했다 이 프로그램에 두 줄로 그리고 시민들의에서 무엇을 이 두 라인은 뭐하는거야? 합리적으로 편안 사람 어떤 화면에 선언 한 것으로? 일이 두 라인은 무엇입니까? 그것은 모두가 아니다 그 주와는 다른, 하지만 몇 가지 새로운 특수 기호가있다. 그래? 다시 거기. 청중 : 포인터를 선언? 데이비드 마란은 : 다시 말? 청중 : 포인터를 선언? 데이비드 마란 : 선언 포인터와 이제 조금 더를 수정 할 수 있습니다. 청중 : [들리지] 주소 X와 Y를. 데이비드 마란 : 그리고 해결합니다. 그래서 특별히 우리가 무슨 일을하는지 우리는 두 개의 변수를 선언되어있다. 이러한 변수는하지만,가는거야 int 형 스타,이어야 할 더 구체적으로 의미 그들은 저장하는거야 INT의 주소, 각각 x 및 y. 이제 어떤 값이 있습니까? 이들의 실제 주소가 있습니까 이 시점에서 두 변수? 아니. 그냥 쓰레기 값을 소위입니다. 당신은 실제로 할당하지 않는 경우 RAM에 있었다 어떤 변수 이전에 제로로 채울 것입니다 그리고 사람들이 변수 모두. 그러나 우리는 아직 모른다 무엇이며 그건 왜 빙키의 열쇠가 될 것 지난 주 그의 머리를 잃었다. 그래서이 클레이 메이션했다 이것의 화신 이에 당신은 단지 두 개의 변수를 가지고, 점토의 작은 원형 조각, 그 변수를 저장하지만, 같은 수 있습니다 싸서 화살표 제안 그들은 실제로 가리키는하지 않을 아무 곳이나 공지. 그래서 우리는이 라인을 가지고 있었고,이 메모리이었다 새로운 지난 주, malloc에 단지 멋진 방법입니다 할당, 운영 체제를 말하고, 리눅스 또는 Mac OS 또는 Windows, 이봐, 나에게 약간의 메모리를 제공, 당신이해야하는 것은 말할 운영체제 메모리를 요구하는 경우 것입니다. 그것은 무슨 상관 없을거야 당신이 함께 할거야 하지만 당신은 운영 말할 필요합니까 무엇의 malloc의 방법으로 시스템. 그래? 청중 : 얼마? 데이비드 마란 : 얼마? 얼마나 많은 바이트 등이, 다시, 인위적인 예, 그냥, 말하고 나에게 INT의 크기를 제공합니다. INT의 지금, 크기 4 바이트 또는 32 비트입니다. 그래서 이것은 단지 방법입니다 말, 헤이, 운영 체제, 나에게 4 바이트의 메모리를 제공 내 처분에 사용할 수있는, 구체적으로 무엇을 수행 대한 malloc에​​ 반환 4 바이트의 덩어리로? 청중 : 주소? 데이비드 마란 : 주소. 4 바이트의 덩어리의 주소입니다. 정확히. 그리고 그것은 궁극적으로 저장된 무엇 우리가 정말하지 않는 이유는 X와 그이다 관심 무슨 수 이 OX1 또는 OX2 여부 주소이며, 또는 일부 애매한 진수 주소입니다. 우리는 단지 그림으로 관심을 그 변수 x가 지금 그 메모리의 덩어리를 가리키는. 따라서 화살표 포인터를 나타내고, 또는 보다 구체적으로, 메모리 주소. 그러나 다시, 우리는 일반적으로 상관 없어 그 실제 주소는 무엇인지. 자,이 라인은 말한다 무엇 쉽게 설명하자면? 스타 X 42 세미콜론을 가져옵니다. 이것은 무엇을 의미 하는가? 당신은 가고 싶어? 당신의 목을 긁지 마세요. 청중 : X의 주소는 42입니다. 데이비드 마란 : X의 주소는 42입니다. 꽤하지 않습니다. 너무 가까이,하지만 확실히,이 때문에 이 X 접두어 년대 스타. 그래서 우리는 조금 조정할 필요가있다. 그래? 청중 : 값이 포인터 X는 42입니다 가리키는있다. 데이비드 마란 : OK. 포인터가 있음 X 값 42 일,의 말할 수 있도록해야한다 가리키는 또는, 스타 달리 말하면 X는 어떤 주소로 이동 말한다 은 1 옥스포드 여부, X에 거리 또는 33 옥스포드 스트리트 (Oxford Street) 또는 OX1 또는 ox33, 어떤 숫자 주소입니다 스타 X는 x의 역 참조입니다. 그래서 그 주소로 이동 다음이 숫자 42을 넣어. 그래서 것 그 말의 동등한 방법. 그래서 모든 괜찮아요 다음 우리는 이미지를 나타내는 것 다음과 같이 우리는 추가 한 경우 네의 덩어리로 (42) , 오른쪽에 바이트지만 상황이 틀려서 갔던 곳이 줄을이었다 와 빙키의​​ 머리가 튀어 이 시점에서 해제, 나쁜 일 때 발생하기 때문에 당신이 쓰레기 값을 역 참조 잘못된 역 참조 당신이나 포인터는, 내가 잘못 말 때문에이 시점에서 이야기 Y 안에 무엇인가? 기반 Y의 값은 무엇인가 지난 몇 단계에? 그래? 그게 뭔데? 청중 : 주소. 데이비드 마란 : 주소. 이 주소 여야합니다 하지만 난 그것을 초기화가? 그래서 나는 아직하지 않았습니다. 그래서 거기에 무엇을 알고 있는가? 그것은 그냥 쓰레기 값입니다. 그것은 0에서 어떤 주소가 될 수 20 억이 RAM의 두 기가있는 경우, 제로 4000000000에 당신은했습니다 경우 RAM의 사기가바이트을 얻었다. 그것은, 일부 쓰레기 값이다 그러나 문제는 운영체제 것을 그것은 당신을 제공하지 않은 경우 메모리의 덩어리 특히 당신이 이동하려는 것으로, 그것은 일반적으로 무엇을 일으킬 것 우리는 세그먼트 오류로 보았다. 그래서 사실, 당신의 어떤이있는 사람 근무 시간의 문제에서 고생 또는 문제가 그 더 일반적으로 알아 내려고와 세그먼트 오류, 즉, 일반적으로 의미 당신의 세그먼트를 만지고있어 당신이 안 메모리. 당신은 메모리를 접촉하고 그 운영체제 않았습니다 그것의 여부, 당신이 만져 허용 배열에서 너무 멀리 이동하여 여부, 이제 시작 당신이 접촉하고 있기 때문에 그것은이다 그냥 쓰레기 값 메모리. 그래서 여기에 스타 X이다하고 정의되지 않은 동작의 종류. 당신은 그것을 확률 때문에 결코한다 프로그램이 바로 충돌 것있다, 당신이 말하는 것 때문에, 이 주소로 이동 그리고 당신은 아무 생각이 곳이 없다 그 주소는 사실이다. 그래서 운영체제 가능성 프로그램을 중단 예정 그 결과 실제로으로, 그건 무슨 일이 빙키에이 일어났다. 그래서 궁극적으로, 빙키는 고정 이이 문제. 이 프로그램 그래서 그 자체가 결함이되었다. 하지만 당신은 종류의 점진 경우 대신이 줄을 실행, Y는 X와 동일한 의미대로 주소가 x는, 또한 Y에 넣어. 그리고 그림으로, 우리는했습니다 두 개의 화살표와 함께이 대표 X로부터 Y 좌표에서 같은 장소에. 그래서 의미, X는 동일 Y에 그 모두 때문에 동일한 저장되고 주소, ERGO 42 가리키는 그리고 지금, 때 당신은 별을 말한다 Y는 Y에있는 주소로 이동 이것은 흥미로운 부작용을 갖는다. 따라서 Y의 주소 인 X에있는 주소와 같은 일. 그래서 만약 당신이 주소로 이동 말 와 y에 13 값을 변경, 누가 다른 영향을 받습니까? X는 점 D, 그래서, 말을하는 것입니다 뿐만 아니라 영향을해야합니다. 그리고 실제로, 방법에게 닉이 그림을 그린 클레이 메이션에 정확히이었다. 우리는 포인터를 따라해도 Y는, 우리는 같은 장소에 종료 그래서 우리는 인쇄 할 수 있다면 X 또는 Y의 pointee 아웃, 우리는 13의 값을 볼 것입니다. 지금, 나는 pointee가 될 말 비디오와 일치. 프로그래머, 내 지식, 결코 실제로 단어 pointee 말, 뾰족 것을 에서, 그러나 일관성을 위해 비디오, 실현 그이었다 모두의 그 상황에서 의미했다. 클레이 메이션에 따라서 질문 또는 포인터 또는 malloc에​​ 아직? 아니? 괜찮아. 그래서 더없이 ADO, 이제 살펴 보자 이 실제로이 곳에서 일정 시간 동안 사용되었다. 그래서 우리는이 CS50 라이브러리를 했어 즉, 이러한 모든 기능을 가지고. 우리는,의 getInt를하여 GetString을 많이 사용했습니다 아마 이전 GetLongLong 내 PSET에 하나 정도,하지만 실제로 무슨 일 됐어요? 음, 잠깐 살펴 보자 프로그램에서 후드 아래에 그 우리는 당신이 CS50 줄 왜 고무 도서관, 참으로 지난 주와 같은, 우리는 사람들을 복용하기 시작 훈련 바퀴 끕니다. 그래서 지금 정렬 의 사후의 어떤 이 일 된 CS50 라이브러리 내부, 우리는 지금 움직이기 시작한다하더라도 멀리에서 대부분의 프로그램. 그래서이 0는 scanf라는 프로그램입니다. 그것은 매우 짧다. 단지 이들 라인이 있지만 라는 함수는 scanf를 소개합니다 우리는 사실에서 볼 거라고 CS50 라이브러리 내부의 순간, 약간 다른 형태이기는하지만. 라인 (16)에 따라서이 프로그램 변수 x를 선언한다. 그래서 나에게 인터넷 용 4 바이트를 제공합니다. 그것은 사용자를 말하고있어 수하십시오, 다음 이 흥미로운 라인입니다 실제로 지난 주 함께 묶어 이. scanf와 다음은 소요 알 형식 문자열, 그냥 printf와 같은, % 내가 int를 의미하고, 그것은 소요 조금 보이는 두 번째 인수 펑키. 그것은 앰퍼샌드 X, 그리고 리콜, 우리는이 한 번 지난 주 보았다. 앰퍼샌드 X는 무엇을 상징 하는가? 앰퍼샌드는 C에서 무엇입니까? 그래? 청중 :의 주소입니다. 데이비드 마란 :의 주소입니다. 그래서 반대이다 스타 연산자, 스타의 운영자는 말한다 반면,로 이동 이 주소, 앰퍼샌드 연산자 알아낼 말한다 이 변수의 주소, 그래서이 있기 때문에 중요하다 인생에서 scanf와의 목적 사용자를 검색하는 것입니다 키보드로 입력, 무엇에 따라 그 또는 그녀 종류 및 해당 사용자의 입력을 읽어 변수로,하지만 우리 지난 2 주 보았다 그 스왑 기능이 그 우리 구현하기 쉽게 시도 단지 부서졌다. 스왑 기능으로 그 리콜, 우리가 정수로 A와 B를 선언하는 경우, 우리는 성공적으로 교체 않았다 스왑의 내부에 두 개의 변수 그냥 우유와 OJ와 같은, 하지만 스왑, 반환 마자 대한 결과가 무엇 이었습니까 x와 y에, 원래 값? 아무것도. 그래. 아무것도하기 때문에, 그 시간을 일어나지 않았다 스왑 만의 로컬 복사본을 변경 모든 말을하다 이 때, 때마다 우리가했습니다 인수 전달 된 기능에, 우리는있어 단지 그 인수의 복사본을 전달합니다. 당신은 그와 함께 할 수있는 당신이 그들과 함께 원하는대로, 하지만 그들은 더 할거야 원래 값에 영향을. 그래서이는 경우에 문제가된다 scanf와 같은 기능을 갖고 싶어 인생에서, 그 목적은 검사하는 것입니다 키보드로부터의 사용자 입력 다음에 있으므로 빈칸을 채워 말, 즉, X 같은 변수를 제공 값, 내가 있다면 때문에 단지을 scanf X를 전달하려면, 당신은 마지막의 논리를 고려하는 경우 주, scanf와는 원하는 무엇이든 할 수 있습니다 X의 사본하지만 수 없었다 우리가 제공하지 않는 한 영구적으로 X를 변경 말하자면, 보물지도를을 scanf x는 자리를 표시하는 경우, 이에 우리는 그래서 x의 주소를 전달 scanf와이 실제로 변화 갈 수 x의 값. 그리고 실제로, 모든 이 프로그램은 않는다는 것을 내 소스에 scanf와 0을 만들 경우 500 만 디렉토리, scanf와 0을, 점은 scanf와 슬래시, 수 50하시기 바랍니다, 50 주셔서 감사합니다. 그래서, 모든 관심이 아니에요 그러나 실제로 무슨 일이야 최대한 빨리 부르는 것입니다 여기에서 x의 값을을 scanf 영구적으로 변경되고있다. 자,이 좋은 보인다 좋은, 그리고에 사실, 그것을 우리가 정말 필요가없는 것 같아 모든 이상에서 CS50 라이브러리. 예를 들어, 실행하자 여기 한 번 더. 내가 초를 다시 보자. 의 숫자를 시도해 주시기 바랍니다과 대신 이전과 같은 50을 말하는, 그냥 '아니오'라고 할 수 있습니다. 좋아, 그건 좀 이상해. 그래. 그리고 여기 좀 넌센스. 그래서하지 않는 것 잘못된 상황을 처리합니다. 그래서 우리는 시작을 최소​​한으로해야 일부 오류 검사를 추가 사용자가 있는지 확인합니다 (50)처럼 실제 번호를 입력, 분명히 입력 단어 때문에 문제로 감지되지 않고, 그러나 그것은 아마해야합니다. 의는 지금은이 버전을 살펴 보자 내 시도하여 GetString을 구현할 수 있습니다. scanf와 모든이가있는 경우 기능, 내장 왜 우리는이와 취미 삼아왔다 하여 GetString 같은 교육 바퀴? 음, 여기 아마 내 자신의 에서 getString 간단한 버전 이에 주 전, 나는 말했다 수도, 나에게 문자열을 제공하고 버퍼를 호출합니다. 오늘, 난 그냥 시작하는거야 , 문자 스타, 리콜 말 그냥 동의어입니다. 그것은 무서운 보이지만이다 똑같은 일이. 그래서 나에게 변수라고 버퍼를 제공 그 문자열을 저장하는 것, 사용자 문자열을하시기 바랍니다 말해 다음, 직전처럼, 의이 교훈을 빌려 해보자는 scanf %의이 시간 후 버퍼에 전달합니다. 이제, 빠른 전성 검사. 왜 말을하고 있지 않다 앰퍼샌드는이 시간을 버퍼? 앞의 예에서 추론. 청중 : 샤아 스타 포인터입니다. 데이비드 마란 : 정확히, 이 때, 문자 때문에 스타 이미 포인터, 주소 거기 그 스타의 정의에 의해. 및 scanf가 주소를 기대하는 경우, 그냥 버퍼에 전달하는 데 충분하다. 나는 앰퍼샌드 버퍼를 말할 필요가 없습니다. 호기심를 들어, 당신은 할 수 이런 일을한다. 그것은 다른 의미를 가질 것이다. 이것은 당신에게 포인터를 줄 것이다 실제로 포인터에 C에서,하지만에 대한 유효한 것 자, 간단하게하자 일관된 이야기를 유지한다. 나는 그냥 통과 할거야 버퍼 및 그 맞습니다. 문제는 비록 이것이다. 내가 가서이 실행하자 그것을 컴파일 후 프로그램. scanf와 1을 확인합니다. 젠장, 내 컴파일러의 내 오류를 잡기. 나에게 1 초 준다. 연타. 의는 scanf와 - 1.C를 가정 해 봅시다. 그래. 우리는 거기에 갈. 나는 그것을해야합니다. CS50 ID는 여러가 구성 설정 그 자신에 대해 당신을 보호. 나는에 의해 그를 해제하는 데 필요한 수동으로 시간을 연타를 실행. 그래서 문자열하시기 바랍니다. 내가 가서 입력거야 내가 좋아하는 헬로 세계. 널 (null), 확인을 클릭합니다. 그게 내가 입력 한 내용이 아니다. 그래서 나타내는이다 뭔가 잘못되고. 내가 가서 입력하자 정말로 긴 문자열. 널에 대한 감사 모르겠어요 있다면 그것을 충돌 할 수있을거야. 의 약간 사본을 해보자 붙여 넣기이 도움이되는지 확인합니다. 그냥이 많이 붙여 넣습니다. 그것은 확실히 더 큰 평소보다 문자열입니다. 그냥 정말 쓰기 보자. 아니. 젠장. 명령을 찾을 수 없습니다. 그래서는 무관합니다. 내가 붙여 넣기 때문이다 나쁜 자, 하지만이 밝혀 작동하지 않을. 때문에의이 한 번 더 해보자 우리가 실제로 충돌하는 경우가 더 재미 있어요. 의이을 입력하자 지금은 해요 정말 긴 문자열을 복사하는 것 지금의이 있는지 확인하자 우리 이 일을 중단 할 수 있습니다. 내가 공간을 생략 주목 새로운 라인과 세미콜론 모든 펑키 문자. 입력합니다. 이제 네트워크는 느린입니다. 나는 명확하게, 너무 오래 명령-V를 누르고. 젠장! 명령을 찾을 수 없습니다. 그래. 음, 포인트입니다 그럼에도 불구하고 다음. 그래서 실제로 무슨 일이 일어나고 있는지 이 선언에 라인 (16)에 문자 스타 버퍼의? 그래서 점점 무엇입니다 나는 포인터를 선언 할 때? 내가 갖는 모든는 4 바이트 값입니다 버퍼라고하지만, 그 안에 무엇을 순간? 그것은 그냥 쓰레기 값입니다. 언제든지 때문에 당신은 변수를 선언 C에서, 그것은 그냥 쓰레기 값이다, 우리는 시작하고 이 현실을 통해 여행. 지금, scanf와 말할 때, 이 주소로 이동 과에서 어떤 사용자 유형을했습니다. 사용자의 유형 경우 헬로 세계, 음, 나는 그것을 어디에 배치해야합니까? 버퍼는 쓰레기 값입니다. 그래서 화살표 같은 종류의 그 위치를 알고있는 사람을 가리키는 것. 아마 가리키는 것 바로 여기 내 기억에. 그래서 때 사용자 안녕하세요 세계의 유형, 프로그램을 배치하려고 시도 문자열 안녕하세요 백 슬래시 0 메모리의 덩어리입니다. 그러나 높은 확률로하지만, 분명 100 % 확률, 컴퓨터는 충돌 것입니다 프로그램이 없기 때문에 기억 나는 만져 허용해야합니다. 그래서 짧은에,이 프로그램은 바로이 때문에 결함. 나는 근본적으로 일을하고 있지 않다? 어떤 단계를 내가처럼 생략이 우리는 빙키의 첫 번째 예제로 처리? 그래? 청중 : 메모리 할당? 데이비드 마란 : 메모리 할당. 나는 실제로 할당되지 않은 해당 문자열에 대한 메모리. 그래서 우리는 몇 가지 방법으로이 문제를 해결할 수 있습니다. 하나, 우리는 간단하게 할 수 있습니다 사실, 지금은있어 흐림을보고 시작할 것 것 사이의 라인 배열, 문자열이 무엇인지, 무엇이다 문자 스타 문자 어떤 배열입니다 이다. 여기에 두 번째 예이다 문자열 통지 포함 모든 I 라인에서 수행 한 (16) 대신 말하는입니다 그 버퍼는 문자가 될 것입니다 스타 메모리 청크 포인터, 나는 매우 적극적으로 줄거야 16 자에 대한 자신 버퍼, 사실, 당신은 익숙하다면 용어 버퍼링, 아마 동영상의 세계에서, 동영상 버퍼링, 버퍼링이고, 버퍼링. 음, 연결이 여기에 무엇입니까? 유튜브의 음, 내부 비디오 플레이어의 내부 일반적으로 배열입니다 즉, 16보다 더 큰. 크기는 하나의 배열 수 있습니다 메가 바이트, 어쩌면 10메가바이트, 그 배열로 브라우저를 않습니다 바이트의 전체 무리를 다운로드 메가 바이트의 전체 무리 비디오, 비디오 플레이어, YouTube의 또는 누구의은, 시작 그 배열에서 바이트를 읽어 들이기, 언제든지 당신을 참조 워드 버퍼링, 버퍼링, 즉, 플레이어가 의미 그 배열의 끝에 얻었다. 네트워크는 그렇지 갖도록 느리다 더 바이트 배열을 리필 그래서 당신은 비트 나간다 사용자에게 표시합니다. 그래서 버퍼는 적절한 용어는 점에서 여기에 그냥 배열, 메모리의 덩어리입니다. 그리고이 문제를 해결할 것 이 밝혀 때문에 당신은 배열을 처리 할 수​​ 있다는 생각으로 그들은 심지어 버퍼 불구하고, 주소입니다 단지 상징, 그것은이다이다 문자의 순서, 버퍼, 그 날을 위해 유용, 프로그래머, 당신은 주위에 그 이름을 전달할 수 있습니다 그 것처럼 포인터로 그것을 생각 청크의 주소했다 16 문자의 메모리. 즉, 그래서 나는 통과 할 수있다 정확하게는 scanf 그 단어 그래서 지금, 나는이 프로그램을 만들 경우, scanf와 2을, 도트 슬래시 scanf와 2, 및 입력 안녕하세요 세계, 그 time--를 입력 흠, 무슨 일? 문자열하시기 바랍니다. 내가 잘못 무슨 짓을 한거야? 안녕하세요 세계, 버퍼. 안녕하세요 세계. 아, 나는 무엇을하고 있는지 알고있다. 그래. 그래서 독서 것 첫 번째 공간까지. 그래서 그냥 잠시 속임수하자 난 그냥 뭔가를 입력하고 싶었다 말 정말 긴이 긴 문장처럼 그건 하나, 둘, 셋, 넷, 다섯, 여섯, 일곱, 여덟, 아홉, 10, 11, 12, 13, 14, 15, 16. 그래. 그것은 참으로 긴 문장이다. 그래서이 문장은 이상 16 자 그래서 나는, Enter 키를 누르 때 무슨 일이 일어날? 음,이 경우에 이야기, 내가 선언했다 버퍼 실제로 배열 인에 갈 16 문자 준비가. 그래서 하나, 둘, 셋, 넷, 다섯, 여섯, 7, 8, 9, 10, 11, 12, 13, 14, (15, 16). 그래서 16 자, 이제, 때 이 긴처럼 뭔가를 읽고 문장, 무슨 일이됩니다거야 나는이 읽을거야 있다는 것은 긴 S-E-N-T-E-N-C-E, 문장. 그래서 일부러이다 나쁜 일이 내가 이상 기록 유지 내 배열의 경계, 내 버퍼의 경계를 넘어. 나는 운이 프로그램 얻을 수 관심 실행에 유지되지 않습니다, 그러나 일반적으로,이 말하기 참으로 내 프로그램을 충돌합니다, 그것은 버그가 내 내가 단계 순간을 코딩 경계를 넘어 그 배열의, 나는 때문에 그것의 알고하지 않습니다 반드시 충돌 것 또는 그냥 운거야 경우. 그래서이 문제가에 있기 때문에 이 경우, 그것은 작동하도록 보인다 과의에도 불구하고, 여기에 운명을 유혹하자 IDE는 꽤 견딜 것 의-- 우리는 거기에 갈. 마지막으로. 그래서 나는이 볼 수있는 유일한 사람입니다. 그래서 난 그냥 재미 타이핑을 많이했다 정말로 긴 실제 구문 밖으로 확실히 초과했음을 16 바이트, 나는 때문에 이 미친 긴 여러 줄에 입력 문구, 다음 무슨 일이 있었는지 알 수 있습니다. 프로그램을 인쇄하려고 다음 세그먼트 오류를​​ 가지고 및 분할 오류는 때입니다 이 같은 일이 발생 및 운영 체제를 말한다 아니, 그 메모리를 건드릴 수 없어. 우리는 죽일거야 모두 프로그램. 그래서이 문제가 보인다. 나는 프로그램이있다을 개선했습니다 적어도, 일부 메모리가 그러나 이것은 한정 할 것 같다 점점로 기능하여 GetString 어떤 유한 한 길이 16의 문자열. 당신은 더 이상 지원 싶다면 16 자보다 문장, 당신은 무엇을 하는가? 글쎄, 당신을 증가시킬 수 (32)이 버퍼의 크기 또는 그 종류의 짧은 보인다. 왜 우리는하지 않습니다 그것은 1000하지만 다시 밀어 넣습니다. 직관적으로의 응답은 무엇인가 다만함으로써이 문제를 회피 1000 문자처럼, 더 큰 내 버퍼? 이 방법을 getString에 구현함으로써. 어떻게 여기에 좋거나 나쁜? 그래? 청중 : 당신은 많이 결합하는 경우 공간의 당신이 그것을 사용하지 않는, 당신은 그 공간을 재 할당 할 수 없습니다. 데이비드 마란 : 물론입니다. 당신이하지 않는 한, 그것은 마치 낭비이다 실제로 그 바이트 (900)가 필요 아직 당신을 요구하고 어쨌든 총 1,000 당신은 더 많은 메모리를 사용하고 있습니다 당신이 필요한 것보다 사용자의 컴퓨터, 그리고 모든, 일부 후 당신은 이미 발생했습니다 인생에서 당신이있을 때 그 많은 프로그램을 실행 그들은, 많은 양의 메모리를 먹고있어 이것은 실제로 성능에 영향을 미칠 수 있습니다 사용자의 경험 컴퓨터. 그래서 종류의 게으른 솔루션입니다, 확실히, 반대로, 이뿐만 아니라 낭비이다, 무슨 문제 아직도 내가 내 버퍼를 만들 경우에도 유지 1,000? 그래? 청중 : 문자열의 길이는 1,001입니다. 데이비드 마란 : 맞아요. 당신의 문자열 길이 1,001이면 당신은 동일한 문제를 가지고, 내 인수로, 나는 것 다만 다음 2,000 확인 하지만 당신은 알고하지 않습니다 어떻게해야 큰 사전, 그럼에도 불구하고, 나는 내 프로그램을 컴파일해야합니까 사람들이 사용시키는 전과 다운로드 그것. 그래서 이것은 정확히 종류 물건 CS50 라이브러리 시도는 우리를 도와 우리는 눈에 거 야 기본이되는 구현의 일부에 여기서, 그러나 이것은 CS50 점이다 C. CS50 IDE에있었습니다 파일입니다 당신이 사용했던 모든 주. 그것은 미리 컴파일 된 그리고 당신은했습니다 자동으로 사용하고 를 갖는 자연에 의해 그 소리와 L의 CS50 플래그를 대시, 그러나 나는 모두를 아래로 스크롤하면 이러한 기능, 여기하여 GetString있어, 단지 당신에게를 제공합니다 무엇의 맛, 무슨 일 의가에 대해 간략히 살펴 보겠습니다 상대적 복잡성. 그것은하지 슈퍼 길어 기능,하지만 우리는하지 않았다 모든 하드에 대한 생각해야 어떻게 문자열을 방법에 대해 이동합니다. 그래서 여기 내 버퍼와 나는이다 분명히 null로 초기화. 이것은 물론, 문자 스타 같은 일, 그러나 나는 결정 CS50 라이브러리를 구현 우리가려고하는 경우에 그 완전히 동적 내가 얼마나 큰 사전에 몰라 문자열 사용자가 얻고 싶은 것입니다. 그래서 시작하는거야 그냥 빈 문자열 나는 많은 구축거야 기억 나는 사용자 문자열에 맞게 필요에 따라 나는이없는 경우 충분히, 내가 물어 갈거야 더 많은 메모리에 대한 운영 체제. 나는 그들의 캐릭터를 이동하는거야 메모리의 큰 덩어리로 내가 해제 또는 해제거야 메모리가 불충분 큰 덩어리 그리고 우리는 단지거야 반복적으로이 작업을 수행합니다. 그래서 빠른 눈, 여기에 단지 변수의 있는 난을 추적 할거야 내 버퍼의 용량. 나는 얼마나 많은 바이트를 맞게 할 수 있습니까? 여기에 변수가 n입니다 내가 지키려고하는 사실에 얼마나 많은 바이트를 추적 사용자가 입력 한 또는 버퍼. 당신은 전에 본 적이 없다, 당신을 지정할 수있는 int 같은 변수 이름에서 알 수 있듯이, 이는 부호이다 의미는 음이 아닌, 그리고 왜 것 나는 이제까지 지정을 귀찮게 할 INT 그냥 INT 아니라고, 그러나 서명되지 않은 INT는입니까? 또한 음이 아닌 INT이다. [들리지]은 무엇을 의미합니까? 청중 : 그것은 양을 설명하는 것 메모리 [들림] 될 수있다. 데이비드 마란 : 그래. 내가 서명되지 않은 말한다면, 이것은 실제로 당신에게 여분의 메모리를 하나의 비트를주는 당신이 경우 그것은 바보의 종류 보이지만, , 추가적인 메모리의 비트가 당신이 많은 두 배 것을 의미합니다 당신이 나타낼 수있는 값, 는 0 또는 1이 될 수 있기 때문이다. 그래서 기본적으로 INT는 약이 될 수 있습니다 마이너스 20 억 모든 방법 긍정적 인 20 억까지. 이러한 큰 범위이지만 그것은 여전히​​ 종류의 낭비이다 당신은 단지 걱정하는 경우 크기, 이는 단지 직관적으로 음이 아닌이어야한다 또는 양수 또는 0, 그럼, 왜 20 억을 낭비 음수에 사용할 수있는 값 당신은 결코 그들을 사용하려고하지한다면? 그래서 할 수있는 부호, 지금 내 INT 말하여 4000000000 0과 약을합니다. 그래서 여기 이유로 그냥 INT의 C이다 우리는 지금과 같은으로받지 않습니다 대신 INT 이유에 문자의,하지만 여기에 무슨 일이 일어나고 있는지의 요지 당신의 일부에 예를 들어, 사용하고있는, 심지어 PSET 사에는 fgetc 함수 또는 그 후, 우리는 그것을 볼 수 있습니다 다시 문제에 다섯 설정 는 fgetc 때문에 이름으로 좋은 가지, 일종의 arcanely, 제안 이 함수의 그 , 문자를 가져옵니다 그래서 무엇을 근본적으로 다르​​다 우리하여 GetString에서 무슨 일을하는지에 대한 우리가 사용하지 않는 것입니다 같은 방법으로는 scanf. 우리는 단계별로 따라 들어온다 어떤을 통해 사용자는에 입력하고있다, 우리는 항상 하나를 할당 할 수 있기 때문에 문자, 그래서 우리는 항상 안전하게 수 한 번에 하나의 문자에보고, 마법은 여기에 일이 시작됩니다. 나는 아래로 스크롤거야 이 함수의 중간 그냥 간단하게이 기능을 소개합니다. 많은 거기에 같은 함수 malloc에​​, 거기 realloc을 기능 곳 realloc을 당신은 메모리의 덩어리를 재 할당 할 수 있습니다 그것이 더 큰 또는 작은합니다. 그래서 길고도 짧은 이야기와 함께 오늘 내 손의 물결, 그 어떤하여 GetString을 알고 하고있는 것은 일종의입니다 의 마술 성장 또는 사용자로 버퍼를 축소 자신의 문자열의 종류. 경우에 따라서 사용자 유형 짧은 문자열이 코드 만 충분히 할당 메모리는 캐릭터에 맞게. 사용자가 입력을 유지하는 경우 나는 다시 다시처럼 다시, 잘, 경우 버퍼의 처음이 큰 프로그램은에, 실현 잠깐, 내가 공간이 부족 해요 그것은 두 배로 것 버퍼 크기 다음 버퍼의 크기를 두 배로 그리고 배가을 수행하는 코드, 우리는 여기에서 보면, 그것은이다 다만이 영리한 한 줄. 이 구문을 보았다하지 않을 수 있습니다 전에,하지만 당신은 스타가 동일 말한다면, 이 같은 일을있는 그대로 용량의 2 배를 말하는. 그래서 그냥 배로 유지 버퍼의 용량 다음으로 realloc을 말하고주는 자체 훨씬 더 많은 메모리. 지금과 같은 옆으로,이 여기에 다른 기능은 다음과 같습니다 우리는 어떤 세부 사항으로 보이지 않는 것 의 getInt에 표시하는 것보다 다른, 우리의 getInt로하여 GetString을 사용합니다. 우리는 그렇지 않은 것을 확인 널 (null), 이는 리콜, 특수 값은 그 뭔가 잘못된 것을 의미한다. 우리는 메모리 부족입니다. 더 나은 것을 확인합니다. 그리고 우리는 감시 값을 반환합니다. 하지만 난에 관한 의견을 연기합니다 왜 우리는 scanf와의 사촌을 사용 sscanf를 호출 그것은 밝혀 그 sscanf를, 또는 문자열 scanf와, 당신은 라인을 살펴 수 있다는 사용자가에 입력하고을 할 수있다 본질적를 분석하고 난 무엇을 여기서 뭐 내가 sscanf를 말하고있다, 사용자가 가지고있는 어떤 분석 에 입력하고 확인 %의 난을, 거기에있는 정수이며, 우리 못해 또한 거기에 이유를 정확하게 오늘에 들어가 간단히 말해서 %의 여기에 C,하지만 수 있습니다 사용자가 입력 한 경우 우리는 감지 수 후 가짜 뭔가. 그래서 이유가의 getInt 및하여 GetString 다시 시도, 다시 시도하는 방법을 알려, 다시 시도 때문에 모든입니다 우리가 작성한 코드, 그것은 종류의 사용자의 입력에서 찾고 확인하고 그것을 완전히 숫자이다 또는 실제 떠 포인트 값 등에 어떤 값에 따라 당신이 사용하는 기능을 수행합니다. 휴. 그래. 즉 입이었다 하지만 포인트는 여기 우리가했던 이유 그 훈련 바퀴 때문에 가장 낮은 수준에있다 너무 많은 일이 있다는 것을 우리가 원하는 것을 잘못 될 수 선제 적으로 처리하는 에 확실히 것들 클래스의 초기 주, 하지만 지금은 PSET 사 및 PSET 다섯와 이후 당신은에게 더 볼 것 당신은 또한 당신은 더 할 수있어 의 문제의 그 종류를 해결 자신. 하여 GetString 또는의 getInt에 대한 질문? 그래? 청중 : 왜 당신은 두 번 것 버퍼의 용량 오히려 단지 증가보다 그것은 정확한 양만큼? 데이비드 마란 : 좋은 질문입니다. 왜 우리는 용량을 두 배로 것 버퍼의 반대 그냥 증가에 몇 가지 상수 값으로? 그것은 디자인 결정이었다. 우리는 그냥하는 경향이 있기 때문에 결정 시간적 비용이 조금 물어 수 운영체제 메모리, 우리는하지 않았다 로 점점 종료 할 큰 문자열에 대한 상황 우리는 묻고 있다고 또 다시 OS 다시하고 다시 메모리의 빠른 연속. 그래서 우리는 단지 약간, 결정 임의로 그러나 우리는 합리적으로 희망을, 즉, 당신은,하자 무엇인지 앞서 자신의 가려고 단지 있도록 배로 유지 우리는 시간의 양을 최소화 우리가 malloc에​​ 전화를하거나 realloc을하지만 총 판단 알 수없는 전화 어떤 사용자가 입력 할 수 있습니다. 두 가지 방법이 논란의 여지가있을 수 있습니다. 틀림없이 좋은. 그럼 몇 가지를 살펴 보자 메모리의 다른 부작용, 잘못 될 수있는 것들 및 도구 당신이 할 수있는 실수의 이러한 종류를 잡을 때 사용합니다. 그것은 비록 당신의 모든 밝혀 check50은 당신에게 많은 것을 이야기하지 않았습니다 버그를 쓰고있다 주 한 이후 코드, 심지어 모든 check50 테스트를하는 경우 통과, 그리고 경우에도 당신과 당신의 TF 그 슈퍼 확신 의도 한대로 코드가 작동합니다. 귀하의 코드는 버그가되었거나 당신의 모든에 결함, CS50 라이브러리를 사용하는데, 메모리가 누수되고있다. 당신은 운영 체제를 물어 봤는데 대부분의 프로그램에서 메모리 당신은 서면으로 작성했습니다,하지만 당신은했습니다 실제로 그것을 다시 주어지지 않는다. 당신하여 GetString라고했습니다 과의 getInt와 GetFloat, 하지만하여 GetString, 당신은했습니다 unGetString 또는 보내기 호출되지 않습니다 문자열 맨 등, 그러나 우리는 보았다 하여 GetString는 메모리를 할당한다는 것을 malloc에​​의 방법 또는이로 그냥 함수 realloc을, 정신에 매우 유사, 그럼에도 불구하고, 우리는 봤는데 운영 체제를 묻는 메모리 및 메모리 또 다시 하지만 다시 제공하지 않습니다. 지금, 옆으로, 그것은 밝혀 프로그램은 메모리를 모두 종료 할 때 자동으로 해제됩니다. 그래서 큰 거래를하지입니다. 그것은 휴식 않을거야 IDE 또는 느린 것 아래로, 하지만 때 프로그램 수행 일반적으로 메모리가 누수 이들은 장시간 동안 실행하고있다. 혹시 바보 거의 본 적이있는 경우 맥 OS 또는 모래 시계에서 비치 볼 Windows에서이 종류의 어디 감속 또는 생각이나 사고 또는 정말 시작 크롤 링을 천천히, 그것은 매우 가능성이 될 수있다 메모리 누수의 결과. 쓴 프로그래머 사용중인 소프트웨어 메모리 운영 체제를 물어 몇 분마다, 매 시간마다. 그러나 실행하는 경우 이 경우에도 소프트웨어, 컴퓨터에 최소화 끝 시간, 일, 당신은 더 많은 요구 될 수 있습니다 메모리와 결코 실제로 그것을 사용 그래서 당신의 코드는, 또는 수 프로그램은 메모리가 누수 될 수 있습니다 당신은 메모리 누수가 시작하면, 다른 프로그램보다 적은 메모리가있다, 및 효과에있다 모든 것을 천천히. 자,이 훨씬 하나입니다 가장 극악한 프로그램 당신은 기회가있을 것이다 CS50에서 실행 한, 출력은보다 더 난해한 그대로 그 소리의 또는의를하거나 명령의 우리가 전에 실행 한 줄 프로그램하지만 다행히도, 그 출력에 포함 일부 슈퍼 유용한 정보입니다 유용 하나 PSET 네이 될 것입니다 또는 확실히 다섯 PSET. 그래서 Valgrind의는 도구입니다 즉 볼 수 있습니다 프로그램에서 메모리 누수. 그것은 실행하기가 비교적 간단합니다. 당신은, Valgrind의 다음 실행 조금 자세한 정보는 비록, 대시 대시 누출 점검 전체에 해당하고 점 슬래시 및 프로그램의 이름입니다. 그래서 Valgrind의 다음 프로그램을 실행합니다 그리고 프로그램의 끝에서 이 종료하기 전에 실행 당신에게 다른 프롬프트를 제공합니다 이 분석거야 당신의 프로그램이 실행 된 것 동안 당신은 당신이 누출 않은 이야기 더 나은 아직 메모리와, 당신은 메모리를 만지지 않았다 당신에 속하지 않았다? 그것은 모든 것을 잡을 수 있지만, 그것은이다 대부분의 물건을 잡기에 꽤 좋은. 그래서 여기 내 가진 실행의 예 이 프로그램을 실행 Valgrind의를 가진, 라는 프로그램에 메모리 및 I는거야 있는 라인을 강조 궁극적으로 우리에게 관심을. 그래서 더 산만있다 나는 슬라이드에서 삭제 한 것을. 하지만 그냥 어떤이를 보자 프로그램은 우리에게 이야기 할 수있다. 그것은 우리에게 일을 이야기 할 수 있어요 크기 4의 잘못된 쓰기 등을들 수있다. 즉, 메모리를 터치하면, 메모리의 구체적 4 바이트 당신은 안된다고, Valgrind의 당신이 말할 수 있습니다. 크기 4의 잘못된 쓰기. 당신은 4 바이트 감동 당신은 안된다고. 당신은 어디에서 그 짓을 한거야? 이 아름다움입니다. 메모리 도트 C 라인 (21)은 어디입니까 망쳐하고 도움이 이유입니다. 많은 GDB처럼, 그것은 도움이 될 수 있습니다 실제 오류에서 당신을 가리 킵니다. 자,이 사람은 조금 더입니다 자세한 혼란 아니라면. 1 블록에 40 바이트는 확실히 있습니다 손실 기록 (1) (1)에 잃었다. 그게 무슨 뜻 이죠? 글쎄, 그것은 단지 당신이 질문을 의미합니다 40 바이트 그리고 당신은 다시 그것을 포기하지 않았다. 당신은 malloc을 호출하거나 호출 하여 GetString 및 운영체제 당신이 40 바이트,하지만 당신을 결코 포기하지 해제 또는 메모리를 출시, 그리고 공정하게, 우리는 보여 적이 어떻게 메모리를 다시 제공합니다. 슈퍼 거기에 밝혀 간단한 기능은 무료라고합니다. 하나의 인수, 일이 걸린다 당신은 무료 또는 다시주고 싶어 하지만 40 바이트, 분명히, 이 프로그램에 줄에서 손실 된 메모리 (20)는 C 점을 찍는다. 그래서이 프로그램을 보자. 그것은 매우 쓸모. 그것은 단지 보여줍니다 이 특정 오류가 발생했습니다. 그럼 살펴 보자. 여기에 메인 주, 공지, 전화입니다 함수 f를 다음 반환했다. 그래서 모든 재미 있지. F는 어떤 기능을 수행합니까? 내가 프로토 타입 신경 쓰지 않았다 알 수 있습니다. 나는 코드를 유지하고 싶었 가능한 한 최소한의. 그래서 주 이상 F를 넣어 즉, 확실히, 괜찮아요 이 같은 짧은 프로그램. 그래서 F 아무것도를 반환하지 않습니다 아무것도하지를 가지고 있지만,이 작업을 수행 않습니다. 그것은 많은처럼 선언 빙키의 예에서, X가라는 포인터는거야 INT의 주소를 저장합니다. 그래서 왼쪽이다. 영어로, 무슨입니다 하고 오른쪽? 누구? 이 우리를 위해 무엇을하고 있는가? 그래? 청중 : [들리지] 시간 INT의 크기 인 10 배 [들림] 데이비드 마란 : 좋은 날이 요약 할 수 있습니다. 그래서 10 정수에 대한 충분한 공간을 할당 10, INT의 크기는 무엇입니까 그것은 4 인 4 바이트이므로 10 배의 40, 나는했습니다 그 오른쪽 그래서 강조는 나에게 40 바이트를 제공하고 첫번째 바이트의 주소를 저장 X에. 그리고 이제 마지막으로, 여기 어디 이 프로그램은 버그가 무엇이야입니다 라인 (21) 문제는 그 논리를 기반으로? 무엇 라인 (21) 잘못? 그래? 청중 : 당신은 할 수 없습니다 [들림] X에 인덱스입니다. 데이비드 마란 : 그래. 나는 그런 X로 인덱스는 안된다. 그래서 구문, 그 괜찮아요. 어떤 좋은 것은 당신처럼 많이있다 어레이의 이름을 치료할 수 것처럼 마찬가지로, 포인터의 그것의 것처럼 당신은 포인터를 처리 할 수 배열, 그리고 나는 구문 수 X 브래킷 뭔가 말, X 브래킷 나는, 그러나도 10은 문제점이있다. 왜? 청중 : 그것은 내부 아니니까. 데이비드 마란 : 그것은 아니에요 메모리의 덩어리 내부. 가장 큰 값은 내가해야이다 그 대괄호로 퍼팅? 9 9 0. 제로 인덱싱 때문에. 그래서 0 ~ 9 괜찮을 것입니다. 브래킷 (10)이 잘되지 않고, 하지만, 때마다 비록 기억 나는 CS50 IDE를 만들려고하는 것 가짜 값을 입력하여 충돌, 항상 협조하지 않습니다 실제로, 당신이 자주 운 얻으려면, 그 때문에 운영 체제는하지 않는다 알 당신 이제까지 약간 일부 메모리 덩어리를 통과, 당신이 기술적으로 내 머물렀다 때문에 당신의 세그먼트하지만, 더 그에 운영체제 클래스, 이 같은 그래서 뭔가 아주 쉽게 발견되지 않을 수 있습니다. 여러분의 프로그램은 결코 충돌 않을 것 일관하지만 어쩌면 한 번 잠시에서. 그리고의는 Valgrind의를 해보자 이에, 그리고 여기 여기서 우리가 압도 할 것이다 순간적으로 산출. 그래서 메모리 Valgrind의 누출 점검을 전체 도트 슬래시 메모리 같습니다. 내가 약속 왜 여기 이 압도한다. 여기에 Valgrind의, 무슨 무슨이다 프로그래머, 몇 년 전 - 그것은 좋은 생각이 될 것이다라고 정했다 같은 출력을 볼위한. 그럼 이것의 의미를 보자. 왼쪽에 그래서 모든 방법 더 좋은 이유 측면 프로그램의 프로세스 ID이다 우리는 단지, 고유 식별자를 실행 프로그램에 우리는 단지 달렸다. 우리는에서 그것을 삭제 슬라이드,하지만이 여기에서 유용한 정보이다. 의는 매우 정상까지 이동하자. 우리가 시작된 곳 여기입니다. 그래서 모든 것을 훨씬 출력이 아니다. 여기에 잘못된 기록이다 라인 21 사이즈 4. 음, 라인 (21)은 무엇입니까? 선 (21)는 정확하게이었다 이과는 의미가 있습니다 나는 유효에있어 것을 난 때문에 4 바이트를 작성 이 정수를 넣어하려고, 이는, 무엇이든 될 수있다 그냥 될 일이 제로,하지만 난 노력하고있어 위치에 그것을 넣어 그 날에 속하지 않습니다. 하나 또한, 여기 아래, 40 바이트 블록은 확실히 기록 1 손실됩니다. 그게 내가 malloc을 호출 할 때 때문이다 여기에, 나는 실제로 메모리를 해제하지 마십시오. 그래서 우리는 어떻게이 문제를 해결할 수 있습니까? 내가 앞서 가자 조금 더 안전 할 거기에 9를하고 여기에 무료 X 날 수 있습니다. 이것은 오늘날의 새로운 기능입니다. 지금 메모리 점 슬래시을 다시 실행하면, ,의 다시에 Valgrind의 실행하자 내 창을 최대화하고 Enter를 누르십시오. 지금, 그것은 좋다. 그들은 좋은 소식을 묻어 이 모든 출력한다. 모든 힙 블록은 무료했다. 우리는 무엇을 힙에 돌아올 것이다 하지만, 누출이 가능합니다. 그래서 이것은 또 다른입니다 당신의 도구 키트 도구 있는 당신을 시작할 수 있습니다 지금 같은 오류를 찾을 수 있습니다. 그러나 보자 무엇 더 잘못 여기에 갈 수 있습니다. 지금의 전환을하자 실제로 문제를 해결. 여담으로,이 해소 경우 혼란 또는 긴장의 조금, 이 지금은 재미있다. 그래. 그건 꽤 좋은입니다. 포인터이기 때문에 주소 및 주소 규칙에 따라 일반적으로 진수 작성. 하, 하,이 지금은 재미있다. 어쨌든, 그래서 지금하자 실제로 문제를 해결한다. 이것은, 슈퍼왔다 슈퍼 지금까지 낮은 수준, 우리는 실제로 유용 할 수 있습니다 이러한 낮은 수준의 세부 사항을 가진 것. 그래서 우리는 몇 주 소개 전 배열의 개념. 배열은 좋은 때문에 그것은 우리의 코드를 정리하기 어렵다 우리가 쓰기 원한다면 때문에 여러 학생들과 함께 프로그램 또는 여러 이름과 주택과 기숙사 및 대학과 그 모든, 우리는 모든 것을 더 저장할 수 깔끔하게 배열의 내부. 하지만 하나의 단점을 제안한다 어레이의 지금까지. 당신은 스스로를 고통 적이 없다하더라도 프로그램에서, 단지 본능적으로, 나쁜 일이 무엇입니까 배열에 대한, 아마? 나는 약간의 속삭임을들을 수 있습니다. 청중 : 그것은 어렵다 크기를 변경합니다. 데이비드 마란 : 그것은 어렵다 크기를 변경합니다. 사용자는 크기를 변경할 수 없다 어레이, 사실, 그 자체 C에서 당신은 다른 배열을 할당 할 수 있습니다, 이전에 이르기까지 모든 이동 이제 새로운, 그리고에 몇 가지 여분의 공간이, 하지만 달라요 자바 나 파이썬 같은 언어 또는 기타 임의의 개수 와 언어 당신의 일부 익숙 할 수있는 곳을 그냥 일을 계속 추가 할 수 있습니다 배열의 마지막에 싫증. 당신의 배열이있을 때 그 크기가 크기 6,, 하고 생각 이전 같은 많은 일정한 크기의 버퍼를 갖는, 당신은 게이트에서 생각해야 어떤 크기 당신이 원하는 무엇입니까? 당신이 너무 큰 것 같아요 경우, 당신은 공간을 낭비하고 있습니다. 당신은 너무 작은 것 같아요 경우를 적어도, 데이터를 저장할 수 없다 더 많은 작업없이. 포인터에 그래서 오늘, 덕분에, 우리는 할 수 함께 우리 자신의 정의를 바느​​질 시작 데이터 구조, 및 예약 사실, 여기에 뭔가 그건 좀 더 본다 언뜻보기에 애매한, 그러나 이것은 우리가 링크 된 전화 할게 무엇인가 목록 및 요약되어의 이름 종류 그것. 그것은에서 번호 목록, 또는 이 경우, 번호 목록, 그러나 어떤 목록 될 수 있지만 그것은 함께 화살표의 방향으로 연결된 것 단지 추측을 어떤 기술과 우리는 할 수있는거야 함께 스티치, 종류의 스레드와 팝콘처럼, 여기리스트 사각형 연결? 그 숫자? 기본 언어 기능은 무엇입니까? 청중 : 포인터. 데이비드 마란 : 포인터. 그래서 이러한 화살표는 각각 여기에 나타냅니다 포인터하거나 주소를 입력합니다. 그래서 다른 말로하면, 내가 원하는 경우 번호의리스트를 저장하는, 내가 원하는 경우 나는 단지 그것을 저장할 수 없습니다 성장하고 축소 할 수있는 기능 배열 내 데이터 구조. 그래서 조금이 필요합니다 더 세련, 하지만이 통지 사진 종류의 제안 당신은 단지 작은 스레드 가지고있는 경우에 그 모든 것을 함께 연결, 아마 공간을 확보하기 위해 그 어려운 일이 아니다 그 사각형의 사이에 두 또는 그 노드의 두 가지로에게 우리는 시작합니다 새 노드에 넣어 그들을 호출, 다음 몇 가지 새로운 스레드, 단지 함께 세 개의 노드 도랑, 처음, 마지막 하나는 하나 당신은 단지 중간에 삽입있다. 그리고 실제로 연결리스트, 배열과는 달리 동적입니다. 그것은 성장할 수 있으며 수 축소 당신은하지 않습니다 알고 있거나 사전 방법에 신경이 많은 데이터 당신이 저장 될거야, 하지만 우리가 조금 있어야 밝혀 이를 구현하는 방법에 대한주의. 그래서 처음의 우리가 구현하는 방법을 살펴 보자 이 작은 사각형 중 하나. 그것은 int를 구현하기 쉽다. 당신은 다음 INT n 및 말 당신은 INT 4 바이트를 얻을, 하지만 int를 얻는 방법, N 호출 다음 포인터,의 옆을 호출 할 수 있습니다. 우리는이를 호출 할 수 있습니다 일 아무것도 우리가 원하는 하지만 사용자 정의 데이터 구조가 필요합니다. 그래? 청중 : 앰퍼샌드 [들림]. 데이비드 마란 : 그래서 앰퍼샌드 우리는에 사용 잠재적 노드의 주소를 얻는다. 그러나 우리는 서로를 필요 C의 기능을 위해 저 작성하는 기능을 제공하는 이 사용자 정의 사각형이 사용자 지정 변수는 메모리에,됩니다. 청중 : 구조체. 데이비드 마란 : 구조체. 지난 주부터 기억, 우리는 도입 구조체,이 비교적 간단한 키워드 즉, 우리가 이런 일을 할 수 있습니다. C는 데이터와 함께 제공되지 않은 구조는 학생이라고합니다. 그것은 INT와 플로트와 문자와 함께 제공 이러한하지만 학생되어 있지 않습니다, 그러나 우리는 학생 데이터 유형을 만들 수 있습니다, 이 구문을 사용하여 학생의 구조, 여기에. 그리고 당신은 또 다시이 표시됩니다. 그래서 걱정하지 마 키워드를 암기, 하지만 중요한 키워드이다 우리가 말한 바로는 사실 구조체 그리고, 우리는 그것을 학생에게 전화를 내부 학생의 이름과 집이었다 기숙사 등 나. 그리고 지금, 오늘의이 제안 할 수 있습니다. 나는 몇 마디를 추가,하지만 내가 원하는 경우했습니다 의이 사각형을 구현하는 INT와 모두를 가지고 포인터, 당신은, 내가 뭘 해요 알고 노드라는 구조체를 선언 할 것. 나는 말을하려고, 그 안에도 해요 노드,이 사각형은 int를 가지고 우리가 전화 할게 n 및 그것은 다음 포인터를 가지고있다. 그리고 이것은, 조금 장황 하지만 당신이 그것에 대해 생각하면, 사진에 있던 화살표 잠시 전에 어떤 데이터 유형입니까? 어디 그 화살표의 각각 가리키는 데이터 구조의 유형에? 그냥 그 자체를 int를 가리키는 아니에요. 그것은을 가리키는 것 전체 직사각형 일 그 직사각형의 것, 우리는 노드라고 말했다. 그래서 우리는 가지에있다 재귀 적으로이 같은 정의 노드, 우리는 말할 것이다 N이라는 INT를 포함합니다 및 포인터는 다음과 호출 데이터 구조의 유형 그 포인터 점이 명백하게 구조체 노드가 될 것. 그래서이 귀찮게 장황 다만, 학자 연하는 할 수 이유는 우리가 할 수 없습니다 다만이 말을, 어떤 솔직히 많이 더 읽기 보인다 리콜 읽고 C가 있기 때문이다 일이 위에서 아래로, 왼쪽에서 오른쪽으로. 우리가 세미콜론을 얻을 때까지이 아니다 키워드 노드가 실제로 존재한다는 것을. 우리는 이런 종류의를 갖고 싶다면 데이터의 내부 순환 참조 구조, 우리는이 작업을 수행해야 할 곳 우리는 정상에서 구조체 노드 말을하는 우리에게이 기술의 긴 방법을 제공합니다 일, 우리가 구조체 노드 말을 한 후 내부, 다음 맨 마지막 줄에 우리 말, 모든 권리, C, 그런데, 그냥이 망할 전화 일 노드 및 중지 모두 키워드 구조체를 사용하여. 그래서 이것은 단지 종류의 구문이다 궁극적으로 우리가 만들 수 있습니다 트릭 정확히처럼 보이는 뭔가. 우리가 지금 가정하면 우리가 할 수있는 그래서 C에서이 일을 구현, 어떻게 실제로 우리가 할 이 이송 시작? 음, 사실, 우리가해야 할 모든입니다 오른쪽으로 그냥 왼쪽에서 반복 종류의 노드를 삽입하거나 노드를 삭제 또는 우리가 원하는 목적지 것들에 대한 검색, 하지만이 작업을 수행하기 위해, 앞서 가서 만들어 보자 일 좀 더 현실이 있기 때문에 지금까지 슈퍼 낮은 수준이었다. 사람은 말 그대로 먼저 하시겠습니까? 그래. 최대 어서. 당신의 이름은 무엇입니까? 데이비드 : 데이비드. 데이비드 마란 : 데이비드. 만나서 반갑습니다. 나도. 괜찮아. 그리고 우리는 숫자 9가 필요합니다. 좋은하지 첫 번째로, 아마. OK (확인), 수 (9). 숫자 17하시기 바랍니다. 내가 조금 더 멀리 돌아가 보자. 번호 22, 제발, 그리고 얼마나 더 뒤로 약 나는 어떤 손을 볼 수있는 경우 모든 빛 또는 아니오. 누군가가 바로 거기에 자원 봉사를하고있다. 당신은 올 하시겠습니까? 당신의 팔뚝은 강제적으로 올라가고있다. 17 확인. (22). 26 내려오고있다. 다른 사람이하고 싶습니다 forcefully-- 업 어서. 실제 자원 봉사. 그래서 매우 빠르게, 경우 너희들 준비 할 수 자신은 좋아 화면상의 노드. 고맙습니다. 그리고 당신은 (26)을 수 있습니다. 좋아하고 신속하게 소개. 그래서 다윗 해요 당신은 또한입니까? 데이비드 : 데이비드. 데이비드 마란 : 그리고 당신은? 제이크 : 제이크. 고소 : 고소. 알렉스 : 알렉스. 라파엘 : 라파엘. 테일러 : 테일러. 데이비드 마란 : 테일러. 우수. 그래서 이러한 우리의 자원 봉사자는 오늘날과 진행 그리고, 그런 식으로 조금 이동 그냥 가서 계속 당신이 또는을로 번호를 유지 첫 징후 및 왼손을 사용하여, 가서 그냥 구현 이 화살표, 단지 왼손은 그대로되도록 당신이 가리켜 야 무엇을 가리키는 ,과에서하는 것은 자신에게 있기 때문에 약간의 공간을 제공 우리는 시각적으로 실제로 팔을 볼 수 있습니다 포인팅, 당신은 단지 가리킬 수 있습니다 일종의 지상에서 괜찮습니다. 그래서 여기에 우리는 하나의 연결리스트를 가지고 둘, 셋, 넷, 다섯 노드 처음 우리는이 특별한을 알 의 시작 부분에 포인터 키 우리는 추적해야하기 때문에 전체 길이 목록 어떻게 든. 그들이 남겨에도이 녀석, 오른쪽으로, 다시 메모리에 백업하려면 그들은 실제로 어디에서나 할 수 있습니다 컴퓨터 메모리. 그래서이 사람이 될 수있다 무대에 어디 서 그 때문에 그들이있는 한, 괜찮아요 실제로 서로를 가리키는 하지만 물건을 유지하는 깨끗하고 단순한, 우리는거야 단지 그들을 그리는 것은처럼 왼쪽에서 오른쪽 이,하지만 엄청난 차이가있을 수 있습니다 그 노드 사이에서. 지금, 나는 실제로 몇 가지를 삽입 할 경우 새 값의이 가서 이렇게하자. 우리는 지금 기회를 다른 노드를 선택합니다. 의 55 mallocing로 시작하자 말. 누군가가 malloc에​​있는시겠습니까? OK (확인), 최대 어서. 당신의 이름은 무엇입니까? 레인보우 : 무지개. 데이비드 마란 : 무지개? 괜찮아. malloc에​​ 무지개입니다. 최대 어서. 이제 우리는 우리 자신에게 물어 알고리즘 우리는 (55)를 넣을 수있는 곳. 그래서 우리 모두는 알고있다, 물론, 여기서 그녀 아마 우리가하려고하는 경우에 속한다 이 정렬 유지 그리고 너희들은 하나를 수행 할 수 있다면 한 걸음 뒤로 물러나 그래서 우리는 떨어지지 않습니다 단계, 즉 좋은 것입니다. 그래서 실제로, 레인보우, 여기에 나와 함께 시작, 때문에 우리가 지금 할 수있는 컴퓨터와 한 번에 하나의 변수를 참조. 이 첫 번째 노드의 경우 그래서. 그는 노드 아니다 주목 그는 단지 포인터의 그가로 그려 이유입니다 포인터의 크기 만이 아니라 그 전체 사각형 중 하나. 그래서 우리는 각각의 체크거야 반복은 9 55 이하? 아니. 17 이상 55 이하인가? 아니. 22 미만? 26 미만? 34 미만? 그리고 지금, 분명히 레인보우 단부에 속한다. 그래서 명확하게하고, 무엇을 당신의 이름, 테일러이었다? 테일러 : 테일러. 데이비드 마란 : 테일러의 사이에 그래서 왼쪽 손과 여기에 레인보우의 손, 누구의 손에 무엇을 가리 키도록해야합니다 이 목록에 (55)를 삽입 주문? 우리는 무엇을 어떻게해야합니까? 그래? 청중 : 테일러의 손 왼쪽을 가리 키도록해야합니다. 데이비드 마란 : 맞아요. 따라서 노드를 삽입 리스트의 끝으로 아주 간단하기 때문에 테일러 단지 지상에서 대신에, 가리가 또는 우리는 널 (null)를 호출합니다 null가 부재의 일종이다 포인터 나 특수의 제로 포인터, 당신이있어 왼쪽으로 가리려고 손 무지개와 다음 레인보우에서, 어디는 왼쪽을해야 손은 아마 가리? 아래로. 그녀의 손이 종류의 경우는 좋지 않다 여기에 또는 종류의 오프 가리키는 어떤 방법으로. 즉 간주 될 쓰레기 값, 하지만 그녀가 가리키는 경우 몇 가지 알려진 값, 우리는거야 제로 또는 널 (null)를 호출, 그 괜찮아요 우리는이에 기간을 가지고 있기 때문에 우리는 목록이 완료 알고있다. 그렇다면 다른 사람의 비교적 간단한 경우? 우리는 5 malloc을 수 있을까요? 최대 어서. 당신의 이름은 무엇입니까? 티파니 : 티파니. 데이비드 마란 : 미안 해요? 티파니 : 티파니. 데이비드 마란 : 티파니. 괜찮아. 티파니는 malloc으로 할당 된 값 5. 최대 어서. 이 하나, 너무 비교적 쉽게하지만, 의 현재 작업의 순서를 생각해 보자. 그것은 꽤 쉬웠다 끝에 테일러와. 번호 5, 9 코스 미만이며 그래서 우리는 우리가 티파니를, 다윗이 당신의 이름은 무엇입니까? 제이크 : 제이크. 데이비드 마란 : 제이크. 티파니, 제이크, 데이비드. 누구의 손이 먼저 업데이트해야합니까? 당신은 여기에 수행 할 수 있습니까? 몇 가지 방법이 있습니다 만 하나 이상의 잘못된 방법도 있습니다. 청중 : 왼쪽 시작합니다. 데이비드 마란은 : 왼쪽 시작합니다. 누가 여기에 왼쪽있어? 청중 : 첫째. 데이비드 마란 : OK. 그래서 처음으로 시작하고 어디에서 할 다윗의 손으로 업데이트 할? 청중 : 5쪽으로. 데이비드 마란 : OK. 다섯에서 다윗, 포인트 또는 티파니 여기, 지금? 청중 : 티파니는 9 점? 데이비드 마란 : 완벽한, 빙키의 제외 머리는 종류의 오른쪽 떨어졌다? 뭐가 잘못 때문에 말 그대로이 그림? 청중 : 아무것도 가리키는되지 않습니다. 데이비드 마란 : 아무것도 없다 지금은 제이크를 가리키는. 우리는 문자 그대로 9 고아했습니다 17, 우리는 문자 그대로했습니다 이 모든 메모리를 유출로 인해 먼저 다윗의 손을 업데이트, 그건 제대로의로 한, 좋은 지금 티파니에서 가리키는 하지만 아무도 없었다 경우 제이크 가리 키도록 선견, 우리가 잃어 버렸어요 그 목록의 전체. 그럼 취소 할 수 있습니다. 그래서 좋은 일에 있었다 걸려 넘어 그러나의 지금 해결 할 수 있습니다. 우리는 처음으로 대신해야합니까? 그래? 청중 : 티파니가 9시를 가리켜 야? 데이비드 마란 : 나는 할 수 없습니다 당신이 가까이 얻을. 9시에 누구를 가리켜 야? 청중 : 티파니. 데이비드 마란 : 좋아. 그래서 티파니는 9에서 첫 번째 포인트는해야한다. 그래서 티파니해야 동일한 값에 다윗에게, 어떤 보인다 잠시 중복, 하지만 두 번째, 때문에 지금은 괜찮아요 단계, 우리는 다윗의 손을 업데이트 할 수 있습니다 티파니에서, 다음의 경우를 가리 키도록 우리 단지 종류의 청소 일까지 이 봄과 같은 종류 인 것처럼, 지금은 정확한 삽입합니다. 그래서 우수한. 그래서 지금 우리는 거의 다 왔어. 이제 마지막을 삽입하자 값 (20)와 같은 값. 우리는 마지막으로 자원 봉사를 malloc을 할 수 있다면? 최대 어서. 그래서이 사람은 좀 더 까다로운. 하지만 실제로는, 코드 우리는있어 서면, 구두이기는하지만, 다만 무리를하는 것과 같다 지금 조건, 권리 경우? 우리는 조건을 가지고 있었다 속해 있다면 검사 결국, 아마 처음에. 우리는 루프의 어떤 종류에 필요 중간에 자리를 찾을 수 있습니다. 그럼 당신의 이름을 무엇으로 그렇게 할 수 있습니다? 에릭 : 에릭. 데이비드 마란 : 에릭? 에릭. 만나서 반갑습니다. 그래서 우리는 (20)이있다. 다섯 미만? 아니. 아홉 미만? 아니. 17 미만? 아니. 그래. 그는 여기에 속하고 당신의 이름은 다시입니까? 고소 : 고소. 데이비드 마란 : 고소. 알렉스 : 알렉스. 데이비드 마란 : 슈, 알렉스, 그리고? 에릭 : 에릭. 데이비드 마란 : 에릭. 누구의 손을 먼저 업데이트하는 데 필요한? 청중 : 에릭. 그래. 그래서 에릭의이 곳을 가리켜 야? 22. 좋다. 이제 다음은 뭐지? 고소는 에릭에 가리킬 수 있습니다 지금, 만약 너희들 단지 괜찮 일부 공간을 만들 시각적으로, 지금 우리는 삽입을했습니다. 그럼 이제 질문을 생각해 보자하지만, 자원 봉사자 주셔서 정말 감사합니다. 아주 잘. 만약 당신이 좋아하면, 당신은 사람들을 유지할 수 있습니다. 그리고 우리는 사랑스러운 이별 선물하는 경우가 각 스트레스 볼을하고 싶습니다. 나 그냥이를 통과 할 수 있습니다. 그래서이의 테이크 아웃은 무엇인가? 이 놀라운 것 같다 우리가 지금해야하는 한 대안으로 도입 그래서 국한되지 않은 배열 일부 고정 된 크기의 배열. 그들은 동적으로 증가 할 수 있습니다. 그러나 우리와 같은 많은 주 동안 검색된 과거, 우리는 무료로 아무것도 얻을 수 없다 같은 확실히 여기에 트레이드 - 오프 (trade-off)이있다. 링크의 상승에 따라서 목록이 동력은? 이 기능은, 솔직히 성장하는 우리는 삭제 할 수 있었다 필요에 따라 우리는 줄어들 수있다. 우리는 무엇 가격을 지불하고있다? 두 번 모두의 많은 공간, 같은. 당신이 사진을 보면, 더 이상 오전 I는 정수의 목록을 저장하는 단계를 포함한다. 난의리스트를 저장하고있어 정수 플러스 포인터. 그래서 공간의 양을 두 배로하고 있습니다. 지금, 어쩌면는 아니다 큰 문제가 4 바이트, 8 바이트, 그러나 그것은 확실히 추가 할 수 있습니다 대용량 데이터 세트에 대한 최대. 또 다른 단점은 무엇입니까? 그래? 청중 : 우리는해야 그들에게 하나씩을 통과. 데이비드 마란 : 그래. 우리는 그들에게 하나씩을 통과해야합니다. 당신은 우리가 최고를 준 것을 알고있다 대괄호의 편리한 기능 표기법, 더 제대로 랜덤 액세스라고도 우리는 점프 할 수있는 개별 요소에 하지만 지금은 아직이 있다면 여기 내 자원 봉사자, 나는를 찾기 위해 원하는 경우 수 (22), 난 그냥 수 없습니다 브래킷 뭔가 뭔가로 이동합니다. 나는 많은,리스트를 볼 필요가 선형 우리의 검색의 예처럼, 숫자 22를 찾을 수 있습니다. 그래서 우리는이 가격을 지불 한 것으로 보인다. 그러나 우리는 그럼에도 불구하고 수 다른 문제를 해결한다. 사실, 나를 소개하자 영상 단지 몇. 당신이 아래에 간 적이 있다면 메이의 식당 최근, 당신은 리콜합니다 그들의 이 같은 트레이의 스택, 우리는에서 이러한 빌려 수업 전에 애넌 버그. 그래서 트레이의 스택하지만, 담당자가 실제로 컴퓨터 과학 데이터 구조. 데이터 구조가 컴퓨터 과학 스택으로 알려져있는 아주 멋지게 바로이 시각에 빌려 준다. 이러한 트레이 각각은 아닌 경우 그래서 트레이하지만 숫자와 같은 내가 원 번호를 저장하기 위해, 나는 여기에 아래로 둘 수 있었다, 나는, 여기에 또 다른을 넣을 수 숫자를 쌓아 계속 서로, 그리고 무엇의 위에 이것에 대해 잠재적으로 도움이 무슨 의미라는 것이다 이 데이터 구조의? 내가 꺼내 수있는 수 먼저 가장 편리? 거기에 가장 최근에 하나 넣어. 그래서 이것은 우리가 전화를 할 것입니다 컴퓨터 과학 LIFO 데이터 구조. , 첫 번째 아웃 지속됩니다. 그리고 우리는 긴 이유 전에 볼 수 있습니다 즉, 지금은 유용하지만이 될 수 있습니다 단지 특성을 고려한다. 당신이 생각하는 경우 그리고 그것은 종류의 바보 식당이 그것을 수행하는 방법에 대한. 때마다 그들은 깨끗한 트레이 및 위에 신선한 것들을 넣어, 당신은 이전에 청소를 할 수 하지만 결국 매우 더러운 먼지 투성이 매우 하단에 트레이 당신이 경우 결코 실제로 그 하단에 도착 스택, 당신 때문에 단지 새로운 퍼팅 유지 그 위에 깨끗한 것. 같은 일이 일어날 수 슈퍼마켓에서 너무. 는 디스플레이 케이스가 있다면 우유와마다 CVS의 이상의 우유를 얻을 누구든지, 당신은 단지 우유를 밀어 이미 다시해야하고 당신은, 정면 새로 넣어 당신은 꽤 불쾌한을 할 겁니다 데이터 구조의 끝에서 우유 이 하단에 항상 있기 때문에 또는 동등 그것은 뒤에 항상. 그러나 생각하는 또 다른 방법이있다 데이터 및 예를 들어,이 일렬. 당신이 그 사람들 중 하나라면 누가 좋아 애플 매장 밖에서 줄을 때 새 제품이 온다 아웃, 당신은 아마있어 스택 데이터를 사용하지 구조 당신 때문에 모든 사람이 다른 사람이 멀리 것 안감은 새로운 장난감을 구입. 오히려, 당신은 아마 사용하고 데이터 구조의 어떤 시스템의 또는 어떤 종류의 현실 세계에서? 잘하면 라인, 또는 더욱 제대로 이상의 영국과 같은, 큐. 그리고 큐도있다 밝혀 컴퓨터 과학 데이터 구조, 그러나 큐를 가지고 매우 다른 속성입니다. 그것은 LIFO 아니다. , 첫 번째 아웃 지속됩니다. 신 금지. 대신 FIFO이다. 먼저 첫 번째 출력,. 그리고 그것은 좋은 일 공정성 '을 위해 확실히 때 안감있어 아침에 슈퍼 초. 당신은, 당신이 먼저 거기에 도착하면 첫 번째로 잘 싶어. 그리고 이러한 모든 데이터 구조, 큐와 스택 다른 사람의 움큼, 당신 밝혀 이처럼 배열을 생각할 수 있습니다. 이것은 어쩌면, 배열 고정 크기 4 있지만 좋겠 우리가 쌓아 수 있다면 가지 좋은 트레이 거의 무한히 높은 우리의 경우 많은 트레이 또는 숫자가 있습니다. 그래서 어쩌면 우리가 원하는 여기에 링크 된 목록을 사용하여, 하지만 트레이드 오프가 될 것입니다 잠재적으로 우리가 더 많은 메모리를 필요, 좀 더 시간이 필요하지만, 우리 스택의 높이를 제한하는 것은 아니다, 많은 메이의 디스플레이 케이스 등 스택의 크기를 제한 할 수있다, 그래서 이러한 디자인 결정 또는이다 궁극적으로 우리에게 사용할 수있는 옵션. 이러한 데이터 그래서 구조, 우리는 시작했습니다 잠재적으로 새로운 상한을보고 무엇에 이전에 슈퍼 빠른했다 우리는 떠나 볼 수있는 곳 오프 오늘 어디 우리는에 도착 희망합니다 수요일에, 우리는거야 데이터를보고 시작 우리가 검색 할 수 있습니다 구조 로그 종료 시각 데이터를 통해 다시. 그리고 우리는 주 제로에, 기억, 보았다 이진 검색 또는 분할과 하나 정복. 그것은 아직 다시 더 나은오고 이 수요일 성배 을 마련하는 것 진정으로 실행 데이터 구조 또는 이론적에서 일정 시간, 이에 그것은 얼마나 많은 문제가되지 않습니다 수백만 또는 사물의 수십억 우리는 데이터 구조 내에 가지고, 윌 우리에게 일정한 시간을, 어쩌면 한 단계 단계 또는 2 단계 또는 제 10 단계, 그러나 단계의 일정 번호 해당 데이터 구조를 통해 검색 할 수 있습니다. 즉 실제로 성배 될 것입니다 하지만 수요일에 해당에 대한 자세한. 다음 나중에 참조하십시오. [음악 재생]