2011-11-27 5 views
1

문제가 있는지 확실하지 않은 문제가 발생했습니다. 그래서 같은 문자열에서 전달 숯불 *를 유도 할 수있는 간단한 C funcion 있습니다C에서 함수 매개 변수로 전달 된 문자 배열을 해제하는 방법



#include &ltstdio.h> 
#include &ltstdlib.h> 

int main(int argc, char** argv) { 

    passString("hello"); 

    return (EXIT_SUCCESS); 
} 

void passString(char * string) { 
    // .... some code .... 
    free(string); // ??? 
} 
 

을하고 난 난 더 이상 (주로 배열) 작업을하고 있지 않다 메모리 블록을 무료로 배웠습니다. 그래서 비록 내 문자열을 무료로했지만 프로그램이 멈추거나 심지어이 간단한 예제와 충돌. 나는 정말로 여기에서 문자열을 자유롭게 할 필요가 있는지 없는지 잘 모르겠다. 그렇다면 나는 그것을 어떻게 성취 할 수 있는가?

+0

@Kos : 틀린, 문자열 리터럴의 유형은 문자열 리터럴과 0 종결 자의 모든 문자에 대해 충분히 큰'N '을 갖는'char [N]'입니다. ''foobar ''의 타입은'char [7]'입니다. 다른 언어 (즉, C++)에는 차이가 있다고 생각합니다. – pmg

+0

아 ~ 너 완벽하게 맞아. 사실 "const char *를 사용하여 문자열 리터럴을 참조하십시오"라는 의미였습니다. – Kos

+0

@Kos : 문자열 리터럴 대신'char *'만 사용하는 것은 C가 아니라 C++에서 사용되지 않습니다. 그러나, 문자열 리터럴을 수정하는 것은 c와 C++ 모두에서 UB입니다. –

답변

5

malloc으로 할당하지 않은 메모리는 free 일 필요가 없습니다.

예제에서 string은 프로그램에서 malloc에 의해 할당되지 않으므로이를 해제 할 필요가 없습니다. 은 문자열 리터럴이며 읽기 전용 메모리 (구현 정의)의 어딘가에 할당되며 자동으로 해제됩니다.

참조 :
C99 표준 : standerdese 용 팬

free 함수

시놉시스
#INCLUDE
보이드없이 (공극의 * PTR) 7.20.3.2;

설명 :
free 기능, 즉, 상기 할당 할 수 만든 공간 PTR가 해제 될 가리키는시킨다. ptr이 널 (NULL) 포인터이면 조치가 수행되지 않습니다. 그렇지 않으면, 경우 인수는 이전 calloc, malloc, 또는 realloc 함수에 의해 반환 포인터와 일치하지 않거나, 공간 free 또는 realloc, 에의 호출에 의해 해제 된 경우 동작은 네드 운데 파이입니다.

반환
free 함수는 어떤 값도 반환하지 않는다.

1

해제 할 문자열은 "컴파일 중"정적으로 할당됩니다. 실제로 모든 문자열 리터럴 ("hello")이 이런 방식으로 수행됩니다. 할당 된 메모리는 힙에 살지 않기 때문에 해제 할 수 없습니다.

일반적으로 할당 시점에 해제하는 것이 좋습니다. 이 경우, 동적 "hello"을위한 공간을 할당했다, 당신은이 작업을 수행 할 것입니다 :

int main(int argc, char** argv) { 
    char *s = strdup("hello"); 
    passString(s); 
    free(s); 
    return (EXIT_SUCCESS); 
} 

void passString(char * string) { 
    // .... some code .... 
} 
1

당신은 당신이 (C 또는 C++에서 new 키워드를 통해 malloc을 통해) 동적으로 할당 한 것을 해제해야합니다. 기본적으로 malloc()과 같은 할당 통화의 경우 어딘가에 free()이 있어야합니다.

문자열 리터럴은 동적으로 할당되지 않으므로 걱정할 필요가 없습니다.

관련 문제