2

我需要初始化一个 Posix 计时器,我让它工作,但有点奇迹。我不明白工作和代码之间的区别给我分段错误。

这是 create_timer 函数的头文件:

int timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid);

请告诉我版本2和3有什么区别?

此外,鉴于 3 有效,版本 1 甚至如何编译?

显然, timer_create 的第三个参数在 v1 和 v3 中是不同的,但它们都可以编译。

此代码失败:(但编译)

main():
timer_t *tidlist;
tidlist = calloc(2, sizeof(timer_t));
initialize_timer(tidlist[0], 2);

int initialize_timer(timer_t *tid, int seconds){  
    if (timer_create(CLOCK_REALTIME, &sev, tid) == -1) <----- seg fault here. but it should not even compile because the working version accepts the **timer_t as argument.

这甚至不编译:(即使它完全相同的东西是有效的)

main():
    timer_t *tidlist;
    tidlist = calloc(2, sizeof(timer_t));
    initialize_timer(tidlist[0], 2);//initilize timer for producer

initialize_timer(timer_t *tid, int seconds):
    if (timer_create(CLOCK_REALTIME, &sev, &tid) == -1) <------- type error for 3 arg: incompatible pointer type.

此代码有效:

main():
    timer_t *tidlist;                                                  
    tidlist = calloc(2, sizeof(timer_t)); 
    initialize_timer(tidlist, 2);//initilize timer for producer

int initialize_timer(timer_t *tidlist, int seconds){
    if (timer_create(CLOCK_REALTIME, &sev, &tidlist[0]) == -1) 

提前致谢。

4

1 回答 1

0
  1. 请告诉我版本2和3有什么区别?

    版本 2 有这一行和定义:

    initialize_timer(timer_t *tid, int seconds):
        if (timer_create(CLOCK_REALTIME, &sev, &tid) == -1)
    

    tid是 a timer_t *&tida 也是timer_t **,这与timer_create()预期的不兼容。

    第 3 版具有:

    int initialize_timer(timer_t *tidlist, int seconds){
        if (timer_create(CLOCK_REALTIME, &sev, &tidlist[0]) == -1) 
    

    tidlist是 a timer_t *,所以&tidlist[0]也是a ,这是预期的并且有效 相当于。timer_t *&tidlist[0]tidlist

  2. 此外,鉴于 3 有效,版本 1 甚至如何编译?

    版本 1 不会在没有警告的情况下编译。注意他们。你有这个代码:

    timer_t *tidlist;
    tidlist = calloc(2, sizeof(timer_t));
    initialize_timer(tidlist[0], 2);
    

    tidlist是 a timer_t *tidlist[0]a 也是timer_t,这不是initialize_timer预期的。

于 2013-10-12T16:55:47.960 回答