Valgrind неверный размер чтения 1 в 2-мерном массиве

Я довольно новичок как в 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 приведет к строкам, которые не заканчиваются нулем. Попробуйте принудительно завершить null до 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