使用 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
不会在文件末尾返回 0
或 NULL
。您需要将c
声明为int
并将其与EOF
进行比较。请注意,EOF
通常定义为 -1
,因此在布尔条件中使用时计算结果为 true。
【参考方案1】:
我想我现在知道答案了...
除了变量 c 之外,我将 t 声明为指针并且它没有被初始化,在将 struct timespec *
更改为 struct timespec
之后我解决了这个问题。
我认为这是因为它依赖于用户的输入来初始化。
【讨论】:
c
的整个混乱掩盖了您使用指针 t
而没有让它指向任何地方。但是这个问题可以通过在构建时启用更多警告来发现,因为 GCC 通常能够捕获此类问题。以上是关于使用 nanosleep() 时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章