#c #pointers #malloc #valgrind
Вопрос:
У меня есть код на C, как показано ниже (минимальный воспроизводимый пример):
BYTE *myPointer; doStuff(amp;myPointer); //mallocs space and sets myPointer to point to this space FILE* myFile = fopen(fileName, "rb "); fseek(myFile, 0, SEEK_SET); fwrite(myPointer, 32, 1, myFile); //lt;------- problematic line
теперь этот код работает и делает то, что должен, но valgrind выдает следующую ошибку в строке fwrite(myPointer, 32, 1, myFile);
:
Syscall param write(buf) points to uninitialised byte(s)
и я думаю, это потому, что Valgrind считает, что myPointer неинициализирован.
Это справедливо, но внутри функции doStuff я выделяю пространство и устанавливаю myPointer, чтобы указать на него, поэтому все работает так, как ожидалось.
Есть ли какой-то способ, которым я могу сообщить вальгринду об этом/заставить замолчать ошибку?
Спасибо
Комментарии:
1. Вы, должно быть, делаете это неправильно, иначе
valgrind
не стали бы жаловаться, что он неинициализирован. Опубликуйте кодdoStuff()
.2. Недостаточно выделить память, вам также необходимо инициализировать содержимое памяти. Вы заполнили по крайней мере 32 байта?
3. ах ладно, большое спасибо, я думаю, что с Достаффом что-то не так (), я еще немного покопаюсь в этом, не думал, что валгринд не стал бы жаловаться иначе!
4. используйте calloc, и память будет инициализирована
Ответ №1:
fwrite
Функция используется для записи данных в файл. Это означает (в данном случае), что myPointer
ожидается, что он будет указывать на 32 байта данных, которые будут записаны на диск.
Это, конечно, проблема, потому что если doStuff
не заполнять точки памяти myPointer
, то эти байты на самом деле будут неинициализированы.
Предполагая, что вы действительно хотите прочитать из файла, используйте fread
вместо этого.
fread(myPointer, 32, 1, myFile);
Если вы действительно хотите писать, убедитесь, что по крайней мере 32 байта, которые myPointer
указывают, были фактически установлены в какое-то значение.
Комментарии:
1. получил это большое спасибо, я действительно хочу написать, поэтому я думаю, что это что-то не так с функцией doStuff ()! Опубликую свой результат здесь, когда я это выясню 🙂