2013-08-27 88 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

sourcetring從哪裏來? – Jiminion

+0

sourceString是stringModifier範圍,並採取信息qsortString的tempString參數。但我認爲,真正的問題是對的strcpy .. – GSchimiti

+0

你有沒有分配給tempstring(ALLOC或malloc的)空間? – Jiminion

回答

1

按照其中一個調用的路徑。

  1. char *tempString1 = (char *) malloc (strlen(string1) * sizeof(char));:此分配一個字符串緩衝區是字符的string1不包括0終止子,如果你想存儲字符串的完整副本空間終止需要數,但你不分配它。

  2. qsortString(string1, tempString1);:現在我們通過這兩個源字符串緩衝區新分配的一個炭火太短緩衝區此功能。

  3. qsortString(),然後你strcpy(tempString, string);:這將寫入一個額外的字符(終止符)到你不擁有的內存。因此,這是未定義的行爲

Valrind是對的。你正在寫(然後閱讀)你不擁有的記憶。該分配應該包括用於0-終止符的空間。如: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));