Я вижу три проблемы с вашим кодом. Во-первых, чтобы ответить на поставленный вопрос, вы должны передать fscanf
вместо *buffer
в качестве третьего аргумента *1003*. Ответ Нейла хорошо объясняет почему.
Во-вторых, у вас переполнение буфера. fscanf
автоматически добавляет нулевой завершающий символ к отсканированному вводу. В буфере, который вы даете fscanf
, должно быть достаточно места для отсканированного ввода и нулевого завершающего символа. Если вы хотите отсканировать 2047 символов, ваш буфер должен иметь длину 2048 символов.
В-третьих, новая версия вашего кода с утечкой памяти. В вашей предыдущей версии не было утечек, потому что там был размещен буфер в стеке (или в статическом хранилище, если это глобальная переменная). Пространство стека, используемое буфером, будет возвращено, когда функция вернется. Выделение буфера из кучи с помощью malloc
означает, что вы несете ответственность за восстановление выделенной памяти кучи, впоследствии вызывая free
, когда вы закончите работу с буфером. На мой взгляд, ваша оригинальная версия кода, в которой вы разместили buffer
в стеке, была намного лучше.
Случай only , где новая версия может быть предпочтительнее, - это если вы ориентируетесь на систему с очень ограниченным пространством стека (как в случае некоторых встроенных систем). В таких системах выделение большого буфера в стеке может быть плохой идеей. В таком случае может быть предпочтительнее выделить буфер из кучи, используя malloc
, чтобы избежать возможных переполнений стека. Если это так, тогда вы должны быть осторожны, чтобы избежать утечек памяти, вызвав free
для освобождения памяти .