免费注册 查看新帖 |

Chinaunix

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

[函数] 请大家帮忙比对一下这两个函数有什么区别? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-18 15:21 |只看该作者 |倒序浏览
unix4-1-1.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include "myerr.c"

main(int argc, char *argv[])
{
    int i;
    struct stat *buf;
    char *ptr;

    for (i = 1; i < argc; i++)
    {
        printf("%s:", argv[i]);
        
        if (lstat(argv[i], buf) < 0)
            err_ret("lstat error!";

        if (S_ISREG(buf->st_mode))
            ptr = "regular";
        else if (S_ISDIR(buf->st_mode))
            ptr = "DIR";
        else if (S_ISCHR(buf->st_mode))
            ptr = "char";
        else
            ptr = "unknown";
        printf("%s\n", ptr);
        
    }
    exit (0);
}

unix4-1.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include "myerr.c"

main(int argc, char *argv[])
{
    int i;
    struct stat buf;
    char *ptr;

    for (i = 1; i < argc; i++)
    {
        printf("%s:", argv[i]);
        
        if (lstat(argv[i], &buf) < 0)
            err_ret("lstat error!";

        if (S_ISREG(buf.st_mode))
            ptr = "regular";
        else if (S_ISDIR(buf.st_mode))
            ptr = "DIR";
        else if (S_ISCHR(buf.st_mode))
            ptr = "char";
        else
            ptr = "unknown";
        printf("%s\n", ptr);
        
    }
    exit (0);
}

编译执行的结果:
linux:/opt/test # gcc -g unix4-1-1.c
linux:/opt/test # ./a.out /etc
/etcIR
      2808:
      2808:     calling fini: /lib/tls/libc.so.6
      2808:
linux:/opt/test # gcc -g unix4-1.c
linux:/opt/test # ./a.out /etc
/etcIR
linux:/opt/test #


几个疑问:
1、在unix4-1-1.c 这个函数中,执行的时候怎么会有
   2808:
      2808:     calling fini: /lib/tls/libc.so.6
      2808:
这个提示的?

2、为什么在unix4-1.c
将buf.st_mode 改成 buf->st_mode就报错呢?
linux:/opt/test # gcc -g unix4-1.c
unix4-1.c: In function `main':
unix4-1.c:24: error: invalid type argument of `->'
linux:/opt/test #

论坛徽章:
0
2 [报告]
发表于 2006-09-18 15:37 |只看该作者
你的buf又没有定义成指向stat结构的指针,当然不能用buf->st_mode拉

论坛徽章:
0
3 [报告]
发表于 2006-09-18 16:17 |只看该作者
恩,有道理,

那这个错误是什么原因呢?

1、在unix4-1-1.c 这个函数中,执行的时候怎么会有
   2808:
      2808:     calling fini: /lib/tls/libc.so.6
      2808:
这个提示的?

论坛徽章:
0
4 [报告]
发表于 2006-09-18 16:59 |只看该作者
  1. int i;
  2.     struct stat *buf;  //没有初始化
  3.     char *ptr;
复制代码


buf没有被初始化,然后你的lstat对它指向的未知地址赋值,出现这些莫名其妙的事情也正常了。

论坛徽章:
0
5 [报告]
发表于 2006-09-18 17:43 |只看该作者
那应该怎么做,才可以避免出这个错呢

论坛徽章:
0
6 [报告]
发表于 2006-09-18 17:48 |只看该作者
原帖由 yinian9826 于 2006-9-18 17:43 发表
那应该怎么做,才可以避免出这个错呢


如果你要使用指针这样的形式,就这样 struct stat *buf = (struct stat*)malloc(sizeof(struct stat));
或者                struct stat *buf = (struct stat*)alloca(sizeof(struct stat));

论坛徽章:
0
7 [报告]
发表于 2006-09-18 17:58 |只看该作者
指针需要初始化,否则即使调试的时候不出错,在运行中也是绝对会出错误的
象楼上一样,在申明一个指针的时候后就初始化是个不错的方法

论坛徽章:
0
8 [报告]
发表于 2006-09-18 18:50 |只看该作者
原帖由 yinian9826 于 2006-9-18 17:43 发表
那应该怎么做,才可以避免出这个错呢

因为没有初始化引起的错误,初始化一下不就好了么???

怎么会问这么奇怪的问题

论坛徽章:
0
9 [报告]
发表于 2006-09-18 19:14 |只看该作者
没明白你是如何做到用代码来代替掉函数的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP