2009-08-04 3 views
3

나는 유일한 인수로 char *를 취하는 함수를 가지고있다. 그런 다음 strtok 작업을 수행합니다. 때로는 효과가 있고 때로는 효과가 있습니다. 그것은 문자열이 어떻게 생성되었는지에 달려 있습니다. 예를 들어 여기에 두 가지 경우가 있습니다.C 문자열 할당 차이가 있습니까?

int main() 
{ 
    char glob[] = "/abc/def/ghi"; 
    char *glob2 = "/abc/def/ghi"; 

    func(glob); //this one works 
    func(glob2); //this one doesnt work 

    return 0; 
} 

두 가지 할당 방법의 차이점은 무엇이며 두 번째 할당 방법에서 strtok가 왜 폭발합니까?

+9

char []와 char *의 차이점에 대한 litb의 우수한 게시물 읽기 - http://stackoverflow.com/questions/308279/c-strings-vs/308724#308724 – Falaina

+3

char *에 문자열 상수 할당 const char *)는 역사적인 이유로 만 합법적입니다. 이 패키지는 더 이상 사용되지 않는 것으로 간주되며 일부 컴파일러는 경고를 보냅니다. –

답변

12

strtok()은 기본적으로 입력 문자열을 수정합니다.

char *glob2 = "/abc/def/ghi"; 

상기 경우에 glob2 포인트 데이터를 읽기 전용으로하기 때문에 그와 반면 "char glob[] = "/abc/def/ghi";"데이터 읽기 전용이 아닌, 그 문자 배열 가능한 실패. 따라서 수정이 가능합니다.

+0

매뉴얼 페이지에서 인용 : 이러한 기능을 사용할 때는주의하십시오. 이들을 사용하는 경우 다음을 참고하십시오. -이 함수는 첫 번째 인수를 수정합니다. -이 함수는 상수 문자열에 사용할 수 없습니다. - 구분 문자의 ID가 손실됩니다. - strtok() 함수는 파싱하는 동안 정적 버퍼를 사용하므로 스레드로부터 안전하지 않습니다. 이것이 중요한 경우 strtok_r()을 사용하십시오. –

6

문자열에 할당 된 메모리에 Strtok이 씁니다.

대부분의 컴파일러/런타임/하드웨어에서 정적으로 할당 된 문자열 메모리에 쓸 수 없습니다. 스택에 쓸 수 있습니다.

7

char [] str1 = "foo"는 스택에 char 배열을 할당합니다 (함수 내부에 있다고 가정). 그 배열은 문제없이 수정 될 수 있습니다.

const char * str = "foo"는 대개 읽기 전용 메모리에 상주하는 문자열 foo에 대한 포인터를 제공합니다.

char * str = "foo"는 동일한 일을하지만 암시 적으로 포인터가 읽기 전용 메모리를 가리킬 가능성을 실제로 변경하지 않고 const를 제거합니다.

-2

기타 의견은 정확합니다. 대신 strtok_r()을 사용해야합니다.

+0

-1, 왜냐하면 strtok_r은 실제로 여기의 문제와 직접적으로 관련이 없기 때문입니다. * strtok_r과 strtok 둘 다 입력 버퍼를 수정합니다. –

+0

아 맞습니다. –