【问题标题】:Pass void pointer as function parameter and cast it to timeval array将 void 指针作为函数参数传递并将其转换为 timeval 数组
【发布时间】:2016-11-16 09:34:57
【问题描述】:

假设我有一个函数calc_sum(),我想测量它的执行时间。我有一个回调函数info_callback(),它打印一条消息并计算执行时间,它以 void 指针作为参数。我想将void* 转换为struct timeval * 以检索执行时间的开始/结束并计算差异,但我不明白如何将指针传递给数组struct timeval *,以便我可以从@ 中访问它的元素987654327@ 功能。 无论我尝试什么,都会遇到分段错误...

我应该如何传递和转换指针以使其工作?

编辑:修复了代码中的错误,如Andy Schweig 建议的那样

#include <stdio.h>
#include <sys/time.h>

void calc_sum(int a, int b)
{
    int k = a + b;
    printf("sum = %d\n", k);
}

void info_callback(const char *msg, void *client_data)
{
    struct timeval *t = (struct timeval *) client_data;
    double time = (t[1].tv_sec - t[0].tv_sec) * 1000.0; // !!!SEGMENTATION FAULT!!!
    time += (t[1].tv_usec - t[0].tv_usec) / 1000.0; //

    printf("[TIME] %s: %f, ms", msg, time);
}

int main(int argc, char *argv[])
{
   struct timeval t1, t2;
   gettimeofday(&t1, NULL);

   calc_sum(2, 3);

   gettimeofday(&t2, NULL);

   struct timeval * tr = (struct timeval*) malloc(2 * sizeof(struct timeval));
   tr[0] = t1;
   tr[1] = t2;

   double time = (tr[1].tv_sec - tr[0].tv_sec) * 1000.0; // sec to ms 
   time += (tr[1].tv_usec - tr[0].tv_usec) / 1000.0;   // us to ms

   printf("time = %f, ms\n", time);

   info_callback("Execution time", tr);
   free(tr);
}  

【问题讨论】:

    标签: c pointers segmentation-fault void-pointers timeval


    【解决方案1】:

    您应该将tr 传递给info_callback 而不是&amp;trtr 指向你分配的数组; &amp;tr 是指向指针tr 的指针。

    顺便说一句,使用void * 而不是实际类型有什么特别的原因吗?如果你使用了实际的类型,编译器会标记这个。

    【讨论】:

    • ...意思是&amp;tr指针本身的地址发送给函数,并试图将其视为注定要失败的数组。分配数组的地址存储在tr,所以传递tr,而不是&amp;tr
    • 谢谢,成功了!我使用void * 是因为我正在试验一个开源库,并且我将它的info_callback 函数用于我自己的目的,而无需进行太多编辑。根据msg,我决定void * 实际指向的内容并执行一些操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2020-11-08
    • 2012-11-21
    • 2018-05-14
    相关资源
    最近更新 更多