使用 fgets returns 0 的函数
function using fgets returns 0
我正在写一个小型计算器,用于 arduino,使用 RPN(反向抛光符号)。因为我还想在我的 x86 笔记本电脑上编写代码 运行,为我的计算器程序设置一些配置参数,我使用 input_str
、input_int
和 output_str
等函数,所以我可以为我的笔记本电脑或 arduino 以不同的方式实现它们。
现在 input_str
char *input_str(void) {
#if IS_IO_STDIO
char iobuf[IO_BUF_SIZE];
fgets(iobuf, IO_BUF_SIZE, stdin);
if (IS_DEBUG) { printf("1. iobuf: %s\n", iobuf); }
if (IS_DEBUG) { printf("2. iobuf ptr: %p\n", iobuf); }
return iobuf;
#elif IS_IO_SERIAL
// TODO: implement serial input str
#endif // IS_IO_STDIO
}
使用 fgets
来获取用户的输入(用于将来的计算),1. iobuf printout
正确打印出用户输入的字符串,2. iobuf ptr
正确打印出一些 char *
不等于 0.
当我在我的 ipo-loop 中使用 input_str
的 return 值时:
int ipo_loop(int16_t *stack, int *sp) {
// TODO: implement real ipo loop
int is_exit = false;
char *iobuf;
while (!is_exit) {
iobuf = input_str();
if (IS_DEBUG) { printf("3. iobuf ptr: %p\n", iobuf); }
output_str(iobuf);
}
return 0;
}
3. iobuf ptr
突然显示,iobuf
现在指向 0。
为什么iobuf
突然变成0了?
从 char[IO_BUF_SIZE]
到 char *
是某种类型转换问题吗?
在下面的代码中
char *input_str(void) {
char iobuf[IO_BUF_SIZE];
fgets(iobuf, IO_BUF_SIZE, stdin);
/* some code */
return iobuf;
}
您所在的位置 return 本地数组 iobuf
会导致 未定义的行为 。在 input_str()
中声明的字符数组 iobuf
具有局部作用域,并且当控制从该函数退出时其作用域结束。
如果您可以使用 flags 编译您的代码,例如 -Wall
、-Wextra
等,例如
gcc -Wall -Wextra -Werror -Wpedantic test.c
编译器可能会警告你
warning: address of stack memory associated with local variable
'iobuf' returned [-Wreturn-stack-address]
以上编译器警告说明了有关该问题的所有信息及其可读性。
创建 动态数组 & return 而不是 return 本地数组。例如
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;
在调用 API ipo_loop()
完成动态 returned 数组后,不要忘记 free
它以避免内存泄漏。例如
iobuf = input_str();
/* processing with iobuf.. here iobuf is dynamically returned array */
free(iobuf);
我正在写一个小型计算器,用于 arduino,使用 RPN(反向抛光符号)。因为我还想在我的 x86 笔记本电脑上编写代码 运行,为我的计算器程序设置一些配置参数,我使用 input_str
、input_int
和 output_str
等函数,所以我可以为我的笔记本电脑或 arduino 以不同的方式实现它们。
现在 input_str
char *input_str(void) {
#if IS_IO_STDIO
char iobuf[IO_BUF_SIZE];
fgets(iobuf, IO_BUF_SIZE, stdin);
if (IS_DEBUG) { printf("1. iobuf: %s\n", iobuf); }
if (IS_DEBUG) { printf("2. iobuf ptr: %p\n", iobuf); }
return iobuf;
#elif IS_IO_SERIAL
// TODO: implement serial input str
#endif // IS_IO_STDIO
}
使用 fgets
来获取用户的输入(用于将来的计算),1. iobuf printout
正确打印出用户输入的字符串,2. iobuf ptr
正确打印出一些 char *
不等于 0.
当我在我的 ipo-loop 中使用 input_str
的 return 值时:
int ipo_loop(int16_t *stack, int *sp) {
// TODO: implement real ipo loop
int is_exit = false;
char *iobuf;
while (!is_exit) {
iobuf = input_str();
if (IS_DEBUG) { printf("3. iobuf ptr: %p\n", iobuf); }
output_str(iobuf);
}
return 0;
}
3. iobuf ptr
突然显示,iobuf
现在指向 0。
为什么iobuf
突然变成0了?
从 char[IO_BUF_SIZE]
到 char *
是某种类型转换问题吗?
在下面的代码中
char *input_str(void) {
char iobuf[IO_BUF_SIZE];
fgets(iobuf, IO_BUF_SIZE, stdin);
/* some code */
return iobuf;
}
您所在的位置 return 本地数组 iobuf
会导致 未定义的行为 。在 input_str()
中声明的字符数组 iobuf
具有局部作用域,并且当控制从该函数退出时其作用域结束。
如果您可以使用 flags 编译您的代码,例如 -Wall
、-Wextra
等,例如
gcc -Wall -Wextra -Werror -Wpedantic test.c
编译器可能会警告你
warning: address of stack memory associated with local variable 'iobuf' returned [-Wreturn-stack-address]
以上编译器警告说明了有关该问题的所有信息及其可读性。
创建 动态数组 & return 而不是 return 本地数组。例如
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;
在调用 API ipo_loop()
完成动态 returned 数组后,不要忘记 free
它以避免内存泄漏。例如
iobuf = input_str();
/* processing with iobuf.. here iobuf is dynamically returned array */
free(iobuf);