Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的Seg故障错误_C_Timer_Segmentation Fault_Signals_Void Pointers - Fatal编程技术网

C语言中的Seg故障错误

C语言中的Seg故障错误,c,timer,segmentation-fault,signals,void-pointers,C,Timer,Segmentation Fault,Signals,Void Pointers,运行此代码时出现seg错误。我评论了seg错误的位置(在handler()函数中)。我不确定,可能是我将数据包装了两次,这就是为什么或者问题出在哪里?直到“启动计时器”方法,它才正确打印 #包括 #包括 #包括 #包括 #包括 #包括 类型定义结构数据{ 字符*名称; }数据; 结构计时器列表{ void*定时器_数据; 未签名的长过期; void(*函数)(sigval_t); }; 易变长整数秒=0; 无效处理程序(sigval\u t val) { 数据*数据处理程序=val.sival\

运行此代码时出现seg错误。我评论了seg错误的位置(在
handler()
函数中)。我不确定,可能是我将数据包装了两次,这就是为什么或者问题出在哪里?直到“启动计时器”方法,它才正确打印

#包括
#包括
#包括
#包括
#包括
#包括
类型定义结构数据{
字符*名称;
}数据;
结构计时器列表{
void*定时器_数据;
未签名的长过期;
void(*函数)(sigval_t);
};
易变长整数秒=0;
无效处理程序(sigval\u t val)
{
数据*数据处理程序=val.sival\u ptr;
printf(“处理程序:数据地址:%p\n”,数据\u处理程序);
printf(“处理程序:数据处理程序的地址->名称:%p\n”,“数据处理程序->名称”);
printf(“用值%s\n输入的处理程序,数据处理程序->名称);`**/**SEG-FAULT在这里*****
}  
无效计时器处理程序(union sigval)
{
printf(“----秒:%ld\n”++秒);
}  
/*用我们得到的所有数据启动计时器,因为数据是计时器*/
无效启动计时器(结构计时器列表*计时器)
{
printf(“\n启动计时器…:计时器->数据地址:%p\n”,计时器->计时器数据);
数据*数据处理程序=定时器->定时器数据;
printf(“启动计时器…:输入值:%s\n”,数据处理程序->名称);
int Ret;
pthread_attr_t attr;
pthread_attr_init(&attr);
//pthread_t tid;
结构sched_param parm;
parm.sched_优先级=255;
pthread_attr_setschedparam(&attr,&parm);
结构sig事件sig;
西格瓦尔;
val.sival_ptr=定时器->定时器_数据;
sig.sigev_notify=sigev_线程;
sig.sigev_notify_函数=计时器->函数;
//sig.sigev_value.sival_int=val;
sig.sigev_值=val;
sig.sigev_notify_attributes=&attr;
数据*数据句柄1=(数据*)val.sival\u ptr;
printf(“从sigval…:处理程序\数据地址:%p\n”,数据\处理程序1);
printf(“从sigval…:处理程序\u数据->名称地址:%p\n”,&data\u处理程序1->名称);
printf(“从sigval…:用值%s\n”输入的处理程序,数据\u handler1->name);
//创建一个新的计时器。
计时器\u t timerid;
Ret=计时器\u创建(时钟\u实时、&sig、&timerid);
如果(Ret==0)
{
结构itimerspec输入、输出;
in.it_value.tv_sec=计时器->过期;
in.it_value.tv_nsec=0;
in.it_interval.tv_sec=0;
in.it\u interval.tv\u nsec=0;
定时器设置时间(timerid、0、输入和输出);
}  
}  
/*启动计时器打开:将数据包装到一个计时器结构中,然后启动计时器*/
无效启动计时器打开(数据计时器数据,无符号长过期)
{
struct timer_list*timer=(struct timer_list*)malloc(sizeof(struct timer_list));//问题就在这里……忘了使用malloc
定时器->定时器数据=&定时器数据;
printf(“\n定时器->数据地址:%p\n”和定时器\u数据);
定时器->函数=处理器;
定时器->到期=到期;
启动定时器(定时器);
}  
/*主要*/
void main()
{
数据处理程序_data1={“处理程序数据1”};
//数据处理程序_data2={“处理程序数据2”};
//void*data1=&handler\u data1;
//void*data2=&handler\u data2;
pthread_attr_t attr;
pthread_attr_init(&attr);
结构sched_param parm;
parm.sched_优先级=255;
pthread_attr_setschedparam(&attr,&parm);
结构sig事件sig;
sig.sigev_notify=sigev_线程;
sig.sigev\u notify\u函数=计时器\u处理程序;
sig.sigev_notify_attributes=&attr;
//创建一个新的计时器。
计时器\u t timerid;
计时器\u创建(时钟\u实时,&sig,&timerid);
结构itimerspec输入、输出;
in.it_value.tv_sec=1;
in.it_value.tv_nsec=0;
in.it_interval.tv_sec=1;
in.it\u interval.tv\u nsec=0;
printf(“******主时钟开始******\n”);
定时器设置时间(timerid、0、输入和输出);
printf(“******启动数据1计时器2秒******\n”);
启动定时器(处理器数据1,2);
//printf(“******启动数据1计时器5秒******\n”);
//启动定时器(数据2,5);
睡眠(20);
}  

这可能就是问题所在。在下面的代码中,
timer\u data
是本地函数
start\u timer\u on
。一旦函数退出,对象就会被销毁。因此,当访问处理程序中的
名称
时,它将出错

void start_timer_on(data timer_data, unsigned long expires)
{
    struct timer_list *timer;
    timer->timer_data = &timer_data;
    printf("\nTimer->data address: %p\n", &timer_data);
    timer->function = handler;
    timer->expires = expires;
    start_timer(timer);
}

您应该使用
void start\u timer\u on(data*timer\u data,unsigned long expires)
,以便在退出
main
之前不会释放数据。

使用调试器逐步检查代码,并查看内存访问是否按照您认为的方式进行。分段错误意味着您试图访问内存元素或将其保存到超出限制的内存元素中,请检查代码中的赋值行,确保为容器提供了正确的大小,并检查是否将无效内存地址的值保存到指针中。@andrewcooke yahh它是。。。。然后意识到这是个愚蠢的错误!!:(一个相关问题:变量
timer
从未初始化。不允许使用
->
运算符取消引用它。@deebee hadler是通过sigval\u t获取数据的…如果您不知道timer-create\u timer和timer\u settimer,应该不会回答。@all,我编辑了问题,问题是malloc…在start\u timer\u on中,我没有回答我们。)埃德·马洛克before@DharaDarji我知道handler是如何获取数据的。我的回答是基于你关于segfault发生在哪里的说法。
void start_timer_on(data timer_data, unsigned long expires)
{
    struct timer_list *timer;
    timer->timer_data = &timer_data;
    printf("\nTimer->data address: %p\n", &timer_data);
    timer->function = handler;
    timer->expires = expires;
    start_timer(timer);
}