2014-10-09 1 views
1

man7.org에서 설명서를 읽고 StackOverflow에 대해 몇 가지 질문을 읽었으므로 strtok 함수에서 반환 된 토큰의 수명을 누가 관리하는지 이해하는 데 여전히 어려움을 겪고 있습니다. 문자열에 토큰이없는 경우토큰의 수명이 strtok에서 반환됩니다.

char *token = NULL; 

token = strtok(buffer, " "); 

while (token != NULL) { 
    token = strtok(NULL, " "); 
} 

내가 그 strtok를 다음 토큰에 대한 포인터를 반환 이해하고 NULL : 내가 본 대부분의 예제는 다음 strtok를 기능에 대한 사용을 보여줍니다. 그러나이 토큰에는 어떤 저장소 (스택 또는 malloc 사용)도 미리 할당하지 않습니다. strtok은 각 토큰에 어떻게 스토리지를 할당합니까? 메모리 누수를 방지하기 위해 각 토큰을 무료로 호출해야합니까? 토큰을 strcpy를 사용하지 않고 배열에 넣을 수 있습니까? 아니면 범위를 벗어나서 스택에서 튀어 나와 배열에 매달려있는 포인터가 나옵니까?

감사합니다.

+3

버퍼에 포인터를 반환합니다. 메모리가 할당되지 않습니다. 'strtok'는 문자를 삽입하는'buffer'를 수정하여 다음 토큰을 구분합니다. – hmjd

+0

잠깐 : Stack Overflow에서 "hello"와 "thanks"는 필요하지 않으므로 제거해야합니다. –

+0

관련 항목 : http://stackoverflow.com/q/3889992/694576 – alk

답변

0

이와 같은 질문에 대해서는 reading the source of an strtok() implementation이 매우 유익 할 수 있습니다. 한마디로

:

그것은 buffer로 포인터를 반환
  • , 즉 원래의 문자열입니다.
  • 예, 토큰은 문자열 터미네이터로 대체됩니다. 따라서 strtok()은 매우 위험하고 스레드로부터 안전하지 않습니다.