2011-03-18 3 views
3

malloc을 사용하여 c에서 동적 배열을 만듭니다. 예 :c에서 동적 배열에 포인터를 비움

지금은이 같은 기능을하고 그것에 myCharArray를 전달하는 경우
myCharArray = (char *) malloc(16); 

:

reset(char * myCharArrayp) 
{ 
    free(myCharArrayp); 
} 

것이다 일을, 또는 어떻게 든 포인터 만 (myCharArrayp)의 사본을 확보하고 실제 myCharArray가 아닌가?

답변

7

예상대로 메모리를 확보하면됩니다.

나는 포인터가 해제 된 후 NULL로 설정되도록

void reset(char** myPointer) { 
    if (myPointer) { 
     free(*myPointer); 
     *myPointer = NULL; 
    } 
} 

같은 함수를 작성라고 생각 하는데요. 이전에 해제 된 포인터를 다시 사용하는 것은 일반적인 오류의 원인입니다.

+0

실제로 몇 가지 코드를 검토 중이므로 예제는 단순화 된 버전입니다. 실제 코드에는 또 다른 코드 행이 있습니다. myCharArrayp = NULL; 내가 알고있는 것은 일하지 않을 것이다. 그러나 자유가 작동하지 않을지 궁금해지기 시작합니다. 나는 그것이 모두 당신이 제안하는 방식으로 다시 써야만한다고 생각합니다. 고마워 : O) – Henrik

+0

조의 대답에 잘 설명되어 있습니다. 포인터는 스택에 저장된 변수이고 함수는 복사본을 가져옵니다. 그래서 위의 예에서 포인터에 대한 포인터가 필요합니다. –

+2

네,'char **'(또는'void **')가 필요 하겠지만 코드에서'free'를 호출 한 후'NULL'을 포인터에 할당하지 않는 이유는 무엇입니까? "ptr이 NULL 포인터이면 아무 작업도 수행되지 않습니다." 그래서이 함수는 약간 낭비라고 말할 것입니다! – Joe

14

포인터는 스택에 저장된 변수 일 뿐이라는 점을 알아야합니다. 이 경우 힙에 할당 된 메모리 영역을 가리 킵니다. 코드가 올바르게 힙의 메모리를 해제합니다. 함수에서 돌아 오면 포인터 변수는 다른 변수 (예 : int)와 마찬가지로 해제됩니다.

void myFunction() 
{ 
    char *myPointer;  // <- the function's stack frame is set up with space for... 
    int myOtherVariable; // <- ... these two variables 

    myPointer = malloc(123); // <- some memory is allocated on the heap and your pointer points to it 

    free(myPointer); // <- the memory on the heap is deallocated 

} // <- the two local variables myPointer and myOtherVariable are freed as the function returns. 
+0

좋은 설명 주셔서 감사합니다. – Henrik

+1

헤드 및 스택에서 메모리를 확보하는 차이점에 대해 자세히 설명하는이 좋은 설명을 보내 주셔서 감사합니다. 필자의 경우, <-가 //로 대체되면 소스 코드의 색상이 더 좋을 것이므로 읽기가 더 쉽습니다. –

1

예. 작동합니다.

포인터 변수의 복사본이 보내지지만 실제로는 무료 메모리를 호출 할 때 해제 될 올바른 메모리 위치를 참조합니다.