gpt4 book ai didi

c - 使用 fgets 的函数返回 0

转载 作者:太空宇宙 更新时间:2023-11-04 06:11:29 25 4
gpt4 key购买 nike

我正在编写一个小型计算器,用于 arduino,使用 RPN(逆波兰表示法)。因为我还想让代码在我的 x86 笔记本电脑上运行,为我的计算器程序设置一些配置参数,我使用像 input_strinput_intoutput_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,获取用户的输入(用于 future 的计算),1。 iobuf printout 正确打印出用户输入的字符串,2。 iobuf ptr 正确地打印出一些不等于 0 的 char *

当我在我的 ipo 循环中使用 input_str 的返回值时:

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;
}

返回本地数组 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]

上面的编译器警告说明了有关该问题的所有信息及其可读性。

创建动态数组 并返回它,而不是返回本地数组。例如

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() 完成动态返回的数组后,不要忘记释放它以避免内存泄漏。例如

iobuf = input_str();
/* processing with iobuf.. here iobuf is dynamically returned array */
free(iobuf);

关于c - 使用 fgets 的函数返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55313733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com