DAVID 마란 : 좋아, 다시 오신 것을 환영합니다. 이 CS50입니다. 이것은 일주일 내내의 시작입니다. 따라서 그것은 오랜만, 그래서 우리는 거라고 생각이야 여기서 우리의 회오리 바람 투어를 그만 둔 곳에 우리는 이제 겁니다. 이 물건은 여기에있을 수 있도록 처음에 약간의 불안을 일으키는 원인이되었다. 그러나 잘 만하면, 당신을 시작하고 이 여기에 나타냅니다 무엇에 적응 - 인 포인터를 나타내는 별 더 쉽게 설명하자면에서 그냥 뭐? 그래서 주소입니다. 그래서의 주소입니다 메모리에 뭔가. 그리고 우리는 다시 껍질 레이어로 시작 몇 주 전, 상황이 좋아 하는 GetString 및 기타 기능 모든 시간은 반환되었습니다 같은 메모리 것들의 주소, 의 첫 번째 문자의 주소 어떤 순서. 그래서 우리는 또한 Valgrind의를 소개 한 이 문제에 사용할 시작합니다 특히 다음에 대한 설정 문제뿐만 아니라 설정합니다. 그리고 Valgrind는 우리를 위해 무엇을합니까? 그것은 메모리 누수를 확인하고, 또한 메모리의 남용을 확인합니다. 그것은 약간의 확률로, 검출 할 수있는 경우 코드 메모리를 만지는 것입니다 그게 간단하지 않아야합니다. 그래서 누출을 반드시 있지만, 그렇지 않은 경우 일부의 경계를 넘어 배열, 당신은 실제로 Valgrind를 실행 그 행동을 유도하면서 Valgrind는은 프로그램에서 실행되는 그것의 내부에서 실행, 당신은 얻을 것이다 다음과 같은 메시지 - "유효하지 않은 쓰기 의 몇 리콜 크기 4 " 주 전 내가 실수했다 것을 의미 너무 멀리 한 INT에 좋아 배열의 경계를 넘어. 그리고 크기 4 여기에 크기를 의미합니다 특정 INT의. 그래서 사실에 확신을 가지고 그 Valgrind의의 출력, 그것의 형식, 다만 극악이다. 그것은 혼란을 볼 수 정말 어렵다 재미있는 정보. 그래서 우리가했던 것은 단지 발췌입니다 이상의 몇 가지 중 일부 흥미로운 라인. 그러나 실현 Valgrind의의의 80 % 출력의 비트가 될 것입니다 산만. 다만 이와 같은 패턴을 보면 - 오른쪽 무효, 무효, 40 바이트를 읽고 및 블록의 일부 숫자가 분명히 있습니다 같은 키워드 잃었다. 그리고 당신이 희망을 볼 수 있습니다 몇 가지입니다 이 기능 어​​떤 추적의 종류 실수 인치 실제로 여기이 경우, 어떤 라인 내 코드는 분명히 오류인가? 했다 memory.c에라는 파일에 26 우리가 연주 한 예 시간. 그래서 malloc에​​있는 아마 아니에요. 대신 내 코드에서 아마이었다. 그래서 우리는 이것을 다시 볼 수 있습니다 다시 오래 전에. scanf와 그래서이 등장했습니다 지금까지 형태의 커플입니다. 우리는 간단히 sscanf를 보았다. 무언가의 숫자였다 당신은 당신에에 다이빙 퀴즈에 대한 준비. scanf와 실제로 무엇 CS50 라이브러리는 아래 사용하고 있어요 순서에 꽤 많은 시간 동안 후드 사용자의 입력을 얻을 수 있습니다. 예를 들어, 나는 CS50를 통해 이동하는 경우 제품 여기 내가 열어 보자 scanf와 - 0.c라고 예를 들어 오늘 그리고 그것은 매우 간단합니다. 그것은 단지 몇 줄의 코드입니다. 그러나 그것은 보여줍니다 정말 어떻게 getInt를 이 모든 시간을 일하고있다. 16 라인 여기에이 프로그램에 내가 int를 선언 할 것을 알 수 있습니다. 그래서 아무 포인터 없으며, 마법의 아무것도 이 단지 INT. 다음 라인 (17)에, 나는 메시지를 표시 번호 사용자가주세요. 그런 후반 18, 여기 scanf와를 사용합니다. 그리고 내가 지정, 같은 종류의 printf, 제가 견적을 기대 해요 퍼센트에게 나는 맺다. 퍼센트 나는 그래서, 물론, int를 나타냅니다. 그러나주의하는 무슨 번째 scanf와에 인수입니다. 어떻게 두 번째를 설명하는 것 쉼표 다음 인수? 그것은 무엇인가? 그것은 X의 주소입니다. 그래서이 때문에 제공하여 유용합니다 X의 주소와 scanf와, 무엇을하지 즉, 어떻게 그 기능을 강화할? 다만 거기에 갈뿐만 아니라, 어떻게? 그것에 변경합니다. 당신이 거기에 갈 수 있기 때문에, 그것은 일종의의 메모리의 위치를​​지도처럼. 그리고 너무 오래 당신이 제공하기 때문에 scanf와 나 이러한지도, 그와 함께 모든 기능을 함수가 갈 수 있습니다뿐만 아니라, 값을보고 있지만, 그것은 또한 수 경우에 유용 그 값을 변경 scanf와 삶의 목적은 다음과 같습니다 특히, 사용자의 입력을 스캔 키보드에서. 그리고 F는 마찬가지로 포맷 의미 printf를, F는 포맷을 나타냅니다 당신이 인쇄 할 문자열입니다. 그래서 짧은,이 라인 18은 단순히 말한다, 사용자의 INT를 읽으려고 시도 키보드에서 x의 내부에 저장 여기서 x는에서 살고 무슨 일이 생기면 주소입니다. 그리고 마지막으로, 선 19 단지 말한다, 이 경우 INT 주셔서 감사합니다. 그래서 내가 가서이 문제를 확인 할 수 있습니다. 따라서 scanf와 0을합니다. 내가 가서 확대하자 내가 함께 가서이 실행됩니다 점 scanf와 0을 슬래시. 수, 제발? 50. 50 감사합니다. 그래서 아주 간단합니다. 지금은 일을하지 않습니까? 그것은 전체 무리를 안하고있어 오류 검사. 예를 들어, 내가 협조하지 않을 경우, 나는 숫자를 입력하지 않지만 대신 나는 "안녕하세요"같이 쓰기 그 이상한이긴하네요. 일 CS50의 그리고 하나 라이브러리는 일부 우리 해왔 시간은 reprompting입니다 및 reprompting. 다시 시도 문구 리콜은 cs50.c에 있었다 그리고 그 그 getInt를있는 이유 CS50 라이브러리는 실제로 전체입니다 긴 줄의 무리, 우리가이기 때문에 이 바보 같은 것들에 대한 검사. 사용자는 포기하지 않았다 우리 사실, INT? 그 또는 그녀가 우리에게 뭔가를 줬나 알파벳 문자 셨나요? 그렇다면, 우리가 감지 할 그와 그들 고함. 하지만 일이 더 흥미있어 이 다음 예제합니다. 내가 scanf와-1.C에 가면, 무엇 하나입니다 근본적으로 변경됩니다 것 이 다음 예제? 나는 물론, 문자 *를 사용하고 있습니다 int 대신. 때문에 char *로 그래서는 재미있다 기억, 그냥 정말 문자열 같은 것. 그래서 아마 같은이 슈퍼 느낌 하는 GetString의 간단한 구현. 하지만 레이어를 다시 벗겨습니다 CS50 라이브러리, 난 그렇게 지금이 문자 *를 호출. 그럼 보자, 어디, 어디에서든지 경우 우리가 잘못. 라인 17 - 나는 다시 나에게 뭔가를 준다, 말 이 경우 문자열입니다. 그리고 그 다음 줄에, 나는 scanf와 전화 다시, 그것을 형식 코드를 제공, 이번에 퍼센트의. 다음이 시간, 난 그것을 버퍼를 제공. 지금은 사용하지 않는거야, 알 앰퍼샌드. 왜 여기가 아마 OK입니까? 이미 버퍼에 무엇 때문에? 그것은 이미 포인터이다. 그것은 이미 주소입니다. 그리고하자이 단어 나하자 "혼란"의 단지를 위해, 예를 들면, 그것의 전화 단순. 하지만 그것은 버퍼라고 한에 있기 때문에 일반, 프로그래밍, 당신은이 있다면 메모리 청크, 문자열 정말 다만, 당신은 버퍼를 호출 할 수 있습니다. 그것은 정보를 저장하는 장소입니다. 때 유튜브 같은 것들과 유사 그들은 말하자면, 버퍼링하고 그 그냥에서 비트를 다운로드 뜻 인터넷에 저장 지역 배열, 그래서 메모리의 지방 덩어리 당신은하지 않고 나중에 볼 수있는 그것은 건너 뛰는에 매달려 당신이 재생하는 동안. 그래서 문제는,하지만 여기있다 내가 scanf와를 말하고 있기 때문에 기대 사용자로부터 문자열입니다. 여기의 주소입니다 메모리 덩어리. 거기에 문자열을 넣습니다. 왜 바운드주고있다 하지만 우리는 문제? 그게 뭐야? 내가 액세스 할 수 있습니까 메모리의 일부? 당신도 알다시피, 나도 몰라. 버퍼를 초기화 되었기 때문에 무엇을? 정말. 그리고 그것은 우리가 호출 봤는데 무슨 쓰레기 값하는 공식적인 단어가 없습니다. 그것은 단지 우리가 어떤 비트 아무 생각이 없음을 의미 그 4 바이트의 내부에 나는 버퍼로 할당했다. 내가 malloc을 호출하지 않았습니다. 나는 확실히하는 GetString 호출되지 것. 그래서 사람들은 실제로 알고 버퍼 안에? 아직 scanf와 말하는 것은 맹목적으로, 거기에 갈 그리고 사용자가 입력 한 어떤 넣어. 그래서 일으킬 것입니다 우리의 코드에서 우리는 그것을 실행하는 경우? 아마이 segfault가. 어쩌면, 그러나 아마이 segfault가. 그리고 내가 말할 아마 때문에 때로는 당신은 때때로 수행 당신은 segfault을 얻을하지 않습니다. 가끔은 그냥 운이 있지만, 그럼에도 불구있을거야 우리의 프로그램의 버그가 수정되었습니다. 그래서 내가 가서이 문제를 컴파일 할 수 있습니다. 나는 오래된 학교 방법 할거야. 그래서 연타 돌진 0, scanf와-1, scanf와-1.c를 입력합니다. 죄송합니다, 너무 오래된 학교. 보자. 내가 어디에 있습니까? 아, 숯불 * 버퍼입니다. 아, 감사합니다 - OK 저장 - 아주 오래된 학교. 좋아, 그것은 오랜만이야. 그래서 난 그냥 파일 후를 저장 한 그 임시 만들기 순간 전 변경합니다. 그리고 지금 나는 그것을 컴파일 수동으로 연타와 함께. 그리고 지금 나는 앞서 갈거야 및 입력 scanf와-1을 실행합니다. 문자열 주시기 바랍니다. 난에 입력합니다 "안녕하세요." 그리고 지금, 여기에 printf는 솔직히 어디에 조금 성가신 수 있습니다. 실제로 안 갈거야 이 경우 세그 폴트. printf를 조금 특별하기 때문에 그것은 일반적으로 사용하므로 슈퍼이야 기본적으로 printf를하고있다 우리는 호의와 실현, 즉, 유효한 포인터 아니다. 자신이 방금 인쇄에 내가 그것을 보자 괄호 널의 아웃도 그것이 반드시 아니에요하지만 무엇 우리는 자신이 예상. 그래서 우리는 정말 쉽게 유도 할 수 이 명확이 함께 segfault가 있지만, 내가 원하는 동작을하지 않습니다. 그래서 간단한 해결책은 무엇인가? 음, scanf와-2, 내가 제안하자 그 대신 실제로 단지를 할당 문자 *는, 내가 좀 똑똑 대한하자 이것은 나를 버퍼를 할당하자 16 문자의 시퀀스로. 그래서 몇 가지 방법으로이 작업을 수행 할 수 있습니다. 나는 절대적으로 malloc을을 사용할 수 있습니다. 하지만 일주일에 두로 돌아갈 수있을 때 나는 단지의 전체 무리를 필요로 자. 그건 그냥 배열입니다. 그럼 내가 대신 버퍼를 다시 정의하자 16 문자의 배열입니다. 그리고 지금은 언제에 버퍼를 전달합니다 - 이것은 우리가하지 않았다 뭔가 주 두 이야기 - 하지만 당신은 배열로 처리 할 수​​ 있습니다 그것은 주소가 비록. 우리가 보았 듯이 기술적으로, 그들은있어 조금 다른. 당신이 그것을 전달하는 경우에 scanf와는 상관 없습니다 배열의 이름 때문에 어떤 우리가 본질적 위해 연타 할 것 로 그 배열의 이름을 치료 16 바이트의 청크의 주소를 입력합니다. 그래서 더 낫다. 이 지금은 희망 할 수 있다는 것을 의미 다음을 수행하십시오. 저 순간을 축소하자 OK 컴파일 scanf와-2을 다하겠습니다. 지금 나 슬래시 scanf와-2를 가지고하자. 문자열 주시기 바랍니다. "안녕하세요." 그리고 이 시간을 작동하는 것 같았다. 하지만 누군가 시나리오를 제안 할 수있다 하는 그것은 여전히​​ 작동하지 않을 수 있습니다? 그래? 16 자 이상인가. 실제로, 우리는 할 수 있습니다 좀 더 정확한. 더 이상 다음 15 자인가, 정말 우리가 염두에 두어야 할 필요가 있기 때문에 우리는 백 슬래쉬 제로를 필요로하는 암시 적 문자열의 끝에서, 이는 따로 scanf와 일반적으로 것입니다 우리의주의를 기울입니다. 그래서 내가 뭔가를 할 수 있도록 - 때때로 우리는 단지 수 그런 식 둡니다. 좋아, 그럼 우리는 이제 유도 한 우리의 세그먼트 오류. 왜? 저는 15 이상에 입력했기 때문에 자, 그래서 우리가 실제로했습니다 감동하는 메모리 I 실제로 필요는 없습니다. 그래서 정말 여기에 솔루션입니다? 음, 우리는 긴 문자열이 필요하면? 음, 우리는 어쩌면 32 바이트합니다. 그럼, 그 충분히 아니라면? 방법에 대한 64 바이트? 무슨 긴 충분하지 않습니다 경우에? 어떻게 약 12​​8 또는 200 바이트? 무엇이 정말 여기에 솔루션입니다 일반적인 경우, 우리는 알고하지 않은 경우 사용자가 입력하는 무슨 진출? 그것은 엉덩이에 큰 고통을이긴하네요 솔직히 말해서, 이것은 이유 CS50 라이브러리의 수십 라인이 총체적으로 구현 코드 우리가하지 않는 방식으로 문자열을 getString에 사전에 알고 있어야 어떤 사용자가 입력하는 것입니다. 특히 경우에 당신은 회고 cs50.c 2 주 전에에서, 당신은 볼 것이다 그하는 GetString 실제로 수행 이 방법으로 scanf와 사용하지 마십시오. 오히려, 그것은 하나의 문자를 읽고 시간. 때문에 대한 하나의 좋은 점 하나의 문자를 읽는 것은 우리가 할 수있는 것입니다 항상 자신을 보장 적어도 하나의 문자가있다. 난 그냥 받아 다음 문자를 선언 할 수 있습니다 다만 이러한 진정으로 아기 단계 에서의 한 문자를 읽어 키보드에서 시간입니다. 그리고, 당신은 무엇을하는 GetString을 볼 수 있습니다 수행은, 그것의 밖으로 실행하는 모든 시간 메모리의 16 바이트라고, 그것은 사용 malloc에​​, 또는 사촌 이들에 오래된, 복사, 더 많은 메모리를 할당 그 새, 그리고 포복으로 메모리 따라서, 한 번에 하나의 문자를 받고 그리고 그 부족할 때 메모리 청크, 잡고 그것을 멀리 던졌습니다 메모리의 큰 덩어리는 옛 복사 새로운, 그리고 반복에. 그리고 그것은 실제로는 정말 고통 처럼 간단한 무언가를 구현 사용자로부터 입력을 받고. 그래서 당신은 scanf와 사용할 수 있습니다. 당신은 다른 유사한 기능을 사용할 수 있습니다. 그리고 교과서의 많은 온라인 예 않지만, 모든이야 이 같은 문제에 취약합니다. 그리고 궁극적으로는 segfault가 점점 어떤 성가신입니다. 그것은 사용자에 대한 좋지 않다. 그러나 최악의 경우, 어떤 작업을 수행 그것은 근본적으로 당신을 넣어 위험에 코드? 공격의 일종, 잠재적으로. 우리는 그러한 공격에 대해 이야기 - 스택 오버플로. 그러나 일반적으로, 당신이 허용하는 경우 오버 플로우 버퍼처럼 우리는했다 그냥 쓰는 전 몇 주, 더 스택에 "안녕하세요"대신, 실제로, 잠재적 인수 할 수 컴퓨터, 또는 적어도 데이터를 얻을이 당신에 속하지 않습니다. 우리가 왜 그렇게 짧은이 있습니다 이러한 훈련 바퀴. 하지만 지금, 우리는 그들을 데리고 시작 우리의 프로그램은 더 이상 필요하지 않기 때문에, 사용자로부터 반드시 입력. 그러나 문제의 경우에, 여섯 세트 귀하의 의견은 거대한에서 올 것이다 150와 사전 파일 일부 이상한 천 단어. 그래서 당신은 걱정하지 않아도됩니다 사용자의 임의의 입력. 우리는 당신에게 몇 가지 가정을 줄 것이다 해당 파일에 대한. 포인터 나 scanf와에 대한 문의 또는 일반적으로 사용자 입력? 좋아, 그래서 1에서 다음 간단히 살펴 2 주전에서 항목을 후행. 그리고 그 구조체의이 개념이었다. 하지 않음 -이 개념 무슨 일이 있었던, 구조체? 구조체는 우리를 위해 무엇을 했는가? 정의 - 죄송합니다? 변수 유형을 정의합니다. 그래서 정렬. 우리는 실제로 두 개의 주제를 조합하고 있습니다. 형식 정의에 그래서, 우리가 할 수있는 기억 처럼 우리 자신의 유형을 선언 문자 *를위한 문자열처럼 동의어. 그러나 형식 정의와 구조체를 사용하여, 우리는 할 수있다 진정으로 우리 자신의 데이터 구조를 만들 수 있습니다. 예를 들어, 내가 다시 가면 gedit를로 여기에 단지 잠시 동안, 나는 가서 뭔가 같이 할, 내가 저장할 수 이 같이 structs.c, 보자 일시적으로, 난 그냥 갈거야 가서 포함하는 standardio.h, 주요 int 무효. 그리고 여기, 내가 원하는 가정 저장하는 프로그램을 작성 복수의 여러 학생들 주택, 예를 들면. 그래서 registrarial처럼 어떤 종류의 데이터베이스입니다. 내가 이름을 한 학생을 필요로하는 경우에, I , char *로 이름처럼 뭔가를 할 수 있습니다 내가 뭔가를 할 수 있습니다 - 실제로,의는 CS50 라이브러리를 사용할 수 있도록 잠시이를 만들기 위해 좀 더 간단, 그래서 우리는 빌릴 수 있습니다 줄의 코드들을 수십. 그리고하자 그냥 간단하게있어. 우리는 그것이 문자열하겠습니다 지금하는 GetString. 그래서 내가 이름을 저장 했으므로 이제 주장 일부 학생, 그리고 집 단순히 변수를 사용하여 일부 학생 우리는 한 주일에 일인치처럼 하지만 지금은 지원한다고 가정 여러 학생. 좋아, 그래서 내 직감 할 수 있습니다 문자열 NAME2가하는 GetString, 문자열을 가져옵니다 하우스 2가하는 GetString 가져옵니다. 그리고 세 번째 학생 NAME3하는 GetString을하자. 좋아, 그래서 이것은 잘하면 눈에 띄는입니다 바보의 종류 같이, 이 과정은 정말 결코 없기 때문에 끝날지, 그리고 그냥가는거야 내 코드가 더 보이게 그리고 더 악화. 그러나 우리는 일주일에 두 너무이 해결했다. 우리의 비교적 깨끗한 해결책은 무엇인가 우리의 여러 변수가있을 때 동일한 데이터 모두와 관련된 유형 만 우리는이 극악한 혼란을 원하지 않았다 비슷한 이름의 변수? 우리는 대신에 무엇을 했는가? 그래서 제가 몇 군데를 들었다 생각합니다. 우리는 배열을했다. 당신의 여러 인스턴스를하려는 경우 뭔가, 왜 우리는이 모든 청소하지 마십시오 위로 다만 저에게 말 배열 이름이라고? 그리고 지금은 하드 코드 3하자. 그리고 그 때 저에게 또 다른 배열을 제공합니다 집 전화, 그리고 저를 보자 지금은 하드 코딩 3. 그리고 대규모을 청소했습니다 내가 방금 만든 엉망. 지금, 나는 여전히 하드 3 코딩 왔지만도 3 동적에서 올 수 사용자 또는 ARGV, 나처럼. 그래서 이미 클리너입니다. 하지만 이것에 대해 성가신 것은이다 지금은 비록 이름은 어떻게 든입니다 기본적으로 연결 학생의 집 - 그것은 내가 정말 학생의 나타내려면 - 지금은 평행 한 두 개의 배열을 가지고 그들은 걸 의미에서 같은 크기, 이름 브래킷 0 주택 브래킷 0 ~ 아마지도, 와 이름 브래킷 1지도 집에 브라켓 1. 다른 말로하면, 그 학생의 삶 그 집, 그리고 다른 학생의 다른 집에서 살고있다. 그러나 확실하게이 될 수 더욱 깔끔하게 수행. 음, 수, 사실과. 그리고 내가 가서 열게 structs.h까지, 당신은거야 여기이 아이디어를 참조하십시오. 당신과 내가 typedef를 사용한 것을 알 수 전 선언하는 순간에 언급 우리 자신의 데이터 형식입니다. 그러나 나는 또한 다른 키워드를 사용하고 있습니다 구조체라고하는 저에게 새로운을 제공합니다 데이터 구조. 그리고 주장이 데이터 구조는 것입니다 내부의 두 가지를 가지고 그것은 - name이라는 문자열 및 집이라는 문자열입니다. 그리고 난거야 이름을주는 이 데이터 구조는 것입니다 학생이라고 할 수 있습니다. 나는 그것을 내가 원하는 무엇이든을 호출 할 수 있습니다 하지만이 의미 확인 내 마음에서 나에게 의미. 그래서 지금은 더 나은 버전을 열 경우 프로그램의 내가 쓰기 시작 거기 저 상단으로 이동하자. 그리고 코드를 좀 더 줄이있다 여기에,하지만 나를 집중할 수 있도록 하나 순간. I는 상수라는 학생을 선언 한 하드 지금은 3 코딩. 하지만 지금은 알 청소하는 방법 내 코드를 얻을 시작합니다. 라인 (22)에서는, 선언 학생의 배열입니다. 학생이 분명히 있음을 알 수 이제 데이터 형식입니다. 이 파일의 상단에 알 수 있기 때문에 그 헤더 파일을 포함했습니다 내가 잠시 전에 뽑아합니다. 그리고 헤더 파일은 매우 간단했다 학생이 정의. 그래서 지금, 난 내 자신의 사용자 지정 데이터를 만들었습니다 입력하는 C 년의 저자 전 미리 생각하지 않았다. 하지만 문제는. 나는 그것을 자신을 만들 수 있습니다. 그래서이 학생이라는 배열 그 구성원 각각의 학생 구조입니다. 그리고 나는 그 세 가지를 원하는 배열합니다. 그리고 지금, 나머지는 무엇을합니까 이 프로그램합니까? 조금 임의의 무언가를 필요로했다. 그래서 온라인 24 이후의, I 0에서 3까지 반복. 그런 다음에 대한 사용자 요청 학생의 이름을 입력합니다. 그리고 나서 이전과 getString에 사용합니다. 그럼 난, 학생의 집 부탁드립니다 나는 전과 같이하는 GetString을 사용합니다. 그러나주의 - 약간 새로운 구문의 조각 - 나는 i 번째 학생에게 여전히 인덱스 수 하지만 특정 데이터를 어​​떻게받을 수 있나요 구조체의 필드 안에? 음, 확실히 무엇 새 구문의 조각? 그것은 단지 도트 연산자입니다. 우리는 정말이 전에 본 적이 없다. 당신이 한 경우는 pset에 다섯에 본 비트 맵 파일에 이미 뛰어 들었다. 그러나 점은 이것의 내부 의미 구조체 또는 여러 필드는 점을 제공 이름 또는 저에게 도트 집을 제공합니다. 구조체 내부에 갈 것을 의미합니다 그 특정 필드를 얻는다. 이 프로그램의 나머지 부분은 무엇입니까? 그것은 모든 섹시한 아니다. 내가 다시 0에서 3까지 반복 통지, 나는 단순히 영어를 생성 너무나 같은 문구는 및에 에서 점 이름을 전달 같은 집, i 번째 학생 자신의 집뿐만 아니라. 그리고 마지막으로, 지금 우리가 얻을 시작합니다 우리가있어 지금하는이에 대한 항문, 어떤 malloc을하고 익숙한 다른 기능은왔다 이 모든 시간을 일. 이유는 두 이름을 해제해야합니까 및 집, 비록 I malloc을 호출하지 않았다? 하는 GetString을했다. 그리고 그의 더러운 작은 비밀이었다 몇 주 만하는 GetString가 모두에 메모리가 누수되고 지금까지 모든 학기를 놓습니다. 그리고 valgrand 마침내 것 우리에게이 공개. 내가 알고 있기 때문에 그러나 그것은 큰 문제가 아니다 나는 단순히 이름을 해제 할 수 와 집, 비록 기술적으로 초, 최고 안전, 내가해야 일부 오류를하는 것은 여기에서 확인. 본능은 당신에게 무엇을 말하고 있습니까? 나는 무엇을 확인해야한다 나는 무엇 해제하기 전에 문자열, 일명하는 문자 *? 정말 확인해야 학생들 경우 브래킷 나는 점 이름은하지 않습니다 같은 널 (null). 그런 다음 앞서 무료 이동 OK있을거야 이 포인터와 동일하거나 다른 하나뿐만 아니라. 학생 브래킷 나는 점 집이없는 경우 널 (null)에 해당이 지금 보호합니다 각 케이스에있는 하는 GetString은 null과 같이 반환합니다. 그리고 우리는 printf의 것, 순간 전보고 다만 말씀으로 우리를 여기까지 보호 null이되는 이상한 보는 것입니다. 하지만 적어도 그것은 segfault가 없습니다 우리가 본 바와 같이. 물론, 내가 여기에 다른 일을 할 수 있습니다. 구조체-0 바보 같은 프로그램의 종류 그런 다음 모든 데이터를 입력하기 때문에 프로그램이 종료되면 그것을 잃었다. 그러나 내가 가서이 작업을 수행 할 수 있습니다. 나 터미널을 만들자 조금 큰 창. 나를 구조체-1를하게하는 이것의 새로운 버전입니다. 나는 조금 확대됩니다. 그리고 지금 저 점을 실행할 수 구조체-1을 슬래시. 학생의 이름 - 데이비드 메이는, 롭 커클랜드을하자 로렌 Leverett을하자. 흥미로운 것은 지금 고시 - 나는 단지이 때문에 알고 내가 프로그램을 작성 - 파일 내 현재 지금 거기 디렉토리 students.csv을했다. 여러분 중 일부는 볼 수도 현실 세계에서 이러한. CSV 파일은 무엇입니까? 값을 쉼표로 구분. 그것은 가난한 사람의 같은 종류의의 Excel 파일의 버전입니다. 그것은 행과 열 테이블의이 당신은 Excel과 같은 프로그램에서 열 수 있습니다 맥 또는 숫자. 그리고 저는 gedit를 여기에이 파일을 열 경우, 공지 사항 -와 숫자가 없습니다. 그건 그냥 말 Gedit에있어 나 행 번호. 이것의 첫 번째 줄에 알 파일은 다윗과 메이입니다. 다음 줄 롭 쉼표 커크이다. 그리고 세 번째 줄 로렌 쉼표 Leverett. 그래서 내가 무엇을 만들었습니다? 이제 C 프로그램을 작성했습니다 그 효율적으로 스프레드 시트를 생성 할 수 있습니다 에서 열 수 Excel과 같은 프로그램입니다. 모든이 뛰어난 데이터 세트 만 당신은 훨씬 더 큰 덩어리가있는 경우 당신이 실제로 할 데이터 조작 및 그래프를 만들기 좋아,이 아마 하나입니다 데이터를 생성하는 방법입니다. 또한, CSV를 일반적인 실제로 최고입니다 그냥 간단하게 데이터를 저장하기위한 - 야후 금융, 예를 들어, 당신이 얻을 경우 그들의 소위를 통해 주가 API, 당신을 할 수있는 무료 서비스 현재까지 - 투 - 날짜 주식을 얻기 기업 지수, 그들은 다시에있는 데이터를 제공합니다 슈퍼 간단한 CSV 형식입니다. 그래서 우리는 어떻게 한거야? 음,이 프로그램의 대부분을 통지 거의 동일합니다. 하지만 여기까지 주목하기보다는 인쇄 선 35 명 중, 이후, 난을 저장 해요 주장 디스크 학생, 그래서 파일을 저장. 그래서 FILE *를 선언하고있어 주목 - 지금,이 C의 기형의 종류 어떤 이유로 들어, FILE은 모두 대문자입니다 이는 대부분의 다른 데이터 형식처럼되지 않습니다 C에서하지만이는 내장 데이터 형식, 파일 *. 그리고, 파일에 대한 포인터를 선언하고있어 당신이 생각할 수있는 방법이다. 하면 fopen은 파일 열기를 의미한다. 당신은 어떤 파일을여시겠습니까? 내가 파일을 열려면 나는 것 임의 students.csv를 호출합니다. 내가 원하는 그 무엇이든 호출 할 수 있습니다. 그리고 생각을. 두 번째 인수는 무엇입니까 하면 fopen은 아마 의미하는? 오른쪽, 쓰기에 대한 W, 수 r은 읽기해야합니다. 경우에는 APPEND를 위해 거기이다 행과하지를 추가 할 전체를 덮어 씁니다. 하지만 난 그냥이 파일을 만들려면 일단, 내가 인용 맺다 w를 사용합니다. 내가 읽은에서 만 알고 문서 나 매뉴얼 페이지를 참조하십시오. 파일이 null가 아닌 경우 - 즉, 아무것도 잘못된없는 경우 - 내가 반복하자 0에서 3 학생. 그리고 지금 무언가가 알 도 다소 여기에 대한 선 41. 그것은 printf는 아니다. 그것은 printf의 파일을 fprintf를이다. 그래서 파일에 쓸거야. 어떤 파일? 그 포인터가 지정하는 하나의 첫 번째 인수로. 그렇다면 우리는 형식 문자열을 지정합니다. 그 다음 우리는 우리가하고 싶은 문자열 지정 첫 번째 퍼센트 초 동안 연결하고, 다음 다른 변수 또는 두 번째 퍼센트의. 그럼 우리가 FCLOSE하여 파일을 닫습니다. 그래도 이전처럼 메모리를보다 나는 다시 가서 추가해야합니다 널위한 몇 가지 확인합니다. 그리고 그것입니다. 하면 fopen은 fprintf를, FCLOSE 날을 제공 텍스트 파일을 생성 할 수있는 능력. 지금, 당신은 문제 세트 다섯 볼 수 있습니다 이미지를 포함하는, 당신은 사용할 수 있습니다 바이너리 파일 대신에. 그러나 근본적으로, 아이디어는 동일합니다 비록 당신이거야 기능 조금 다릅니다 참조하십시오. 회오리 바람 투어 그래서,하지만 당신은 얻을 것이다 파일을 너무나 잘 알고 I/O-- 입력 및 출력 - PSET 다섯과 함께. 그리고에 대한 질문 여기에 초기 기본? 그래? 당신이 null 값을 해제하려고하면? 무료를 얻었다 않는 한, 생각 좀 더 사용자 친화적 할 수 있습니다 잠재적 인 세그 폴트. 내가하지 않기 때문에이 null로 전달하면 나쁜 무료 믿고, 당신을 확인하는 귀찮게 잠재적으로 낭비 될 수 있기 때문에 그것 자체를 수행하는 시간의 세계의 모든 사람. 좋은 질문,하지만. 자, 이런 종류의 가져 너무 우리 흥미로운 주제에. 문제 세트의 테마 다섯 법의학이다. 적어도 그건 일부의 문제 세트. 법의학은 일반적으로 말한다 수도 있고 정보의 복구 삭제되지 않았을 수 있습니다 일부러. 그래서 난 당신에게 빠른 줄 줄 알았는데 어떤 맛이 정말 벌어지고 아래의이 시간 컴퓨터 후드. 예를 들어, 내부이 경우의 노트북이나 데스크톱 컴퓨터 하드 드라이브, 그것도 기계의 실제로 회전 장치 ​​- 플래터라는 원형 것들이있다 꽤 어떻게 생겼는지 I 다만 불구하고, 여기에 화면에 있었다 이 점점 더 오래된 학교입니다. 이 3 반 인치입니다 하드 드라이브. 세와 반 인치의 의미 당신이 그것을 설치하는 것은의와 컴퓨터합니다. 이제 노트북에서 여러분의 많은 사람 , 솔리드 스테이트 드라이브 또는 SSD를이 이것은 움직이는 부품이없는이 없습니다. 그들은 RAM과 같은 더 적은 같아 이 기계 장치. 하지만 아이디어는 여전히 동일합니다 확실히 그들은 관계로 문제는 다섯 가지를 설정합니다. 그리고 당신은 하드 드라이브에 대해 지금 생각하면 어떤 원, 인 대표 여기 이런 식으로 그릴 수 있습니다. 당신은 당신의 컴퓨터에있는 파일을 만들 때 그것은 SSD, 또는의 여부 이 경우, 이전 학교의 하드 드라이브, 이 파일은 여러 비트를 포함한다. 의 그것은이 0과 1 가정 해 봅시다, 0과 1의 전체 무리. 그래서 내 전체 하드 드라이브입니다. 이 분명히 꽤 큰 파일입니다. 그리고 그에서 0과 1을 사용하고 있습니다 물리적 인 플래터 부분입니다. 글쎄, 물리적 부분은 무엇입니까? 잘, 그것은 하드 드라이브에 그렇게 밝혀 이러한 유형의 적어도 거기 이 작은 작은 자기 입자. 그리고 그들은 본질적으로 북쪽을 가지고 그들에게 남극, 그래서 만약 당신이 이러한 자성 입자 중 하나를 설정 이 방법은, 당신은 있다고 말할 수 1을 나타내는. 그리고 그것은 거꾸로 아래로 남쪽의 경우 북쪽으로, 당신은 그것이 있다고 말할 수 0을 나타내는. 그래서 실제 물리적 인 세계에서, 그게 당신이 뭔가를 나타낼 수있는 방법 이진 0의 상태 1. 그래서 모든 파일이 있습니다. 자기의 전체 무리가있다 자신이 방법 또는이다 입자 이 방법으로 생성, 패턴 의 0과 1. 그러나, 당신은 파일을 저장할 때 밝혀 일부 정보는 별도로 저장됩니다. 그래서 이것은, 작은 테이블 디렉토리는, 말하자면. 그리고이 열 이름을 호출하고 있습니다 이 칼럼의 위치를​​ 호출합니다. 그리고 가정 말할거야 이 이력서입니다. 내 resume.doc은에 저장됩니다 위치 123 가정 해 봅시다. 난 항상 그 번호에 대한 이동합니다. 하지만 단지 좋아하는 말을 충분 RAM에, 당신은 하드 드라이브를 걸릴 수 있습니다 즉, 기가 바이트 또는 200기가바이트의 또는 테라 바이트, 당신은 할 수 있습니다 수의 모든 바이트. 당신은 8 비트의 덩어리를 셀 수 있습니다. 그래서 우리는이 말을합니다 위치 123. 그래서 내 운영이 디렉토리 안에 시스템이 기억하는 내 이력서는 위치 123입니다. 그러나 때 흥미로운 당신은 파일을 삭제합니다. 예를 들어 이렇게 - 그리고 다행히도, 세계의 대부분이 이에 잡힌 - 어떻게 때 발생 당신은 맥 OS의 파일을 휴지통으로 드래그 또는 Windows 휴지통? 그 일을하는 목적은 무엇입니까? 그것은 파일을 없애 분명의 하지만 드래그의 행동을 수행하고 휴지통 또는에 떨어지고하여 휴지통 컴퓨터에 있습니까? 정말 아무것도 없습니다. 그냥 폴더처럼. 그것은 확실하게, 특수 폴더입니다. 하지만 실제로 파일을 삭제합니까? 아니, 글쎄, 당신 때문에 아마도 중 일부 같이했습니다 젠장, 오, 당신은하지 않았다 이 작업을 수행하는 의미합니다. 그래서 당신은 두 번 클릭 휴지통. 당신은 주변에 찌르고어요 그리고 당신은 복구했습니다 그냥 드래그하여 파일을 거기서. 그래서 분명히, 그것은 반드시 아니에요 을 삭제. OK, 당신은 똑똑 이상입니다. 당신은 알고 그냥으로 끌어 휴지통 또는 휴지통을 의미하지 않는다 당신이 휴지통을 비우는 중입니다. 그래서 당신은 최대 메뉴로 이동, 당신은 말한다 휴지통을 비우거나 휴지통 비우기. 그럼 뭐가됩니까? 그래, 그래서 더 그렇게 삭제됩니다. 그러나 모든 사건이있다. 컴퓨터가 위치를 잊어 버린 resume.doc했다. 하지만 분명히 변경되지 않았습니다 그림에서? 비트는, 내가 주장하는 0과 1은 일부 물리적 측면의 사이트 하드웨어. 그들은 아직도 거기에있어. 그냥 컴퓨터가의 잊혀진 그들이이다. 따라서 그것은 본질적으로 해방있어 파일의 그들은 재사용 할 수있는 비트 수 있도록. 하지만 당신은 더 많은 파일을 생성 할 때까지 더 많은 파일을, 더 많은 파일이됩니다 확률 적으로 그 0과 1, 이러한 자성 입자는 다시 얻을, 에 맞거나 오른쪽 위로, 다른 파일, 0과 1. 그래서 당신은 시간이 창을했습니다. 그리고 그것은 예측이 아니야 길이, 정말. 그것은 하드의 크기에 따라 달라집니다 드라이브에 얼마나 많은 파일이 있고 얼마나 빨리 당신이 새로운 것들을합니다. 그러나 시간이 창 중에있다 해당 파일은 완벽 아직입니다 복구. 당신은 맥아피 같은 프로그램을 사용하므로 경우 또는 노턴 복구를 시도합니다 데이터, 그들이하고있는 모든 위해 노력하고 소위 디렉토리를 복구 파일이 어디에 있는지 알아 내기. 그리고 때때로 노턴과는 말할 것이다 파일은 93 % 복구 할 수 있습니다. 글쎄, 그게 무슨 뜻 이죠? 그냥 의미가 다른 파일 우연히 말을 사용하여 종료 원본 파일의 밖으로의 비트. 그래서 실제로 어떻게 관련되어 데이터를 복구하는? 글쎄, 당신은 뭔가가없는 경우 노턴은 컴퓨터에 미리 설치 가끔 할 수있는 최선 볼 수 있습니다 전체 하드 드라이브를 찾고에 비트 패턴입니다. 그리고 문제 세트의 테마 중 하나 다섯 당신이 검색하는 것입니다 하드 드라이브의 상당 법정 에서 컴팩트 플래시 카드의 이미지 0S를 검색 디지털 카메라, 높은과 그 일반적으로과 1, 확률을 나타냅니다 JPEG 이미지의 시작. 그리고 너희들하여 해당 이미지를 복구 할 수 있습니다 나는이 패턴을 보는 경우에, 가정 법의학 이미지 비트와 표시 높은 확률, JPEG의 시작. 그리고 나는 다시 동일한 패턴을 보면, 그 아마의 시작을 표​​시 다른 JPEG, 다른 JPEG, 다른 JPEG. 이 일반적으로 어떻게 데이터 복구가 작동합니다. 무엇 JPEG 파일에 대한 좋은 것은 비록입니다 파일 형식 자체가 다소 있습니다 이러한 모든 복잡한, 시작 파일은 실제로 상당히 식별 할 수 , 당신이 볼 수 있듯이 간단한 당신이 이미없는 한 경우. 그럼 그 아래에 좀 더 자세히 살펴 보자 됐어요 정확히 무엇으로 후드 일어나고, 이러한 0과 1 무엇을 당신의 조금 더주고,이다 이 특정 문제에 대한 상황. [동영상 재생] 당신의 PC는 대부분의 상점 - 어디로 영구 데이터. 이렇게하려면 데이터가 RAM에서 여행 말할 소프트웨어 신호와 함께 어떻게 데이터를 저장하는 하드 드라이브. 하드 드라이브 회로 번역 전압으로 그 신호를 변동. 이들은 차례로, 하드 드라이브의 제어 움직이는 부분, 몇 가지 중 일부 에 남아있는 움직이는 부품 현대 컴퓨터. 신호의 일부는 모터를 제어 이는 금속 코팅 플래터를 회전합니다. 데이터가 실제로 저장 이 플래터에. 다른 신호는 읽기 / 쓰기를 이동 읽거나 머리 플래터에 데이터를 기록합니다. 이 기계 때문에 정확한 인간이 머리도 사이를 통과 할 수 없습니다 머리와 회전 플래터. 그러나, 모든 훌륭한 속도로 작동합니다. [END 동영상 재생] DAVID 마란 : 약간 확대 깊은 지금 무엇에 실제로 이러한 플래터합니다. [동영상 재생] 의 볼게 우리 단지에 슬로우 모션으로 보았다. 전기의 짧은 펄스 경우 화나게 경우, 읽기 / 쓰기 헤드로 전송 에 대한 작은 전자에 두 번째의 분수. 자석은 어떤 필드를 생성 변화 작은, 작은의 극성 금속 입자의 부분에있는 코트 각 플래터 표면을. 이 작은의 패턴 시리즈, 디스크에 청구 밀집 지역 의 단일 비트를 나타냅니다 이진수 데이터 컴퓨터에서 사용하는 시스템. 지금 전류가 전송되는 경우 하나의 방법 읽기를 통해 / 지역을 쓰기 헤드 한 방향으로 편광이다. 전류에 전송되는 경우 반대 방향, 분극 반전됩니다. 당신은 하드 디스크에서 데이터를 얻을 수 있습니까? 그냥 과정을 역으로 수행합니다. 따라서 디스크에있는 입자의 그에서 현재를 얻을 머리가 움직이는 읽기 / 쓰기. 이들의 수백만을 함께 넣어 자기 부문, 그리고 당신은 파일을 가지고있다. 이제 단일 파일의 조각 월 모든 드라이브에 걸쳐 분산 될 수 난장판 같은 종류의 플래터, 책상 위에 서류. 그래서 특별한 추가 파일을 추적 모든 곳의. 당신은 당신이 가지고하지 않으 뭐 그런? [END 동영상 재생] DAVID 마란 : OK, 아마. 그렇다면 많은 사람 이들과 함께 자랐? OK, 그래서 적은과 더 적은이다 손 매년. 하지만 난 당신이 적어도 잘 알고 기뻐 그들과 함께,이 때문에 우리 자신의 책 데모는, 슬프게도, 아주 죽어있다 친숙 여기에 죽음을 천천히. 그러나 이것은 적어도 뒤에, 내가있다 고등학교, 백업에 사용되는 사용합니다. 그리고 그것은 훌륭했다, 당신 때문에 에 1.4 메가 바이트를 저장할 수 이 특정 디스크입니다. 그리고 이것은 고밀도 버전이었다 등이 HD로 표시 오늘의 HD 동영상을하기 전에 의미합니다. 표준 밀도는 8백킬로바이트했다. 그리고 그 전에이 있었다 400 킬로바이트 디스크. 그리고 그 전에, 5, 1 / 4이 있었다 정말로 플로피 하였다 인치 디스크, 그리고 약간 넓고 키 여기에 이​​런 것들보다. 그러나 당신은 실제로 소위를 볼 수 있습니다 이러한 디스크의 플로피 측면. 기능적으로, 그들은 실제로있어 에서의 하드 드라이브에 매우 유사 최소한이 유형입니다. 새 컴퓨터에 다시 SSD를 약간 다르게 작동합니다. 하지만 당신은 그 작은 금속 탭을 이동하면, 실제로, 약간의 쿠키를 볼 수 있습니다 또는 플래터. 그것은이 같은 금속이 아니다. 이 하나의 사실은 약간 저렴 재질 플라스틱. 그리고 당신은 호기심를 종류 할 수 있습니다. 그리고 당신은 속에서의 싸움은 정말 좀 닦아했다 비트 또는 자기 입자의 수 이 디스크에서. 그래서 다행히도, 거기에 아무것도 없습니다. 그 것은 방법의 경우 - 및 커버 당신의 눈과 당신의 이웃 사람 - , 그냥이 당겨 당신은 할 수 있습니다 그런 전체 칼집 떨어져. 하지만 약간 봄이, 그래서 수 당신의 눈을 가진 그 인식. 그래서 지금 당신은 정말 플로피 디스크가 있습니다. 무엇을 이것에 대해 놀라운이야 이 상태로 그 정도에 더 큰 소규모 표현 하드 드라이브가 이러한 일들은 최고입니다 초간단. 당신은 지금, 그것의 바닥을 공략하면 그 그 금속 것은 오프와 껍질 그들이 열이 모두 두 조각입니다 생각과 소위 플로피 디스크 내부에 금속 조각. 그리고 반은 간다 내 디스크의 내용. 그들의 또 다른 절반 간다. 하지만 그 내부에서 회전하는 것을 전부 작년에 컴퓨터. 그리고 또, 관점에 이것을 넣어 얼마나 큰 당신의 대부분의 하드는 요즘 드라이브? 5백기가바이트, 테라 바이트, 아마의 데스크톱 컴퓨터, 2 테라 바이트, 3 테라 바이트, 4 테라 바이트, 오른쪽? 이 일메가바이트이​​며, 제공 또는 수행 심지어 일반적인 MP3에 맞게 할 수없는 더 이상 이러한 일 또는 일부 유사한 음악 파일을 정렬합니다. 그래서 조금 당신을위한 선물 오늘, 그리고 또한 무엇을 상황화하는 데 도움이 우리는 당연하게 복용 할 수 있습니다 지금 문제 5 가지를 설정합니다. 그래서 사람들은 계속 당신입니다. 이렇게 될 곳으로 저를 전환하자 다음 PSET을 지출뿐만 아니라. 그래서 우리는 지금이 페이지에 대해 설정 한 - 오, 빨리 공지 몇 가지. 이번 주 금요일, 당신이 좋아하면 것인지 CS50 가입 점심, 일반적인 장소로 이동 cs50.net/rsvp. 그리고 최종 프로젝트 - 그래서 강의 당, 우리는 게시 한 이미 최종 프로젝트 사양입니다. 의미하지 않는 것을 깨닫게 그것은 특히 곧 때문이다. 그것은 단지 얻으려면, 정말, 게시이야 너희들은 그것에 대해 생각. 참으로, 매우 중요한 당신의 비율은 태클됩니다 재질에 최종 프로젝트가 우리 심지어 클래스에 입수하지 않은 것은, 하지만 빠르면 다음 주 같은 것입니다. 통지는하지만, 스펙을 요구하는 몇 가지 다른 구성 요소 최종 프로젝트. 첫 번째는, 몇 주이며, 사전 제안에 꽤 캐주얼 이메일 당신의 그 말할 TF하거나 당신이있어 함께 프로젝트에 대한 생각 더 노력하지 않습니다. 제안은 특정 될 것이다 약속은, 말, 여기이 무엇인지 난 내 프로젝트에 대한 수행하고 싶습니다. 당신은 어떻게 생각합니까? 너무 큰? 너무 작은? 그것은 관리인가? 그리고 당신은 자세한 내용은 사양을 참조하십시오. 몇 주 그 이후 상태입니다 유사하다 보고서 얼마나 말을하기 위해 TF 캐주얼 이메일 당신은 당신의 마지막에 뒤쳐져 다음 프로젝트의 구현 CS50 Hackathon 할 사람 초대에서 이벤트가 될 7시까지 어느 날 저녁에 오후 08:00 다음날 아침 오전. 나는 주에 언급 한 수 있으므로 피자, 제로 줘야은 오후 9시 제공 될 1:00 중국 음식 오전. 그리고 당신은시에 아직도 깨어 있다면 오전, 우리는 아침 식사를 위해 IHOP에 여러분을 데려 갈 게요. 그래서 Hackathon는 더 중 하나입니다 클래스의 기억에 남는 경험. 다음 구현으로 인해이며, 그 절정 CS50 박람회. 이들 모두에 대한 자세한 정보 주 올 수 있습니다. 그러나의 뭔가로 돌아 가자 오래된 학교 - 다시 배열입니다. 그것을 해결하기 때문에 그렇게 배열이 좋았다 우리는 같은 문제는 그냥보고 학생 구조 전 순간 컨트롤의 작은 밖으로 얻는 경우 우리 학생 한 학생 두 가지를 갖고 싶어 학생 세, 학생 점 점 점, 학생들의 임의의 숫자입니다. 배열 그래서 몇 주 전,에 습격 및 해결 우리의 문제의하지의 사전에 알고 얼마나 많은 것들 어떤 종류의 우리는 할 수 있습니다. 그리고 우리는 구조체가 우리를 도울 수 있다고 보았다 더 이상 우리의 코드를 구성하고 유지 같은 개념적으로 유사한 변수, 이름과 집, 함께하는 우리 안쪽으로 하나의 엔티티로 취급 할 수 어느 작은 조각이있다. 그러나 배열은 몇 가지 단점이 있습니다. 단점은 무엇입니까 우리가 발생했습니다 배열을 지금까지? 그게 뭐야? 고정 된 크기 - 그래서 심지어 수도 있지만 메모리를 할당 할 수 배열은, 일단 당신이 알고 얼마나 많은 학생들이 당신은 얼마나 많은 문자가 사용자로부터, 일단 당신이 할당 한 배열, 당신은 종류의 페인트 한 코너에 자신. 당신은 새로운 요소를 삽입 할 수 없기 때문에 배열의 중간에. 당신은 더 많은 요소를 삽입 할 수 없습니다 배열의 끝에. 정말, 당신은을 만들기에 의존해야 우리가 설명한대로 새로운 배열, 새에 이전을 복사 할 수 있습니다. 그리고 또, 그 두통입니다 당신과 거래를하는 GetString. 그러나 다시, 당신은 삽입 할 수 없습니다 배열의 중간에 뭔가 속도가 완전히 채워지지 않은 경우. 예를 들어,이 배열의 경우, 여기에 크기 여섯 만, 거기에 다섯 가지가 있습니다 잘, 당신은 그냥 압정 수 끝에 뭔가. 하지만 당신은 뭔가를 삽입 무엇을하려는 경우 의 중간에 배열은, 그것은있을 수 있습니다에도 불구하고 그 여섯 가지의 다섯 가지 중? 음, 우리는 우리 모두가있을 때 무엇을 했는가 인간의 자원 봉사자 무대에 주 과거? 우리가 여기에 사람을 넣어하려는 경우, 하나 이 이동하는 방법이 사람 방법, 또는 이동하는 방법이 사람 방법, 그리고 비싼되었다. 내부 사람들의 이동 배열은 최대 추가하고 비용 끝났다 우리 시간, 따라서 많은 우리의 N 제곱 를 들어, 삽입 정렬과 같은 실행 시간을 예, 최악의 경우합니다. 그래서 배열은 중대하다, 그러나 당신은에있다 당신이 그들을 원하는 얼마나 큰 사전에 알고있다. 그래서 OK, 여기에 솔루션입니다. 나는 미리 알 수없는 경우 얼마나 많은 학생들은 내가 가질 수 있으며 한 번 알아 내가 결정하지만, 나는 그와 함께 갇혔어요 왜 난 항상 많은 학생들을하지 않습니다 두 배 많은 공간을 할당 내가 생각하는대로 내가 필요하십니까? 이것이 좋은 해결책이 아니다? 현실적으로, 우리가 걸 생각하지 않습니다 50 개 이상의 슬롯이 필요할 것 중간 크기의 클래스에 대한 배열, 그럼 그냥 반올림 할 수 있습니다. 난 그냥 내 배열에 100 슬롯을 만들거야 그래서 우리는 확실히 얻을 수 내가 기대하는 학생의 수 일부 중간 크기의 클래스에합니다. 왜 그냥 반올림 및 할당하지 배열에 대해 메모리, 일반적으로, 당신도 당신이해야 할 수도 있습니다 생각보다? 이 간단한 이륙 시각의 연기는 무엇입니까 그 생각을? 당신은 메모리를 낭비하고 있습니다. 그런 다음 쓰기 문자 그대로 모든 프로그램 아마 두 배의 메모리로 사용 당신이 실제로 필요합니다. 그냥 기분하지 않습니다 특히 우아한 솔루션입니다. 또한, 그것은 단지를 감소 문제의 확률. 당신은 인기있는 과정이 일어날 경우 한 학기 및 101이 학생들은 프로그램이 여전히 근본적으로 동일한 문제에 직면. 그래서 고맙게도에 대한 해결책이있다 양식이 광고는 우리의 모든 문제를 있는 데이터 구조 것보다 더 복잡 우리는 지금까지 본 적이. 이것은 내가 주장 연결된 목록입니다. 이 번호의 목록입니다 - 9, 17, 22, 26, 34 - 방법으로 서로 연결되었는지 무엇을 나는 화살표로 그려 놨거든요. 즉, 만약 내가 표현하고 싶었다 배열은, 내가 할 수있는 이런 식으로 뭔가. 그리고 오버 헤드에 이것을 놓을 게요 잠시합니다. 내가 할 수있는 - 안녕하세요, 좋아. 대기. 여기에 새 컴퓨터, 맑은 - 좋아. 그래서 배열이 숫자가있는 경우 - 9, 17, 22, 26, 24 - 확장 할 필요는 없습니다. 좋아, 그래서 여기에 내 배열 - 세상에. 좋아, 그래서 여기에 내 배열입니다. 맙소사. [웃음] DAVID 마란 : 척. 그것은 돌아갈 너무 많은 노력의 그래서 거기에 그 수정 - 26. 그래서 우리는이 배열의이 9, 17, 22, 26, 34. 당신의 사람들은 볼 수에 대한 당황 실수는 그냥 만들어, 거기입니다. 그래서 나는이 것을 주장 매우 효율적인 솔루션입니다. 나는 많은 정수로 할당 한 내가 필요 - 하나, 둘, 셋, 넷, 다섯, 혹은 여섯 - 그리고 그때 숫자에게 저장 한 이 배열의 내부. 그러나 가정은 다음 내가 삽입 할 숫자 8과 같은 가치인가? 글쎄, 어디로 가야합니까? 내가 삽입한다고 가정 20 같은 숫자입니다. 글쎄, 어디로 가야합니까? 어딘가에 중간에, 혹은 숫자 35은 가야 어딘가에 끝. 그러나 나는 모든 공간 데요. 그리고이 근본적인 도전 솔루션입니다 않는 배열. 나는 getString는, 순간 전 주장 이 문제를 해결합니다. 당신은 여섯 번째 번호를 삽입하려면 이 배열에 하나 이상의 무엇인가 솔루션은, 확실히 다시 떨어질 수 다만 우리가하는 GetString와처럼? 그게 뭐야? 음, 더 큰되어 있는지 확인 말하기는 쉽다. 우리는 반드시 배열을 만들 수 없습니다 더 큰,하지만 우리가 무엇을 할 수 있습니까? 사이즈의 큰의 새로운 배열을 만들 6, 아니면 크기 10, 우리가 원하는 경우 앞서 것들을 얻을 후 복사 오래된 새에 배열하고 이전 배열을 해제. 그러나 실행 시간은 무엇인가 이제 프로세스의? 그것은 N의 큰 O 왜냐하면 복사 당신에게 몇 가지 단위를 비용 것입니다 우리는에이 시간이 너무 너무 이상하지 않을 경우 가는 새로운 배열을 할당하는 두 배의 소비 메모리에 임시. 새에 오래된 복사 - 내 말은, 그냥 두통,의 어느 다시, 우리는 왜 썼다 당신을 위해 getString 나. 우리는 대신에 이렇게 무엇을 할 수 있습니까? 그럼, 만약 우리의 데이터 구조 실제로 격차가? 나는 데 내 목표를 완화한다고 가정 메모리의 연속 된 청크 위치 9 이다 17, 바로 옆에 바로 22 옆, 등등. 9가 여기에있을 수 있다고 가정 RAM, 및 17, RAM에 여기 할 수 있습니다 22은 RAM에 여기 할 수 있습니다. 즉, 내가 그들을 필요로하지 않는다 더이상 다시 다시. 난 그냥 어떻게 든 바늘에 실을 꿰다해야 이러한 각 숫자, 또는 각각을 통해 이 노드와 같은 우리를 호출합니다 내가 그들을 그린 것 같은 사각형에 마지막에 도착하는 방법을 기억 첫 번째에서 같은 노드입니다. 그래서 프로그래밍 구성 무엇입니까 우리는 아주 최근에 본 적이되는 I 해당 스레드를 구현하거나 할 수 있습니다 여기에 그려진 내가 할 수있는 그 화살표를 구현? 그래서 포인터, 오른쪽? 난 그냥 할당하는 경우 INT하지만, 노드 - 그리고 별 노드, 난 그냥 용기를 의미합니다. 시각적으로, 나는 사각형을 의미합니다. 노드는 분명히 필요하므로 두 값을 포함하는 - INT 자체 한 후, 같은 암시 사각형의 아래쪽, INT위한 충분한 공간. 그래서 그냥 여기에 앞서 생각 이 노드는이, 얼마나 큰 문제의 컨테이너? INT에 대한 얼마나 많은 바이트? 아마 4, 그것 인 경우 평소와 같이 동일합니다. 그리고 얼마나 많은 바이트 포인터? 4. 따라서이 컨테이너, 또는이 노드가있다 8 바이트 구조가 될 것이다. 아, 그리고 그 행복한 우연의 일치가 우리는 단지이 개념을 도입 구조체 또는 C 구조. 그래서 내가 단계를 수행 할 것을 주장 이보다 정교한 방향 숫자 목록의 구현 번호 연결리스트, 내가 할 필요가 좀 더 정면의 생각과 다만 INT하지만, 구조체 선언 내가 전화 할게 있는지, 종래 여기 노드입니다. 우리는 우리가 원하는 무엇이든 호출 할 수도 있지만 노드는 많이 주제별 될 것입니다 것들을 우리가 지금보고 시작합니다. 해당 노드의 내부 INT N입니다. 그리고이 구문, 조금 첫눈에 이상한 - 구조체 노드 * 다음. 물론 그림으로, 그 무엇인가? 그 하단의 절반 우리가 보았던 사각형 잠시 전. 그런데 왜 나는 * 구조체 노드를 말하고 처럼 노드 *에 반대? 그 포인터가 가리키는 경우 때문에, 다른 노드에서, 그것은 단지의 노드의 주소입니다. 우리가 무슨을과 일치이야 지금까지 포인터에 대해 논의했다. 내가 주장하는 경우에 왜이 구조는 노드라고, 내가 구조체 말을해야합니까 여기에 내부 노드? 정확히. 그것은 C의 바보 같은 현실의 일종 형식 정의는, 말하자면,하지 않은 아직 일어났다. C 리터럴 슈퍼. 그것은 당신의 코드 맨을 읽고 아래, 왼쪽에서 오른쪽으로. 그리고 할 때까지에 해당 세미콜론 안타 하단 라인은하지 않습니다 추​​측 데이터 형식으로 존재 하는가? 노드 견적 맺다 노드입니다. 그러나 때문에 더 자세한의 선언 나는 첫 번째 줄에 한 - typedef는 구조체 노드 - 그 전에 먼저 왔기 때문에 중괄호, 같은 종류의의 사전 교육 연타 즉, 뭘 알고 나에게 구조체를 제공 구조체 노드를했다. 솔직히 호출 것을 좋아하지 않는다 구조체 노드 구조체 노드의 모든 내 코드에 걸쳐. 하지만 단지 바로 안쪽, 한 번 사용합니다 그래서 나는 효과적으로 할 수 순환 참조의 종류를하지 생성 본질적으로 자신에 대한 포인터 만, 서로에 대한 포인터 동일한 유형입니다. 그래서 밝혀 그 데이터 구조에 다음과 같이 몇 가지가있다 수 있습니다 작업 우리의 관심. 우리는 삽입 할 수 있습니다 다음과 같은 목록에. 우리는 삭제 할 수 있습니다 이 같은 목록에서. 우리의 목록을 검색 할 수 있습니다 값 또는 더 일반적으로, 이송. 트래버스는 단지 멋진 방법입니다 왼쪽에있는 시작을 말 모든 이동 오른쪽 방법입니다. 심지어이 조금 더 유의 사항, 복잡한 데이터 구조,하자 날 우리가 어떤을 빌릴 수있는 제안 지난 2 주 아이디어와 라는 함수를 구현 다음과 같이 검색 할 수 있습니다. 그것은 나 true를 돌려주는거야 false를 나타내는 예 또는 아니, n은 목록에 있습니다. 두 번째 인수는 포인터 목록 자체 때문에 노드에 대한 포인터. 그럼 내가 할거야 모두 선언합니다 임시 변수입니다. 우리는 규칙에 의해 PTR 전화 할게 포인터. 그리고 나는에이 같은 할당 목록의 시작. 지금은 while 루프를 확인할 수 있습니다. 너무 오래 포인터가 같지 않음으로 null로, 내가 확인하는거야. 이다 포인터 화살표 N 같 전달 된 N? 새로운 - 그리고 잠깐만 구문 조각. 화살표가 갑자기 무엇입니까? 그래? 정확히. 그래서 반면 몇 분 전에, 우리는 사용 뭔가를 액세스 할 점 표기법 구조체의 내부 변수 경우 당신은 구조체되지 않은 자체가 아니라 구조체에 대한 포인터 다행히도, 구문 조각이 마지막으로 직관적 인 의미가 있습니다. 화살표, 포인터를 따라하는 것을 의미 우리 화살표는 일반적 의미처럼 그림으로, 그리고에서 이동 데이터 필드 내부. 그래서 화살표 점과 같은 것입니다 만, 당신은 포인터가있을 때 당신은 그것을 사용합니다. 그래서 그냥 다음 요점을 되풀이하는 경우 N 필드 구조체의 내부 포인터를 호출 같음이 n 일, true를 돌려줍니다. 그렇지 않으면, 여기 라인 - 포인터 다음 포인터 같습니다. 그래서이 무엇을하고 있는지, 통지 인 경우, I 현재 구조체를 가리키는입니다 9, 9를 포함하는 숫자가 아닙니다 내가 찾고 있어요 - 내가 찾고 있어요 가정 에 대한 N 50과 같다 - 내 임시 포인터를 업데이트 할거야 이 노드를 가리 키지하기 더 이상하지만, 포인터 화살표 옆에있는 여기에 나를 넣어 것입니다. 지금은 회오리 바람입니다 실현 소개. 수요일에, 우리는 실제로이 작업을 수행 할 수 있습니다 일부 인간과와 좀 더 함께 느린 속도로 코드입니다. 그러나 실현, 우리는 지금 우리의 데이터를 만들고있어 구조는 더 복잡 그래야 우리 알고리즘은 효율적으로 얻을 수있는 를위한 필수가 될 것입니다 PSET 여섯, 우리는 다시에로드 할 때, 그 150,000 단어지만, 그렇게 할 필요가 효율적으로, 그리고 이상적를 만들 우리의 사용자가하지에 대한 실행 프로그램 선형하지 제곱 중 N, 그러나에 이상에서 일정 시간. 우리는 수요일에 당신을 볼 수 있습니다. 스피커 : 다음 CS50, 데이비드 그의 기본 케이스를 잊어. DAVID 마란 : 그리고 당신이 보내는 방법 텍스트 메시지 C. 무엇 - [다양한 텍스트 메시지 통보 소리]