统计结构分割错误

时间:2016-04-03 17:10:14

标签: c unix stat

struct stat {
dev_t     st_dev;     /* ID of device containing file */
ino_t     st_ino;     /* inode number */
mode_t    st_mode;    /* protection */
nlink_t   st_nlink;   /* number of hard links */
uid_t     st_uid;     /* user ID of owner */
gid_t     st_gid;     /* group ID of owner */
dev_t     st_rdev;    /* device ID (if special file) */
off_t     st_size;    /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
time_t    st_atime;   /* time of last access */
time_t    st_mtime;   /* time of last modification */
time_t    st_ctime;   /* time of last status change */
}

我正在使用C中的stat结构,我想输出每个字段。当我尝试输出st_atime,st_mtime和st_ctime时,我使用以下行:

    printf("Last file change: %s\n", ctime(sb.st_ctime));
    printf("Last file access time: %s\n", ctime(sb.st_atime));
    printf("Last file mod time: %s\n", ctime(sb.st_mtime));

出于某种原因,我收到了分段错误(Core Dump)错误。我对stat结构的声明是:

struct stat sb;

#include <stdio.h>
#include <sys/stat.h>

char file[128];

int main(int argc, char *argv[]){
struct stat sb;

sprintf(file, "%s", argv[1]);


if(stat(file, &sb) == 0)
 {
 printf("Last change: %s\n", ctime(sb.st_ctime));
 printf("Last File access: %s\n", ctime(sb.st_atime));
 printf("Last file mod: %s\n", ctime(sb.st_mtime));
  }
else
 {
   printf("File name does not exist!\n");
 }

return 0;

 }

2 个答案:

答案 0 :(得分:0)

您应该根据其文档传递对ctime的引用,因此我建议使用:

printf("Last file change: %s\n", ctime(&sb.st_ctime));
printf("Last file access time: %s\n", ctime(&sb.st_atime));
printf("Last file mod time: %s\n", ctime(&sb.st_mtime));

答案 1 :(得分:0)

修改 要使用函数ctime,您应该使用

包含time.h库
#include <time.h>

函数ctime接收指向time_t的指针。

  

char * ctime(const time_t * timer);

您正在传递time_t本身。您应该传递结构的地址或将时间更改为结构中的time_t *。根据您声明结构的位置,这种方法很危险。

printf("Last file change: %s\n", ctime(&(sb.st_ctime)));

或将声明更改为

time_t*    st_ctime;   /* time of last status change */