2012-07-12 4 views
0

어떻게 char * 변수에 문자열을 할당 할 수 있으며 이전에 메모리를 할당 할 필요가 없습니까?ANSI C (메모리 할당)의 문자열 처리

예를 들어 함수에 char * (예 : 파일 경로)가 있으면이 함수를 호출합니다.

char* path; 
path = get_path(); 

가 어떻게 위치의 char * 내가 경로의 길이가 될 것입니다 무엇인지 모르는 경우 행동을 기대할 수? 그것은 이전이 과제가 "경로"의 경로의 크기를 할당하기 위해 꼭 필요하다?

답변

1

:

char* path; 
path = get_path(); 

get_path는 (동등의 주소 나) 문자열을 가리키는 포인터를 반환합니다. (문자열에 대한 포인터는 첫 번째 문자에 대한 포인터입니다.) 할당은 단순히 포인터 값을 복사하여 path에 저장합니다.

get_path 함수 자체에는 문자열을 유지하기위한 공간이 있어야합니다.

여러 가지 방법이 있습니다. 일부는 호출자가 더 이상 필요하지 않은 공간을 할당 해제하는 책임을 맡습니다. 특히 4 (포인터), 6 (배열 및 포인터), 7 (메모리 할당) 및 8 (문자 및 문자열).

+0

정말 고마워!, 나는 그 문서를 확실히 읽을 것이다. 그러나, path = "/ home/blah"와 같은 일을하면 어떻게됩니까? 문자열에 이전 메모리 할당이 어떻게 할당되어 있습니까? –

+0

@GuillermoGruschka : 문자열 리터럴 자체에 할당 된 메모리가 있습니다. ''/ home/blah "'와 종료하는 널 문자' '\ 0' '를 포함하는 프로그램 실행 (정적 저장 기간)의 수명 동안 존재하는'char'의 익명 배열이 있습니다. –

0

이 경우 get_path() 함수는 자체 메모리 버퍼에 대한 포인터를 반환하고 있습니다. 이제 문제는 누가 그 기억을 할당 했는가, 누가 그 기억을 해방 할 책임이 있는가?

-1

get_path에서 이미 할당 된 변수로 포인터를 반환해야합니다. 이와 같이 :

char *get_path() 
{ 
    char *var = (char*)malloc(sizeof(char)*n); 
    setdirectory(var); 
    return var; 
} 

여기서 n은 디렉토리의 크기입니다.

그러나 당신은 당신이 그 이름을 알아낼 수 있고, 단어를 세고, 다른 양의 메모리를 할당하고 (그 정확한 금액으로) 다른 하나를 자유롭게 할 수있는 디렉토리 크기가 아니라고 말 했으므로. 그러면 메모리 사용에 도움이됩니다.

+1

먼저 'var'은 단일 문자 만 보유합니다. 둘째,'get_path()'에서 반환하자 마자'var'가 사라지기 때문에 지역 변수 (non-static 변수)의 주소를 반환하면 정의되지 않은 동작이 발생합니다. –

+0

죄송합니다. 나는 편집 중이다. –

+0

더 감사합니다 (그리고 나는 당신의 철자법을 약간 닦았습니다). 두 개의 노트 :'sizeof (char)'는 정의상 1이고'malloc()'의 결과를 캐스팅하는 것은 불필요하며 에러를 숨길 수 있습니다. Simpler :'char * var = malloc (n);' –

0
char *path;//path is just a pointer 

get_path()에서 경로 문자열에 메모리를 할당하면 포인터 (char * path)가 해당 메모리를 가리키게됩니다. 코드에서