将void指针作为函数参数传递并将其强制转换为timeval数组

时间:2016-07-13 17:03:48

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

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

我应该如何传递和投射指针以使其发挥作用?

编辑:代码修正错误,建议为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);
}  

1 个答案:

答案 0 :(得分:1)

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

顺便说一下,使用void *而不是实际类型的任何特殊原因?如果你使用过实际类型,编译器会标记这个。