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

时间:2013-10-12 16:50:10

标签: c++ c pointers posix

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

答案 0 :(得分:0)

  1.   

    请告诉我第2版和第3版之间的区别?

    版本2有这条线&amp;定义:

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

    tidtimer_t *,因此&tidtimer_t **,并且与timer_create()期望的内容不兼容。

    第3版有:

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

    tidlisttimer_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所期望的。