无法理解工作代码和损坏代码之间的区别



我需要初始化一个 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) 

提前谢谢。

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

    版本 2 有以下行和定义:

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

    tid是一个timer_t *,所以&tid是一个timer_t **,这与timer_create()的期望不相容。

    版本 3 具有:

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

    tidlist是一个timer_t *,所以&tidlist[0]也是一个timer_t *,这是意料之中的,也是有效的。 &tidlist[0]相当于tidlist

  2. 另外,鉴于 3 个有效,版本 1 如何编译?

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

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

    tidlisttimer_t *,所以tidlist[0]timer_t,这不是initialize_timer所期望的。

最新更新