使用 stat (st_uid) 的分段错误(核心已转储)

Segmentation fault (core dumped) using stat (st_uid)

我想在 UNIX 中编写一个像 "ls -l" 一样工作的简单 C 脚本。我有一个工作部分,其中脚本列出了当前目录中的所有文件:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>

int main(int argc, char *argv[])
{
 DIR *katalog;
 struct dirent *dir;
 katalog = opendir(".");

if (argc == 1) {
printf("without option");
  if (katalog) {
    while ((dir = readdir(katalog)) {
     printf("%s \n", dir->d_name);
    }
    closedir(katalog);
  }
  return(0);
}    
}

现在我想添加有关 st_gid、st_uid、st_size 和 st_mtime 的信息。我从 st_uid 开始凝视。我的代码现在看起来像那样(它在 unix 下编译得很好)。不幸的是,它给了我一个错误 "Segmentation fault (core dumped)"。我试图在 Stack 和 Internet 中寻找答案,我什至使用了其他线程的一些提示(例如:C format issue with printf("%d", astatbuff->st_size);),但仍然出现错误......我不知道我还能做什么更改以修复它...

这是产生错误的代码:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h> 

int main(int argc, char *argv[])
{
 DIR *katalog;
 struct dirent *dir;
 katalog = opendir(".");
 struct stat *astat;

if (argc == 1) {
printf("Without option");
  if (katalog) {
    while ((dir = readdir(katalog)) != NULL && astat->st_uid != 0) {
     printf("%s %llu \n", dir->d_name, (unsigned long long)astat->st_uid);
    }
    closedir(katalog);
  }
  return(0);
}
}

astat 未在您的代码中初始化(在您的 while 循环中使用)

由于 astatastat->st_uid 之前尚未 initialize/assign,代码显示 未定义的行为 (UB)。在 OP 案例中,代码崩溃了,

不是声明一个没有值的指针,而是代码指向:

1) 声明一个 struct stat 对象。

2) 用 *stat() 调用填充它。 ref.

int main(int argc, char *argv[]) {
  DIR *katalog;
  struct dirent *dir;
  katalog = opendir(".");

  //struct stat *astat;

  if (argc == 1) {
    printf("Without option");
    if (katalog) {
      while ((dir = readdir(katalog)) != NULL) {
        // add
        struct stat sb;
        if (lstat(dir->d_name, &sb) == -1) {
          perror("lstat");
          exit(EXIT_FAILURE);
        }
        if (sb.st_uid != 0) {
          printf("%s %llu \n", dir->d_name, (unsigned long long) sb.st_uid);
        }
      }
      closedir(katalog);
    }
  }
  return (0);
}