2010-03-04 5 views
0

내부 포인터에 대해 strtok는 :C :이 정의와 구조체 한 구조체

typedef struct gRow{ 
    char *txt; 
    char *fileName; 
    int line; 
} gRow; 

와 내가는 TXT 문자열에 대해 strtok를 사용하고 싶습니다.

strtok(row->txt, SEPERATOR_CHARACTERS); 

를이 내가 분할 오류를 얻을 지점입니다 : 그래서, gRow *row을 가지고 몇 가지 기능에, 나는이 작업을 수행. 만약 내가 그것을 대체하면 :

strtok(strdup(row->txt), SEPERATOR_CHARACTERS); 

잘 작동합니다. 왜 어떤 아이디어?

감사합니다.

Shahar.

+1

'strtok '을 호출하기 전에'row-> txt'를 적절하게 초기화합니까? –

+0

strdup로 할당 된 메모리를 모두 비운 다음에는 그 메모리를 해제하는 것을 잊지 마십시오! – Jackson

+0

피터, 그랬다. Jackson, 고마워, 나는 그것을 풀어야한다는 것을 안다. 그러나 strdup를 사용할 필요가없는 해결책을 찾기를 희망한다. –

답변

1

gRow * 행의 메모리를 할당해야합니다. 그러면 잘 될 것입니다.

+0

내가 할당 했어 ... 여기에있는 코드는 이미 할당 된 모든 것이 끝나면 포인터를 얻는 함수에서왔다. –

3

strtok은 문자열을 수정합니다. txt 포인터가 읽기 전용 문자열 (예 : const 문자열 리터럴)을 가리키는 경우 예외가 발생합니다.

1

strtok은 주어진 문자열을 수정합니다. 수정 권한이 없으면 분할 오류가 발생할 수 있습니다. strdup은 문자열을 복사하여이를 방지합니다.

1

strtok은 첫 번째 인수를 수정합니다.

수정 할 수없는 char 상수에 대한 포인터를 전달하는 것처럼 보이는 경우 1입니다.

및 사례 2의 경우 수정 가능한 사본을 strdup에 의해 전달했습니다.

+0

답변 해 주셔서 감사합니다. 경우 1에서이 char 포인터는 상수가 아닙니다 (정의하지 않았 음). 그럼 ... 어떻게 되는거죠? –

+0

@Shaharg : 나는 당신이 다음과 같은 것을했는지를 의미했다 : row-> txt = "text"; 그렇다면 당신은 행 -> txt가 가리키는 것을 수정할 수 없으므로 row-> txt를 strtok에 전달할 수 없습니다. – codaddict