[음악 재생] DOUG 로이드 : OK 그래서 제안 여기에 시작하기 전에. 당신은 비디오로 시청하지 않은 경우 그렇게 처음 수행 할 수 있습니다 포인터가. 이 비디오이기 때문에 다른 포인터와 협력의 방법. 그래서 말 것 몇 가지 개념에 대한 우리는에 포함하는 것이 비디오 포인터 우리는있어 지금 얼버무 것, 그들은 이미있어 가정 종류의 이해. 그래서 그냥 공정한 경고의 당신이 비디오를보고있는 경우 당신이 보지 포인터 비디오, 그것은 수도 종류의 머리 위로 조금 비행. 그리고 그것은 더 좋을 수도 순서대로 그것을 볼 수 있습니다. 그래서 우리는 이미 하나를 보았다 방법은, 포인터로 작업하기 저희는 선언이다 변수, 그리고 우리 포인터를 다른 변수를 선언 변수는, 그게 가리 킵니다. 그래서 우리가 만든 이름으로 변수, 우리는했습니다 , 이름의 두 번째 변수를 생성 우리는 두 번째 변수 그 시점 그 처음. 이런 종류의가 문제하지만, 그것 때문에 정확히 알고 우리를 필요 메모리 양을 우리가있어 순간 필요할 것 우리의 프로그램은 컴파일됩니다. 그 이유는 무엇입니까? 우리가 이름을 할 수 있어야하기 때문에 또는 가능한 모든 변수를 식별 우리가 발생할 수 있습니다. 우리는 할 수있는 배열이있을 수 있습니다 많은 정보를 보유 할 수있는, 하지만 여전히 아니다 충분히 정확하게 정확한. 우리가 모르는 경우, 우리는 아무 생각이없는 경우 얼마나 우리는 컴파일시에 필요합니다? 또는 무엇을 우리의 프로그램이됩니다 정말 오랜 시간 동안 실행, 다양한 사용자를 수용 데이터, 우리가 할 수없는 정말 우린 여부를 평가할 1,000 개 필요할 것? 그것은 우리가 할 수처럼하지 명령 줄에서 말 얼마나 많은 항목을 입력 당신은 당신이 필요할 것 같은데요. 그런데 그 추측은 잘못된 무엇입니까? 동적 메모리 할당 종류의 우리에게 길을 수 있습니다 이 특정 문제를 해결 얻을 수 있습니다. 상기 방법은 그것을 수행 포인터를 사용하는 것입니다. 우리는 포인터로 사용할 수 있습니다 동적으로 액세스 할 수 있습니다 입니다 할당 된 메모리, 메모리 당신의 프로그램으로 할당 된 실행 중입니다. 그것은 컴파일시에 할당되지 않은 것. 때 동적으로 할당 메모리는 수영장에서 온다 메모리의 힙으로 알려져 있습니다. 우리가했습니다 이전에 모든 메모리 과정에서 함께 일하고 풀에서오고있다 메모리 스택으로 알려져 있습니다. 좋은 방법은 일반적으로을에 mind--이 규칙에 계속 항상 성립하지 않습니다 하지만 거의 대부분 항상 true-- 어떤 것입니다 보유 시간 당신은 변수 이름을 부여 아마 스택에 살고있다. 그리고 언제 당신은하지 않습니다 변수의 이름을 지정, 당신은 동적 메모리와 함께 할 수있는 할당, 그것은 힙에 살고있다. 지금은 가지로이 제시 해요 메모리의 이러한 2 개의 수영장이 있다면. 그러나 당신은 이것을 볼지도 모른다 일반적으로도, 의 표현 무엇 메모리는 같다 그리고 우리에 대한 모든 걱정하지 않을거야 상단과 하단에있는 물건. 우리가 걱정하는 것은이 부분이다 여기에 중간, 힙 및 스택. 당신은에 의해 볼 수 있듯이 이 그림을보고, 이러한 사실이 아니다 별도의 메모리 풀. 그것은 메모리의 공유 풀의 여기서이 시각에 시작 당신은 하단에 시작 최대 충전 시작 스택과 바닥, 그리고 당신의 상단에있는 시작 채우고 시작 힙 위에서 아래로. 하지만 정말 같은 풀, 그것은 단지 다른 장소, 다른 위치 메모리에 할당되고 있음. 그리고 당신은 밖으로 실행할 수 있습니다 중 하나를 가짐으로써 메모리 힙은 모든 길을 갈 아래로, 또는이 스택은 상부에 줄곧 갈 또는 힙 및 스택을 갖는 서로 만나. 이들의 모든 조건이 될 수있다 그 프로그램을 일으킬 메모리가 부족합니다. 그래서 명심. 우리에 대해 말할 때 힙 및 스택 우리가 정말 얘기 메모리 같은 일반 덩어리, 단지 이 메모리의 상이한 부분. 그래서 우리는 동적으로 어떻게받을 수 있나요 처음에 메모리를 할당? 우리의 프로그램은 얻을 않는 방법 이 실행중인로 메모리? 그럼 C라는 기능을 제공 malloc에​​, 메모리 할당, 어떤 당신에게 전화를 걸, 당신은에 전달 얼마나 많은 당신이 원하는 메모리의 바이트. 프로그램이 실행되고 있다면 당신은 정수 런타임을 원하는, 당신은 4 바이트를 mallock 수 있습니다 메모리는 malloc에​​ 네 괄호. mallock 통해 이동합니다 힙를 통해보고, 우리는 동적이기 때문에 메모리 할당, 그것은 당신에게 돌아갑니다 그 메모리에 대한 포인터. 그것은 당신에게 그 memory--를 제공하지 않습니다 그것은 이름을 제공하지 않습니다, 그것은 당신에게 그것의 포인터를 제공합니다. 다시 내가 말한 이유 때문에 그건 그것은 어쩌면에 중요하다고 포인터 비디오를 시청 한 우리는이에 너무 멀리 도착하기 전에. 그래서 malloc에​​는 것 포인터를 다시 제공합니다. mallock는 당신에게 제공 할 수없는 경우 메모리가 소모했기 때문에, 널 포인터 당신을 다시 줄 것이다. 당신은 우리 경우 어떻게되는지 기억하십니까 시도하고 널 포인터 역 참조? 우리는 바로, SEG 오류가 고통? 그건 아마 좋지 않다. 그래서 때마다 당신은 전화를 걸 항상, 항상 당신의 malloc합니다 검사 할 필요가 있는지 여부 당신이 다시 널 포인터했다. 이 경우, 당신은 당신의 프로그램을 종료해야합니다 당신이 역 참조 시도하는 경우 때문에 당신은거야 널 포인터 세그먼트 오류 고통을 당신의 프로그램입니다 어쨌든 충돌 것. 어떻게 정적으로 우리를 할 정수를 구하는? INT의 X. 우리는 아마 했어 시간의 무리, 오른쪽? 이것은라는 변수를 생성 스택에 살고 X. 우리는 어떻게 동적으로 정수를 얻을 수 있습니까? INT 스타 PX는 malloc에​​ 4와 동일합니다. 또는 더 적절하게 우리는 INT 스타 PX 말 것 , INT의 malloc에​​ 크기를 동일 좀 더 적은을 던져 우리의 프로그램 주위에 매직 넘버. 이것은 우리를 얻을 것입니다 힙에서 4 바이트의 메모리, 포인터 우리가 얻을 다시로는 PX라고합니다. 그리고 우리는했습니다 것처럼 우리는 이전에 수행 수 PX 역 참조에 그 메모리에 액세스 할 수 있습니다. 우리는 어떻게 사용자의 정수를받을 수 있나요? 우리는 INT X는 INT를 얻을 동일 말할 수있다. 그것은 매우 간단합니다. 우리가 배열을 만들려면 무엇 스택에 살고 수레 X? 그 이름의 stack_array-- 떠 우리의 array-- 대괄호 X의. 즉, 우리의 배열이 만들어집니다 스택에 살고 수레 X. 우리는 수레의 배열을 만들 수 있습니다 즉, 너무 힙에 살고있다. 구문을 보일 수 있습니다 더 성가신 작은 그러나 우리는 플로트를 말할 수있다 스타 heap_array 같음 malloc에​​의 X 시간 플로트의 크기. 나는 저장할 수있는 충분한 공간이 필요 X 부동 소수점 값. 그래서 100 필요하다고 수레, 1,000 수레. 그래서이 경우에는 것 100 수레 400 바이트, 1,000 수레 4,000 바이트, 각각의 플로트가 필요하기 때문에 공간의 4 바이트. 이 일 후에 내가 사용할 수 있습니다 heap_array에 대괄호 구문. 그냥 내가 stack_array에서와 같이, 나는 개별적 요소에 액세스 할 수 있습니다 사용 heap_array 제로, heap_array 하나. 그러나 우리가 할 수있는 이유를 기억 때문에 C의 배열 이름 정말에 대한 포인터입니다 해당 배열의 첫 번째 요소. 우리가 선언하는 사실 그래서 여기에 스택에 수레의 배열 실제로 약간 잘못된 것입니다. 우리는 정말로에 이 코드의 두 번째 줄 또한 청크 포인터를 만드는 우리는 다음 몇 가지 일을 기억. 여기에 큰 문제와이다 동적하지만 메모리를 할당, 정말 왜이있다 좋은 습관을 개발하는 것이 중요 때 당신은 그것으로 노력하고 있습니다. 정적 선언과는 달리 메모리, 메모리 자동으로 반환되지 않습니다 당신의 기능을 수행하는 시스템. 우리는 주요 있고, 경우에 따라서 주요 함수를 호출 F, 완료 f를가하고있어 어떤 및 프로그램의 제어를 리턴 다시 메인에 모든 메모리의 사용되는 F 다시 주어진다. 그것은 다시 사용할 수 있습니다 다른 프로그램에 의해, 또는 다른 기능이 주요 뒷부분에 불려갑니다. 그것은 다시 동일한 메모리를 통해 사용할 수 있습니다. 당신이 만약 동적 하지만 메모리를 할당 명시 적으로 말할 필요 당신이 그것으로 완료 시스템. 그것은 어떤 수, 당신을 위해 그것을 지키고 있습니다 당신이 밖으로 실행의 문제로 이어질 메모리. 그리고 사실 우리는 때때로 참조 메모리 누수 등이에. 그리고 때로는 이러한 메모리 누수 실제로 정말 충격적 일 수 있습니다 시스템 성능. 당신은 자주 인터넷 사용자의 경우 당신은 어떤 웹 브라우저를 사용할 수 있습니다 나는 여기에 이​​름을 이름,하지만하지 않습니다 일부 웹 브라우저는 거기에있다 실제로 가진 악명이 높다 그 고정되지 않는 메모리 누수. 그리고 당신은 당신의 브라우저가 열려두면 시간의 매우 긴 기간 동안 일 과 일 또는 주, 당신 때때로 시스템에 있음을 알 수 있습니다 정말 천천히, 정말 실행이다. 그 이유는 점이다 브라우저는 메모리를 할당 한 그러나 시스템을 말하지 않았다 그것이는 그것으로 끝났다. 그리고 그 메모리를 적게 잎 다른 프로그램을 모두 사용할 수 당신이이기 때문에, 공유해야합니다 이 웹 브라우저를 leaking-- 프로그램은 메모리가 누수됩니다. 우리는 다시 메모리를 제공하려면 어떻게 우리는 그것으로 끝나면? 그런데 다행히도 그것은이다 그것을 할 수있는 아주 쉬운 방법. 우리는 단지 그것을 무료로 제공됩니다. 무료라는 기능이있다, 또한, 메모리에 대한 포인터를 받아 우리는 갈 수 있어요. 그래서 우리가에있어 가정 해 봅시다 우리 프로그램의 중간, 우리는 50 자 malloc을하고 싶다. 우리는 할 수있는 배열을 malloc을 할 50 문자를 보유 할 수. 그리고 우리는 포인터를 얻을 때 그, 그 포인터의 이름은 단어입니다. 우리는 우리가있어 무엇이든 할 단어와 함께 할 것, 그리고 우리가있을 때 우리는 그냥 무료 다. 그리고 지금 우리는 그 (50) 돌아왔다 다시 시스템에 메모리의 바이트. 일부 다른 기능을 사용할 수 있습니다. 우리는 고통에 대해 걱정할 필요가 없습니다 메모리 누수 우리는 단어를 해제했기 때문에. 우리는 다시 메모리를 준, 그래서 우리는 그 작업을 모두 마쳤습니다. 그래서 세 가지가있다 그해야 황금률 당신이있어 때마다 마음에 보관 동적 메모리를 할당 malloc에​​와. 메모리의 모든 블록이 당신이 malloc을 해제해야합니다 프로그램하기 전에 실행 완료. 이제 다시, 기기 나에 IDE는 이런 종류의 어쨌든 당신을 위해 일 너와 때 어쨌든 일어날 것 프로그램이 종료되었을 때, 모든 메모리가 해제됩니다. 그러나 일반적으로 좋은 코딩의 연습 항상에, 작업이 완료되면, 당신이 mallocd 것을 무료로 제공됩니다. 상기 만 일 그 당신은 mallocd가 해제해야했습니다. 당신이 정적으로 선언하는 경우 정수, INT X 세미콜론, 즉, 스택에 살고, 당신 다음 X를 해제하고 싶지 않아요. 당신은했습니다 그래서 유일한 것들 mallocd가 해제되어야한다. 그리고 마지막으로, 두 번 무료 뭔가. 즉으로 이어질 수 있습니다 다른 이상한 상황. 당신은했습니다 그래서 모든 mallocd가 해제되어야한다. 당신은했습니다 만 가지 malloc에​​가 해제되어야한다. 그리고 두 번 무료 뭔가. 그래서 여기에 예를 통해 가자 일부는 동적으로 할당 무엇 메모리는 혼합과 같을 수 있습니다 일부 정적 메모리에. 여기에 무슨 일이 일어날 수 있는가? 당신이 수행 할 수 있는지 따라서 어떤 것 같아요 우리가 가서 일어날 것 코드의 모든 라인을 통해. 그래서 우리는 INT 분을 말한다. 어떻게 여기됩니까? 그럼이 아주 간단합니다. 나는 M라는 정수 변수를 만들 수 있습니다. 나는 그것이 녹색 색상 즉, 색상 때문에 내가 말하고있을 때 내가 사용하는 것이 대한 정수 변수. 그것은 상자입니다. 그것은 당신이 수 미터라고하고 있어요 그것의 내부 저장 정수. 그때 INT 스타 무슨 말을하면? 우물은 매우 유사하다. 나는 상자라고 만드는거야. 그것은 유지 INT 할 수 있어요 별, 정수에 대한 포인터. 그래서 나뿐만 아니라 그것을 녹색 틱을 색칠하고있다. 나는 무언가가 알고 정수 함께 할 수있는, 하지만 정수 그 자체입니다. 그러나 그것은 거의 같은 생각입니다. 나는 상자를 만들었습니다. 이러한 권리의 모두 이제 스택에 살고있다. 나는 그들에게 모두 이름을 부여했습니다. INT 스타 B는 INT의 malloc에​​ 크기를 동일합니다. 이 사람은 조금 까다로울 수 있습니다. 두 번째를 타고 당신이 무엇을 생각 이 그림에 일어날 것으로 예상된다. INT 스타 B는 INT의 malloc에​​ 크기를 동일합니다. 그런데 이것은 단지 하나의 상자를 만들지 않습니다. 이것은 실제로 두 개의 상자를 만듭니다. 그것은 또한 확립, 넥타이 관계의 포인트. 우리는 하나의 블록을 할당 한 힙에 메모리. 주목 오른쪽 상단 상자가 이름이 없습니다. 우리는 그것을 mallocd. 그것은 힙에 존재한다. 그러나 B는 이름이 있습니다. 이 B라는 포인터 변수입니다. 즉, 스택에 살고있다. 그래서 메모리의 조각이다 그것은 또 다른 하나를 가리 킵니다. B는 주소를 포함 메모리의 블록. 그렇지 않으면 이름이 없습니다. 그러나 그것을 가리 킵니다. 그래서 우리는 INT 스타 B가 동일 말할 때 INT의 malloc에​​ 크기, 바로 그, 에 일어 났고 그 화살표 이 오른쪽, 그 모든 것은, 나는 그것이 표시해야 다시 일어나는 것입니다. 그 모두에서 발생 코드의 한 줄. 이제 우리는 조금 더 얻을 것이다 다시 간단합니다. 는 앰퍼샌드 M 같습니다. 당신은 무엇을 기억하십니까 앰퍼샌드 m은 같다? 우물은 M의 주소를 얻을 수 있습니다. 또는, 더 도식적으로 넣어 M에 포인트. A는 B와 동일합니다. 확인 그래서 여기에 또 다른 하나입니다. A는 B와 동일합니다. 무슨 일이 일어날 그림이 시간에? 그럼 리콜 대입 연산자의 작품 에 값을 할당하여 오른쪽 왼쪽 값. M에 따라서 대신 포인팅, 지금 B 지점이 같은 장소를 가리 킵니다. ,을 B 지점으로하지 않습니다 B 점을 지적한다. 뾰족한가를 B로하면 것 이 앰퍼샌드 (B)에 해당되고있다. 하지만 그 대신은 b를 동일 그 의미와 b는 지금 같은 주소에 있기 때문에 가리키는 B의 내부는 주소입니다. 그리고 지금의 내부는 같은 주소입니다. m은 아마 10과 동일 가장 간단한 것은 우리는 약간의 짓을했는지. 상자에 10을 넣습니다. 스타 B는 m 동일 플러스 2 회상 우리의 포인터 비디오 어떤 스타 B는 것을 의미한다. 우리는 역 참조 B와 넣어거야 그 메모리 위치에 어떤 값입니다. 이 경우 (12). 그래서 때의 포인트 역 참조 우리는 단지에있는 화살표를 아래로 여행 기억합니다. 아니면 다른 방법을 넣어, 우리 그 메모리 주소로 이동 우리는 어떤 방법으로 그것을 조작 할 수 있습니다. 우리는 거기에 몇 가지 값을 넣어. 이 경우 스타 B의 M과 동일 플러스 2 단지입니다 변수에 가서는, B가 가리키는 메모리에 가서는, B가 가리키는 12, 거기에 M 플러스 2를 넣어. 지금은 B를 무료로 제공됩니다. 내가 B를 해제하면 어떻게됩니까? 내가 무료 수단을 말을 기억하십시오. 내가 B를 해제 할 때 내가 무슨 말입니까? 내가 작업 끝났어요, 그렇죠? 나는 기본적으로 메모리를 제공합니다. 나는 시스템을 다시 제공합니다. 나는이 더 이상입니다 필요가 없습니다 내가 확인을 그들에게 말하고? 지금은 말한다면 스타 11 당신은 아마 수와 동일 이미 나쁜 뭔가 말 바로, 여기에 무슨 일이 일어날? 그리고 나는 그 아마 시도 참으로 경우 세그먼트 오류를​​ 고통 것이다. 지금 때문에, 비록 메모리의 이전에 그 덩어리 내가 가진 무언가 이 시점에서 액세스, 지금은 메모리를 액세스하고있어 그 나에게 접근하는 법이 아니다. 하고 우리는 아마 것 우리가 메모리에 액세스 할 때, 기억 우리가 터치 안하고 있는지, 즉, 가장 일반적인 원인이다 분할의 잘못. 그리고 내 프로그램 나는이 작업을 수행하려고하면 충돌합니다. 그래서 다시 좋은 얻을 수있는 좋은 생각 연습과 좋은 습관이 배어 malloc에​​ 무료로 작업 할 때, 그래서 당신은 분할을 용납하지 않는 것이 당신이 사용하고 있다는 오류 당신은 동적으로 할당 메모리 책임. 내가 더그 로이드이야이 CS50입니다.