簡體   English   中英

使用fgets的函數返回0

[英]function using fgets returns 0

我正在使用RPN(反波蘭表示法)編寫一個用於arduino的小型計算器。 因為我還想讓代碼在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來獲取用戶輸入(以供將來計算), 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM