Ваш free()
- это катастрофа;вы только free()
данные, когда вы закончили с ним.
Вероятно, вы должны быть ошибкой проверки кодов возврата, по крайней мере из malloc()
и fread()
.
данныхчтение из файла не будет завершено нулем.Вам нужно перераспределить один байт и добавить NUL терминала ('\0'
) после считывания данных в выделенный буфер.(Обратите внимание, что файл мог сжаться с момента его открытия; обратите внимание на значение, возвращаемое с fread()
. Если файл вырос, вы не увидите дополнительных данных, но никакого другого повреждения не произойдет.)
Вы спрашиваете о const
.Предположительно функция square_cm()
имеет подпись, такую как:
void square_cm(SomeType *sc, const char *data_string);
, и вы беспокоитесь, что у вас есть char *
, а не const char *
в вашем коде вызова?
Выне нужно беспокоиться;компилятор добавит const
для вас.const
- это обещание вам, пользователю функции, что сама функция не будет изменять ваши данные.Он может принимать фиксированную строку (например, строковую константу) или динамически размещаемую строку, и это не имеет значения.Когда вы сталкиваетесь с проблемами, у вас есть const char *
или строковый литерал, который вам нужно передать функции, которая принимает char *
.Здесь функция само собой не обещает оставить строку в покое, что может вызвать проблемы.Например, вы не можете передать строковый литерал в strtok()
, потому что функция пытается изменить строку, но строка, вероятно, находится в постоянной памяти, что вызывает проблемы (дампы ядра в Unix; повсеместно неопределенное поведение).
Итак, const
в сигнатуре функции - это обещание потребителю (пользователю) функции ничего не менять.Вы можете передавать const
или не- const
данные в эту функцию, потому что они не будут изменены в любом случае.