将 void 指针作为函数参数传递并将其转换为 timeval 数组
Pass void pointer as function parameter and cast it to timeval array
假设我有一个函数calc_sum()
并且我想测量它的执行时间。我有一个回调函数 info_callback()
,它打印一条消息并计算执行时间,它以 void 指针作为参数。我想将 void*
转换为 struct timeval *
以检索 start/end 的执行时间并计算差异,但我不明白如何将指针传递给数组 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);
}
您应该将 tr
传递给 info_callback
而不是 &tr
。 tr
指向你分配的数组; &tr
是指向指针tr
的指针。
顺便问一下,使用 void *
而不是实际类型有什么特别的原因吗?如果您使用了实际类型,编译器会对此进行标记。
假设我有一个函数calc_sum()
并且我想测量它的执行时间。我有一个回调函数 info_callback()
,它打印一条消息并计算执行时间,它以 void 指针作为参数。我想将 void*
转换为 struct timeval *
以检索 start/end 的执行时间并计算差异,但我不明白如何将指针传递给数组 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);
}
您应该将 tr
传递给 info_callback
而不是 &tr
。 tr
指向你分配的数组; &tr
是指向指针tr
的指针。
顺便问一下,使用 void *
而不是实际类型有什么特别的原因吗?如果您使用了实际类型,编译器会对此进行标记。