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
/etc
IR
2808:
2808: calling fini: /lib/tls/libc.so.6
2808:
linux:/opt/test # gcc -g unix4-1.c
linux:/opt/test # ./a.out /etc
/etc
IR
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
int i;
struct stat *buf; //没有初始化
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