我需要初始化一个 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)
提前致谢。
最佳答案
-
Please tell me whats the difference between version 2 and 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
。 -
Also, given that 3 works, how can version 1 even compile?
如果没有警告,版本 1 将无法编译。注意他们。你有这个代码:
timer_t *tidlist; tidlist = calloc(2, sizeof(timer_t)); initialize_timer(tidlist[0], 2);
tidlist
是一个timer_t *
,所以tidlist[0]
是一个timer_t
,它不是initialize_timer
期望什么。
关于c++ - 无法理解工作代码和损坏代码之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19336724/