关于C中static的问题

来源:百度知道 编辑:UC知道 时间:2024/05/23 17:34:30
一段程序如下:
#include "stdafx.h"
#include <stdio.h>
int main()
{
int c;
char buf[6];
setbuf(stdout, buf);
while((c = getchar()) != 'b')
putchar(c);
fflush(stdout);
return 0;
}

输入:hello world!
b
输出:hello wob

而在buf的定义前加上static,即:static char buf[6];
程序的输出就是正常的。

《C陷阱与缺陷》里面关于一段类似的程序是这样说的:
我们不妨思考一下buf缓冲区最后一次被清空是在
什么时候?答案是在main函数结束之后,作为程序交回
控制给操作系统之前C运行时库必须进行的清理工作的
一部分。但是,在此之前buf字符数组已经被释放!
要避免这种类型的错误有两种办法。第一种办法是
让缓冲数组成为静态数组……

能否详细解释一下上面这段话,为什么buf缓冲区最后
一次清空是在main函数结束之后?为什么在此之前buf字符
数组已经被释放?

还有,为什么我buf的大小是6,而最后输出的结果有9
个字符(8个字符加上1个结束标志)?

最后一个问题:VC里面如何对static类型的数组调试的
时候在watch里面看到它?我调试的时候一直说找不到buf。

谢谢解答!
嗯,简单点的解释就是说,缓冲区溢出了,因为函数内部的局部变量是存放在栈上的,而栈上保存了许多函数调用非常重要的数据,所以,缓冲区一溢出,就会输出很奇怪的结果,或者程序运行结束时会弹出个错误对话框。
在这个变量加上static以后,这个变量就不在栈上保存了,

让我来看一下。
1.对于static类的数据,只有在程序退出时,才会被释放,你的程序只能从主程序main中退出,所以在main中被释放.只有自动变量,才会在函数执行完时,自动释放.
2.你是通过比较C是不是字符'b'来结束输出所以才会是你看到了那样,如果输入
fdsafsfbfdsfsfsfbfdsfsfb那么它也只会输出fdsafsf,而不会输出b后的字符。所以虽然是6个大小,但是还是输出9个字符.
3.对于这个情况,只有两种解释,要么你没有生成没有生成调试信息,要么就没在main中watch.

我试了一下,我发现你这个问题提的很有水平呢!关注中!

楼主,犀利了,不过我还是有点小疑惑,是否还有通俗点的解释

自问自答 乐在其中啊