当前位置: 技术问答>linux和unix
关于stat结构的一个奇怪问题
来源: 互联网 发布时间:2016-11-26
本文导语: 我使用了如下程序片断: 代码: #include #include #include #include int main() { struct stat statbuf; if (!stat("./ttt", &statbuf)) { printf("%xn%dn", statbuf.st_dev, statbuf.st_ino); } return(0); }ttt是a.out相同目录下的一个文本文件。 ...
我使用了如下程序片断:
代码:
#include
#include
#include
#include
int main()
{
struct stat statbuf;
if (!stat("./ttt", &statbuf)) {
printf("%xn%dn", statbuf.st_dev, statbuf.st_ino);
}
return(0);
}ttt是a.out相同目录下的一个文本文件。
用stat获得其文件信息。
用printf打印st_dev和st_ino,发现我用这个程序始,st_ino始终被打印为0。
然后我使用了如下代码:
代码:
#include
#include
#include
#include
int main()
{
struct stat statbuf;
if (!stat("./ttt", &statbuf)) {
printf("%xn", statbuf.st_dev);
printf("%dn", statbuf.st_ino);
}
return(0);
}此时st_ino可以被正确输出。
为了测试,我又使用了如下代码:
代码:
#include
#include
#include
#include
int main()
{
struct stat statbuf;
int tmp;
if (!stat("./ttt", &statbuf)) {
tmp = statbuf.st_ino;
printf("%xn%dn", statbuf.st_dev, statbuf.st_ino);
printf("%dn", tmp);
}
return(0);
}此时tmp的值为真确的st_ino值,而第一个printf的st_ino仍然被输出为0。
请问这是什么原因呢?
代码:
#include
#include
#include
#include
int main()
{
struct stat statbuf;
if (!stat("./ttt", &statbuf)) {
printf("%xn%dn", statbuf.st_dev, statbuf.st_ino);
}
return(0);
}ttt是a.out相同目录下的一个文本文件。
用stat获得其文件信息。
用printf打印st_dev和st_ino,发现我用这个程序始,st_ino始终被打印为0。
然后我使用了如下代码:
代码:
#include
#include
#include
#include
int main()
{
struct stat statbuf;
if (!stat("./ttt", &statbuf)) {
printf("%xn", statbuf.st_dev);
printf("%dn", statbuf.st_ino);
}
return(0);
}此时st_ino可以被正确输出。
为了测试,我又使用了如下代码:
代码:
#include
#include
#include
#include
int main()
{
struct stat statbuf;
int tmp;
if (!stat("./ttt", &statbuf)) {
tmp = statbuf.st_ino;
printf("%xn%dn", statbuf.st_dev, statbuf.st_ino);
printf("%dn", tmp);
}
return(0);
}此时tmp的值为真确的st_ino值,而第一个printf的st_ino仍然被输出为0。
请问这是什么原因呢?
|
把statbuf.st_ino放到前面打印就行,关键在于输出statbuf.st_dev之后就不对了
把代码做如下试验
可以得出结论,因为statbuf.st_dev是longlong类型的,所以如果%d、%x之类输出之后,后面用%d得到的是longlong的后一个占据的内存,所以是0
把代码做如下试验
#include
#include
#include
#include
int main()
{
struct stat statbuf;
int tmp = 0;
if (!stat("./ttt", &statbuf))
{
tmp = statbuf.st_ino;
printf("%llxn%dn", statbuf.st_dev, statbuf.st_ino);
printf("%dn%xn", tmp, statbuf.st_dev);
printf("%dn%xn", statbuf.st_ino, statbuf.st_dev);
}
return(0);
}
可以得出结论,因为statbuf.st_dev是longlong类型的,所以如果%d、%x之类输出之后,后面用%d得到的是longlong的后一个占据的内存,所以是0