[英]function using fgets returns 0
我正在使用RPN(反波蘭表示法)編寫一個用於arduino的小型計算器。 因為我還想讓代碼在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的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()
聲明的char數組iobuf
具有局部范圍,當控件從該函數退出時,其范圍結束。
如果您可以使用-Wall
, -Wextra
等標志來編譯代碼,例如
gcc -Wall -Wextra -Werror -Wpedantic test.c
編譯器可能已經警告過您
警告:與局部變量“ iobuf”關聯的堆棧內存地址返回了[-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()
,請不要忘記free
它以避免內存泄漏。 例如
iobuf = input_str();
/* processing with iobuf.. here iobuf is dynamically returned array */
free(iobuf);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.