Chinaunix

标题: 请大家帮忙比对一下这两个函数有什么区别? [打印本页]

作者: yinian9826    时间: 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 #
作者: whshuai    时间: 2006-09-18 15:37
你的buf又没有定义成指向stat结构的指针,当然不能用buf->st_mode拉
作者: yinian9826    时间: 2006-09-18 16:17
恩,有道理,

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

1、在unix4-1-1.c 这个函数中,执行的时候怎么会有
   2808:
      2808:     calling fini: /lib/tls/libc.so.6
      2808:
这个提示的?
作者: harly    时间: 2006-09-18 16:59
  1. int i;
  2.     struct stat *buf;  //没有初始化
  3.     char *ptr;
复制代码


buf没有被初始化,然后你的lstat对它指向的未知地址赋值,出现这些莫名其妙的事情也正常了。
作者: yinian9826    时间: 2006-09-18 17:43
那应该怎么做,才可以避免出这个错呢
作者: harly    时间: 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));
作者: wuqing    时间: 2006-09-18 17:58
指针需要初始化,否则即使调试的时候不出错,在运行中也是绝对会出错误的
象楼上一样,在申明一个指针的时候后就初始化是个不错的方法
作者: net_robber    时间: 2006-09-18 18:50
原帖由 yinian9826 于 2006-9-18 17:43 发表
那应该怎么做,才可以避免出这个错呢

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

怎么会问这么奇怪的问题
作者: langue    时间: 2006-09-18 19:14
没明白你是如何做到用代码来代替掉函数的。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2