You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C程序获取inode信息与文件创建日期时出现段错误,求修复

修复C程序段错误并正确获取inode和文件时间信息

你的程序出现段错误主要是因为缺少必要的参数与调用结果检查,以及内存分配后的有效性验证,以下是具体问题分析和修复方案:

问题根源

  • 未检查命令行参数:当启动程序时未传入文件路径参数,argv[1]为NULL,调用stat会触发非法内存访问,直接导致段错误。
  • 未验证malloc返回值:如果内存分配失败,buffer会是NULL,此时访问buffer->st_ctime必然触发段错误。
  • 未检查stat调用结果:如果stat调用失败(比如文件不存在、权限不足),buffer内的成员处于未初始化状态,访问这些成员会引发未定义行为(包括段错误)。
  • 额外说明:在Linux系统中,st_ctime表示文件状态最后改变的时间,而非文件创建时间;如果需要真正的创建时间,Linux内核3.10+支持st_birthtime(需启用GNU扩展)。

修复后的代码(满足ctime使用要求)

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

int main(int argc, char * argv[]) {
    // 检查命令行参数数量是否正确
    if (argc != 2) {
        fprintf(stderr, "用法: %s <文件或目录路径>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    struct stat *buffer = malloc(sizeof(struct stat));
    // 检查内存分配是否成功
    if (buffer == NULL) {
        perror("malloc 失败");
        exit(EXIT_FAILURE);
    }

    // 检查stat调用是否成功
    if (stat(argv[1], buffer) == -1) {
        perror("stat 调用失败");
        free(buffer); // 释放已分配的内存,避免泄漏
        exit(EXIT_FAILURE);
    }

    // 注意:Linux下st_ctime是状态改变时间,不是创建时间
    printf("文件状态最后改变时间:  %s", ctime(&buffer->st_ctime));
    printf("inode编号: %ld\n", buffer->st_ino);

    free(buffer); // 释放内存,避免内存泄漏
    return 0;
}

若需获取文件创建时间(Linux环境)

如果确实需要获取文件的创建时间,可以启用GNU扩展使用st_birthtime,代码如下:

#define _GNU_SOURCE // 启用GNU扩展特性
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char * argv[]) {
    if (argc != 2) {
        fprintf(stderr, "用法: %s <文件或目录路径>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    struct stat *buffer = malloc(sizeof(struct stat));
    if (buffer == NULL) {
        perror("malloc 失败");
        exit(EXIT_FAILURE);
    }

    if (stat(argv[1], buffer) == -1) {
        perror("stat 调用失败");
        free(buffer);
        exit(EXIT_FAILURE);
    }

    printf("文件创建时间:  %s", ctime(&buffer->st_birthtime));
    printf("inode编号: %ld\n", buffer->st_ino);

    free(buffer);
    return 0;
}

内容的提问来源于stack exchange,提问作者rihness

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:45:37