无法理解以下内容:malloc后立即释放;打开后立即关闭文件

球座

我正在阅读一些有关使用c语言使用curses编写的旧的银行出纳管理工具的源代码,以下是一些我无法理解的代码:

main(int argc, char *argv[])
{
    int h1, h2;
    char *m1, *m2;
    char fname[100];

    sprintf(fname, "%s/welcome.txt", getenv("xxDIR"));

    m1 = malloc(1);
    free(m1);

    h1 = open(fname, 0);
    if (h1>0) 
        close(h1);
    else 
        fprintf(stderr,"Open first  file : %s \n", strerror(errno));

    func1(argc, argv);

    h2 = open(fname, 0);
    if (h2>0) 
        close(h1);
    else 
        fprintf(stderr,"Open second file : %s \n", strerror(errno));

    if (h1!=h2) 
    {
        fprintf(stderr,"File Open/Close Check: h1=%d, h2=%d\n", h1, h2);
    }

    m2 = malloc(1);
    free(m2);

    if (m1!=m2) 
    {
        printf("Mem  Alloc/Free Check: %ld\n", (long)(m2-m1));
    }       

    exit(0);
}

就像我问为什么在malloc之后立即释放并在打开之后立即关闭文件?func1在这里:

func1(int argc, char *argv[])
{
    char trad_code[5];
    int xx1();
    int xx2();
    int xx3();
    int xx4();
    int xx5();
    int prt_translate(char *fmt, char *data);

    signal( SIGINT, SIG_IGN );

    scr_open();
    clear();
    refresh();

    while ( scr_kbhit() ) scr_getch();

    screen_set_function ( screen_FUNCID_CONFIRM, xx1 );
    screen_set_function ( screen_FUNCID_SETDATA, xx2 );
    screen_set_function ( screen_FUNCID_GETDATA, xx3 );
    screen_set_function ( screen_FUNCID_FLDIN,   xx4 );
    screen_set_function ( screen_FUNCID_FLDOUT,  xx5 );
    prt_set_transfunction ( prt_translate );

    if (sysinit()!=0)   
        goto sysexit;

    Show_Title();
    refresh();

    if (Show_Welcome())
        goto sysexit;

    strcpy(trad_code, "0000");
    do_menu( "0000", trad_code, xxx );

    syskill();

sysexit:

    clear();
    refresh();
    while ( scr_kbhit() ) scr_getch();
    endwin();

    return 0;
}
樱桃DT

如我的评论所述,在我看来,这是检查是否func1泄漏内存或文件句柄。

从本质上讲,该代码检查在调用之前和之后分配内存是否会返回相同的内存地址,以及在调用之前和之后打开文件都会返回相同的文件句柄。

如果func1调用malloc但又忘记free了内存,或者它打开了一个文件却又没有关闭它,则m1andm2h1and的值h2将分别不同。

但是,这不是便携式方法。它可能在一个特定的平台上运行,但是不能保证堆和文件句柄将像在其他平台上那样被重用-func1即使在没有任何泄漏的情况下,它们也可能在返回之前和之后返回不同的值

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从OneDrive下载后无法立即打开文件

来自分类Dev

'Workbook.open'错误-打开文件后立即关闭文件

来自分类Dev

PlacePicker.IntentBuilder打开后立即关闭

来自分类Dev

打开后对话框立即关闭

来自分类Dev

保存完成后立即打开文件

来自分类Dev

Android虚拟设备在打开后立即关闭

来自分类Dev

用参数启动exe,但是打开后程序立即关闭?

来自分类Dev

Eclipse打开,然后在出现图形后立即关闭

来自分类Dev

Dmenu启动的某些程序在打开后立即关闭

来自分类Dev

Android 应用程序打开后立即关闭

来自分类Dev

从JSON设置后立即释放模型属性

来自分类Dev

下载后立即处理文件

来自分类Dev

关闭连接后立即移除连接对象

来自分类Dev

Android Place Picker启动后立即关闭

来自分类Dev

Xamarin Android应用启动后立即关闭

来自分类Dev

输入值后程序立即关闭

来自分类Dev

Docker容器在启动后立即关闭

来自分类Dev

Cronjob在启动后立即关闭mac

来自分类Dev

关闭连接后立即移除连接对象

来自分类Dev

双击启动后,.exe将立即关闭

来自分类Dev

单击后禁用按钮或立即关闭模态

来自分类Dev

Xcode在打开后立即崩溃

来自分类Dev

打开程序后立即保存文档

来自分类Dev

Chrome在打开后立即崩溃

来自分类Dev

关闭后无法重新打开文件

来自分类Dev

渲染后,Django模板的内容立即消失

来自分类Dev

如何修复在单击按钮打开后立即关闭的模式弹出窗口

来自分类Dev

插入计算机后便会打开,然后立即关闭

来自分类Dev

18.04 打开笔记本电脑盖从睡眠中唤醒后立即关闭