2013-08-27 5 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 предупреждают ошибку в записи в зЬгсру и после этого предупредить прочитать ошибку в stringModifier, происходящий на том же адресе памяти.

+0

Где SourceString приходит? – Jiminion

+0

sourceString находится в области stringModifier и принимает информацию для параметра tempString qsortString. Но я думаю, что действительно проблема была в strcpy. – GSchimiti

+0

Вы выделили место для tempstring (alloc или malloc)? – Jiminion

ответ

1

Следуйте по пути одного из указанных призывов.

  1. char *tempString1 = (char *) malloc (strlen(string1) * sizeof(char));: Это выделяет буфер строки, который является количеством символов в string1НЕ включая 0 -terminator, Пространство для терминатора требуется, если вы хотите сохранить полной копии строки , но вы не выделяете его.

  2. qsortString(string1, tempString1);: Теперь мы переходим как источник строкового буфера и вновь выделенный один-символ слишком короткий буфер для этой функции.

  3. В qsortString() вы тогда strcpy(tempString, string);: Это будет записывать один дополнительный символ (терминатор) в память, которой у вас нет. Это, следовательно, неопределенное поведение.

Valrind является правильным. Вы пишете (затем читаете) память, которой у вас нет. Распределение должно включать место для 0 -terminator. например: malloc ((strlen(string1)+1) * sizeof(char));. Другой вариант, хотя и не входит в стандарт C, заключается в использовании strdup(), который будет обрабатывать как распределение , так и для вас. Как вы решаете подойти к решению, которое я оставляю вам.

Side Примечание: 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)); 
Смежные вопросы