2014-10-30 1 views
0
int parseString(char* input, char*** words, int* size) { 
    char *word; 

    *words = malloc(sizeof(char)); 
    word = strtok(input, " \n\t"); 

    while (word != NULL) { 
     (*words)[*size] = malloc(sizeof(word) + 1); 
     strcpy((*words)[*size], word); 
     (*size)++; 
     *words = realloc(*words, ((*size) + 1) * sizeof(char)); 
     word = strtok(NULL, " \n\t"); 
    } 
    return 0; 
} 

문자열 (input)을 받고 단어를 분리하여 저장하고 싶습니다. 네번째 반복에C realloc() char ** "다음 크기가 유효하지 않음"오류

(항상 규정에, 결코 빨리) 나는 realloc(...)에서 오류가 발생하지 while 루프에서 :

realloc(): invalid next size: 0x0000000001641010 *** 
Aborted (core dumped) 

제작 후 @TaylorBrandstetter에 의해 만들어진 코드 외모를 @chux 변경된 제안 이 같은 : 당신이 NULL을 통과 할 때

int parseString(char* input, char*** words, int* size) { 
    char *word; 

    *words = malloc(sizeof(char*)); 
    word = strtok(input, " \n\t"); 

    while (word != NULL) { 
     (*words)[*size] = malloc(strlen(word) + 1); 
     strcpy((*words)[*size], word); 
     (*size)++; 
     *words = realloc(*words, ((*size) + 1) * sizeof(char*)); 
     word = strtok(NULL, " \n\t"); 
    } 
    return 0; 
} 
+0

우선,'* words'를위한 단일 바이트를 할당하는 것은 * 포인터 * (각 4 또는 8 바이트 가능성이 있음)의 * 배열 *을위한 충분한 공간이 아닙니다. 그리고'sizeof (word)'는 문자열의 크기를 알려주지 않고'char * '의 크기만을 알려줍니다. 'sizeof' 계산은 런타임 중에 발생하지 않는다는 것을 명심하십시오. –

+0

컴파일러의 경고 (gcc에 대해 명령 줄 옵션'-Wall -Wextra -pedantic')를 활성화 한 다음 더 이상 경고가 발행되지 않을 때까지 코드를 수정하고 싶을 수도 있습니다. – alk

+0

'sizeof (word)'대신'strlen (word)'을 제안하십시오. – chux

답변

0

결함은 문자열의 처리에 있습니다

(*words)[*size] = malloc(sizeof(word) + 1); 
strcpy((*words)[*size], word); 

sizeof(word)이 4 (물론, 그것은 뭔가 다른 수 있지만,이 포인터의 크기이다). @Taylor Brandstetter가 언급 한 바와 같이, *words의 malloc에 ​​너무 작,

(*words)[*size] = malloc(strlen(word) + 1); 
strcpy((*words)[*size], word); 

그리고이 대신 strlen(word) 할 필요가있다. 실제로 입력에서 최대 단어 수를 알지 못하면 입력이 한 번 구문 분석 될 때까지 *words의 끝 크기를 알 수 없습니다.

0
*words = realloc(*words, ((*size) + 1) * sizeof(char)); 
    word = strtok(NULL, " \n\t"); 

strtok 기능은 재개 할 수 있도록 중단 한 부분에 대한 포인터를 숨겨 놨다 첫 번째 매개 변수. 그러나 realloc을 호출하면 데이터를 이동할 수 있기 때문에 저장된 포인터가 무효화됩니다. 따라서 첫 번째 매개 변수로 NULL을 전달할 수 없습니다. 그러나 당신은.

관련 문제