2013-08-27 1 views
0

나는 을 가지고 있습니다.valgrind의 문제가 있고 그 이유를 모르겠습니다. 오류는 동일한 코드 블록에서 항상 발생하며 메모리 주소 만 변경됩니다. 코드 블록은 다음과 같습니다Valgrind 경고 쓰기 및 읽기 오류

void stringModifier(char *string) { 
    char *sourceString = string; 
    char *destinyString = sourceString; 

    while(*string != '\0') { 
      *string = tolower(*string); 

      if(*string != ' ') { *destinyString++ = *string; } 

      string++; 
    } 

    *destinyString = '\0'; 
} 

int qsortComparison(const void *a, const void *b) { 
    return (*(char *)a - *(char *)b); 
} 

void qsortString(char *string, char *tempString) { 
    strcpy(tempString, string); 
    stringModifier(tempString); 
    qsort(tempString, strlen(tempString), sizeof(char), qsortComparison); 
} 

void outputReader(char *string1, char *string2) { 
    char *tempString1 = (char *) malloc (strlen(string1) * sizeof(char)); 
    char *tempString2 = (char *) malloc (strlen(string2) * sizeof(char)); 

    qsortString(string1, tempString1); 
    qsortString(string2, tempString2); 

    if(!strcmp(tempString1, tempString2)) { printf("V\n", string1, string2); } 
    else { printf("F\n"); } 
} 

내가 outputReader를 사용하고 qsortString, Valgrind의 전화 할 때마다strcpy를에서 쓰기 오류를 경고하고 그 후 stringModifier에서 읽기 오류 경고, 동일한 메모리 주소에서 발생합니다.

+0

출처는 어디에서 왔습니까? – Jiminion

+0

sourceString은 stringModifier 범위에 있으며 qsortString의 tempString 매개 변수에 대한 정보를 가져옵니다. 하지만 정말 문제가 strcpy에 있다고 생각합니다. – GSchimiti

+0

tempstring (alloc 또는 malloc)을위한 공간을 할당 했습니까? – Jiminion

답변

1

문제가되는 호출 중 하나의 경로를 따르십시오.

  1. char *tempString1 = (char *) malloc (strlen(string1) * sizeof(char)); : 이것은 당신이 문자열의 완벽한 복사본을 저장하려면 터미네이터를위한 공간이 필요한 0 -terminator 포함하지 string1의 문자 수는 문자열 버퍼를 할당 ,하지만 당신은 그것을 할당하지 않습니다.

  2. qsortString(string1, tempString1); : 이제 우리는 소스 문자열 버퍼 을이 함수에 새로 할당 된 one-char-too-short 버퍼로 전달합니다.

  3. qsortString()에서 strcpy(tempString, string); : 이것은 소유하지 않은 메모리에 추가로 char (종결 자)를 기록합니다. 따라서 정의되지 않은 동작입니다.

발린트가 옳다. 당신은 자신이 소유하지 않은 메모리를 쓰고 있습니다. 할당에는 0 -terminator의 공간이 포함되어야합니다. malloc ((strlen(string1)+1) * sizeof(char)); 또 다른 옵션은 C 표준의 일부는 아니지만 strdup()을 사용하는 것입니다. 그러면 할당을 올바르게 처리 할 수 ​​있습니다. 내가 떠난 솔루션에 접근하는 방법.

사이드 노트 : Don't cast malloc() return values in C

+0

지금 무슨 일이 있었는지 이해합니다. 복사 작업의 0 종결자를 잊어 버렸습니다. 감사! – GSchimiti

1

문자열의 널 종결자를 설명하기 위해 strlen + 1을 할당해야합니다.

void outputReader(char *string1, char *string2) { 
    char *tempString1 = (char *) malloc ((strlen(string1)+1) * sizeof(char)); 
    char *tempString2 = (char *) malloc ((strlen(string2)+1) * sizeof(char));