string = malloc(16);
Довольно скупо, учитывая, что вы собираетесь написать:
sprintf(string, "someString to be parsed...%d\n\0", ++i);
, что составляет не менее 28 байтов, если i
- одна цифра, и достигает 32 байтов, когда i
достигает10000. (Вероятно, это не совпадение.)
Сделайте себе одолжение и используйте asprintf
, если можете. Если он недоступен, достаточно просто написать его, используя snprintf
, или вы можете просто использовать snprintf
с гораздо большим буфером. (В этом случае динамическое выделение не требуется.)
Обратите внимание, что \0
в конце строки формата абсолютно бессмысленно. Я предполагаю, что вы намеревались гарантировать, что есть два NUL-терминатора, как того требует yy_scan_buffer
, но \0
не будет скопирован в вывод sprintf
, так как это приведет к завершению строки формата. (Строки C заканчиваются символом NUL, запомните.)
Также обратите внимание, что sizeof(string)
в yy_scan_buffer(string, sizeof(string));
- это sizeof(char*)
, поскольку string
- это char*
. Это, скорее всего, 8 дней, но это может быть 4, если вы используете 32-битную среду. В любом случае, он не имеет отношения к количеству символов, которые написал sprintf
. Вы можете использовать strlen
для подсчета длины string
, но было бы более эффективно использовать тот факт, что sprintf
возвращает количество записанных им байтов.
И, говоря о возвращаемых значениях,вы не проверяете возвращаемое значение из yy_scan_buffer
, которое, вероятно, пыталось сообщить вам о вашей ошибке:
Если вам не удалось настроить базу таким образом (т.е. забыть последние дваYY_END_OF_BUFFER_CHAR), затем yy_scan_buffer()
возвращает указатель NULL вместо создания нового входного буфера.