【问题标题】:Why is c not returning my string?为什么 c 不返回我的字符串?
【发布时间】:2013-12-22 15:52:01
【问题描述】:

我不明白为什么下面的程序将“z@”作为字符串返回。但是当我在那之前放一个<pre>printf("%s \n","");</pre> 时,它会返回“11110111”(如方面)。 谁能帮我理解这种行为? 非常感谢!

请在下面找到我发布的整个程序:

#include <stdio.h>

char * bin2str(unsigned char bin) {
char str[] = "00000000";
int i;

    for (i=7; i>=0; i--) {

        if ((bin%2)==0) {
            str[i] = '0';   
        } else {
            str[i] = '1';   
        }
        bin = bin >> 1;

    }

    return ((char *) str);
}


int main() {
    unsigned char testChar;

    testChar |= 0b11110111;
    printf("Let us test binary to string: \n\n \n");

    //printf("%s \n","");
    printf("%s \n", bin2str(testChar)); //now it returns rubbish, but when the previous line is uncommented it turns out to be working correctly. Why?
    return 0;
}   

【问题讨论】:

  • 您的strbin2str 的本地地址。一旦您退出该功能,它就不再存在。访问它是未定义的行为,这意味着它可能有效,也可能无效。它还可能使您的计算机爆炸。简而言之,您不应该使用它,也不应该返回指向局部变量的指针。它有时起作用的原因是字符串保留在堆栈中。它有时不起作用的原因是另一个函数 (printf) 覆盖了堆栈的那一部分。
  • @Shahbaz:您知道在未定义行为后发生爆炸的计算机示例吗?但我知道我损坏了自己的字符串...
  • 我知道Windows中有很多病毒。我不确定哪个更糟。
  • @Shahbaz Windows 比未定义的行为更糟​​糕,因为未定义的行为有时可能会“起作用”。
  • @H2CO3,你是我在 SO 上的新朋友 ;)

标签: c format printf stdout


【解决方案1】:

您正在从函数bin2str(即undefined behaviour)返回局部变量str。相反,您可以使用 strdup() 复制它(或使用 malloc() + strcpy() 等效)。

char *str = strdup("00000000");

并返回它。

别忘了free()它!

【讨论】:

    【解决方案2】:

    您正在生成一个字符串作为bin2str() 中的局部变量。在执行bin2str() 时,该字符串将位于堆栈空间中。函数一返回,堆栈空间就不再有效,str 指向的内存将包含程序是否在从调用bin2str() 返回到调用printf() 之间放入堆栈。打印str的内容。

    替代方案:

    • str 声明为静态。这样,str 将不会被放置在堆栈空间中,并且即使在函数结束后其内容仍然可用。谨防!因为这个解决方案不是线程安全的。

    • 更改您的原型,使其接受第二个参数,该参数将是调用者必须提供的字符串的地址,bin2str() 将写入数字的二进制表示形式。

    【讨论】:

      【解决方案3】:

      感谢大家的反馈。哇,好快啊!
      这是我的第一篇文章。

      我进行了更改。请在下面找到正确运行的程序(没有编译警告):

      #include <stdio.h>
      #include <string.h>
      #include <stdlib.h>
      
      char * bin2str(unsigned char bin) {
          char *str = strdup("00000000");
          int i;
      
          for (i=7; i>=0; i--) {
      
              if ((bin%2)==0) {
                  str[i] = '0';   
              } else {
                  str[i] = '1';   
              }
              bin = bin >> 1;
      
          }
      
          return ((char *) str);
          free(str);
      
      }
      
      
      int main() {
          unsigned char testChar;
      
          testChar |= 0b11110111;
          printf("Let us test binary to string: \n\n \n");
      
          printf("%s \n", bin2str(testChar));
          return 0;
      }   
      

      【讨论】:

        猜你喜欢
        • 2013-03-10
        • 1970-01-01
        • 2022-01-04
        • 2021-05-12
        • 1970-01-01
        • 2017-04-15
        • 2021-08-23
        • 2020-07-06
        • 2018-09-17
        相关资源
        最近更新 更多