Valgrind невалиден размер на четене от 1 в двумерен масив

Аз съм сравнително нов както за valgrind, така и за C и имам проблеми с тълкуването какво точно не е наред с моя код. Получавам невалиден размер на четене от 1 на ред 285 и той казва, че адресът е 0 байта, след като е разпределен блок от 5. Моето разпределение е както следва:

output = malloc(sizeof(char**));
output[0] = malloc(sizeof(char*)*size);
for(i = 0; i < size; i++){
    output[0][i] = malloc(wordLength);
}

и невалидният размер на четене и околните редове са:

for(j = 0; j < size; j++){
    printf("%s, ", output[0][j]);
    free(output[0][j]);
}

Не освобождавам тези данни никъде другаде в моя код, така че не съм сигурен какво не е наред. Освен това всъщност има повече от един 2d масив в изхода, но не смятах, че е необходимо да навлизам в това, тъй като тази грешка изглежда се корени в този конкретен случай.


person Strogenstroff    schedule 13.12.2012    source източник
comment
Има ли само едно невалидно предупреждение за размер на четене или едно за всяка дума в изхода [0]?   -  person asm    schedule 13.12.2012
comment
За всяка дума има по една   -  person Strogenstroff    schedule 13.12.2012


Отговори (1)


Къде се поставят думите в тази структура от данни? Директивата %s ще чете символи, докато не достигне \0 нулев терминатор. Така че, ако думата е с един знак по-дълга от разпределения блок памет, редът printf ще прочете един байт след края.

person asm    schedule 13.12.2012
comment
Използвах strncpy с wordLength като трети параметър, така че трябва да поставя само знаци wordLength във всеки блок - person Strogenstroff; 13.12.2012
comment
wordLength включва ли нулевия терминатор? Ако не, тогава strncopy ще доведе до низове, които не са завършени с нула. Опитайте да принудите нулево прекратяване преди printf, като направите output[0][j][wordLength - 1] = 0 и вижте дали грешките при четене на valgrind изчезват. - person asm; 13.12.2012
comment
Да, ще опитам това, защото използвах strlen, за да намеря wordLength, който не мисля, че включва нулевия терминатор. - person Strogenstroff; 13.12.2012
comment
Да, това беше проблемът, просто трябваше да добавя нулев терминатор в края. Благодаря ти - person Strogenstroff; 13.12.2012