免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2527 | 回复: 5
打印 上一主题 下一主题

[C] Incorrect usage of an automatic variable [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-09 12:27 |只看该作者 |倒序浏览
#include    <stdio.h>

#define DATAFILE    "datafile"

FILE *
open_data(void)
{
    FILE    *fp;
    char    databuf[BUFSIZ];   /* setvbuf makes this the stdio buffer */

    if ((fp = fopen(DATAFILE, "r")) == NULL)
        return(NULL);
    if (setvbuf(fp, databuf, _IOLBF, BUFSIZ) != 0)
        return(NULL);
    return(fp);     /* error */
}
UNIX环境高级编程7.10最后有这样一段代码。在下愚昧,对fp进行写操作。然后查看datafile中的内容,没发现什么错误。

我的问题是:如何操作,可以看出自动变量databuf在open_data返回后的释放 对fp产生的“影响”。诚请各位指点。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
2 [报告]
发表于 2011-06-09 15:36 |只看该作者
你在setvbuf后對文件讀寫試驗下。

论坛徽章:
0
3 [报告]
发表于 2011-06-09 15:56 |只看该作者
回复 2# nizvoo


    你是指:在open_data返回之后对filedata进行读写还是在setvbuf调用之后对filedata进行读写?
    前者我试过了,没发现问题。我现在就是想知道:如何操作可以看到问题。因为文章是说databuf是个局部变量,函数返回后会释放,会对fp的操作有影响。
    后者没有尝试,这不在我考虑的范围内。

    附上文中的话。
    The problem is that when open_data returns, the space it used on the stack will be used by the stack frame for the next function that is called. But the standard I/O library will still be using that portion of memory for its stream buffer. Chaos is sure to result. To correct this problem, the array databuf needs to be allocated from global memory, either statically (static or extern) or dynamically (one of the alloc functions).

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
4 [报告]
发表于 2011-06-09 15:58 |只看该作者
你在這個函數裏頭嘗試。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
5 [报告]
发表于 2011-06-09 16:08 |只看该作者
#include    <stdio.h>
#include    <string.h>

#define DATAFILE    "datafile"

FILE *
open_data(void)
{
    FILE    *fp;
    char    databuf[BUFSIZ];   /* setvbuf makes this the stdio buffer */

    if ((fp = fopen(DATAFILE, "r")) == NULL)
        return(NULL);
    if (setvbuf(fp, databuf, _IOLBF, BUFSIZ) != 0)
        return(NULL);
    return(fp);     /* error */
}
void foo() {
    FILE *dummy = 0;
    char databuf[BUFSIZ] = {};

    dummy = 0; // use it, or compiler will remove it.
    strncpy(databuf, "xhello", 5);
}

int main(void)
{
    char buf[BUFSIZ];

    FILE* fp = open_data();

    if (fp != NULL)
    {
        char a = fgetc(fp);
        foo();
        fgets(buf, BUFSIZ, fp);
        printf("%c%s\n", a, buf);
        fclose(fp);
    }

    return 0;
}


试试这个。需要有datafile文件,内容随意,就比如是foo吧。

论坛徽章:
0
6 [报告]
发表于 2011-06-09 17:24 |只看该作者
回复 5# starwing83


    谢谢你的回复。貌似明白了一点。
   
    还有个问题想问一下,就是char a = fgetc(fp);这句话不是很明白。在FILE *fp = open_data();时不是已经打开了吗?为什么现在还  必须 加上这句才可以。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP