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