使用 nanosleep() 时出现分段错误

Posted

技术标签:

【中文标题】使用 nanosleep() 时出现分段错误【英文标题】:Segmentation fault when using nanosleep() 【发布时间】:2021-08-10 07:33:24 【问题描述】:
$ ls
baby.txt      readlyrics.c

我尝试编写一个简单的程序,使用 nanosleep() 打印 .txt 文件中的文本以获得某种动画效果:

#include <time.h>
#include <stdio.h>
#include <stdlib.h>


int main(int argc, char *argv[]) 

    char *target_file = argv[1];
    char *sec     = argv[2];
    char *nsec     = argv[3];

    int   tv_sec  = atoi(sec);
    float tv_nsec = atof(nsec);

    struct timespec *t;
    t->tv_sec  = tv_sec;
    t->tv_nsec = (long)(tv_nsec * 1000000000);

    FILE *content = fopen(target_file, "r");
    int *c  = malloc(sizeof(char));
    c       = NULL;
    c = fgetc(content);
    while(c) 
        printf("%c", c);
        c = NULL;
        nanosleep(t, NULL);
        c = fgetc(content);
    
    fclose(content);

    return 0;


得到一个错误:

$ ./read ./baby.txt 0 0.01
zsh: segmentation fault  ./read ./baby.txt 0 0.01

代码的哪一部分出错了?

【问题讨论】:

使用调试信息构建(构建时添加-g 标志)。然后在调试器中运行以捕获崩溃并准确定位代码中发生崩溃的位置。然后您还可以检查变量及其值,看看它们是否给出提示。 顺便说一句,你对c 的所有摆弄,使其成为一个指针,并对其进行所有重新分配,然后将其视为实际的char 而不是指向一个的指针,这告诉我你需要花更多的时间阅读教科书来阅读指针,更重要的是阅读fgetc 及其返回的内容。您似乎对从文件中读取字符有一些基本的误解。 while(c) 是错误的。 fgetc 不会在文件末尾返回 0NULL。您需要将c 声明为int 并将其与EOF 进行比较。请注意,EOF 通常定义为 -1,因此在布尔条件中使用时计算结果为 true。 【参考方案1】:

我想我现在知道答案了... 除了变量 c 之外,我将 t 声明为指针并且它没有被初始化,在将 struct timespec * 更改为 struct timespec 之后我解决了这个问题。 我认为这是因为它依赖于用户的输入来初始化。

【讨论】:

c 的整个混乱掩盖了您使用指针 t 而没有让它指向任何地方。但是这个问题可以通过在构建时启用更多警告来发现,因为 GCC 通常能够捕获此类问题。

以上是关于使用 nanosleep() 时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用向量时出现分段错误

分段错误:在 C++ 中弹出向量时出现 11

删除时出现分段错误

分配时出现分段错误[重复]

在 Swift 中使用 Set 时出现编译器分段错误

呈现窗口时出现 Gtkmm 分段错误