В приведенном ниже коде
char *input_str(void) {
char iobuf[IO_BUF_SIZE];
fgets(iobuf, IO_BUF_SIZE, stdin);
/* some code */
return iobuf;
}
, куда вы возвращаете локальный массив iobuf
, вызывает неопределенное поведение .Массив char iobuf
, объявленный в input_str()
, имеет локальную область видимости, и его область действия заканчивается, когда управление выходит из этой функции.
Если вы могли бы скомпилировать свой код с flags наподобие -Wall
, -Wextra
и т. Д., Например, компилятор
gcc -Wall -Wextra -Werror -Wpedantic test.c
мог бы предупредить вас как
предупреждение: возвращен адрес стековой памяти, связанной с локальной переменной 'iobuf' [-Wreturn-адрес стека]
Выше предупреждение компилятора расскажет все о проблеме и ее читабельности.
Вместо того, чтобы возвращать локальный массив, создайте динамический массив и верните его,Например,
char *iobuf = malloc(IO_BUF_SIZE * sizeof(*iobuf));
/* @TODO if malloc was success i.e check return value of malloc */
. После этого отсканируйте данные, используя fgets()
, как вы сделали ниже.
fgets(iobuf, IO_BUF_SIZE, stdin);
, а затем верните динамический массив
return iobuf;
Inвызывая API ipo_loop()
, как только вы закончите с динамически возвращаемым массивом, не забудьте free
, чтобы избежать утечки памяти.например,
iobuf = input_str();
/* processing with iobuf.. here iobuf is dynamically returned array */
free(iobuf);