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

标签 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. 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

  2. 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/

相关文章:

c++ - 用 C++ 将数据写入文件 - 最有效的方式?

c++ - C++中有通用的 sleep 和通用的暂停命令吗?

sql - 嵌入式 SQL - 没有输出?

编译器标志 "-Wshadow"在代码块中不起作用

c++ - 访问 2D 结构时程序崩溃

c++ - 在 C++ 中将十六进制转换为整数的最快方法是什么?

c++ - 减少库的安装

c - C 中的开源基数/mtrie 实现?

在 C 中使用 strtok 比较单词

C将未知大小的数组传递给单个变量中的函数