0
假設我有一個函數calc_sum()
並且我想測量它的執行時間。我有一個回調函數info_callback()
,它打印一條消息並計算執行時間,它將void指針作爲參數。我想要void*
到struct timeval *
來檢索開始/結束執行時間並計算差異,但我不明白如何將指針傳遞給數組struct timeval *
,以便我可以從info_callback()
函數中訪問其元素。 無論我嘗試,我得到分段錯誤...傳遞void指針作爲函數參數並將其轉換爲timeval數組
我應該如何傳遞和投射指針才能使它工作?
編輯:在代碼固定誤差爲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'將_指針本身_的地址發送給該函數,並試圖將其視爲數組註定的失敗。分配數組的地址存儲在'tr'中,因此傳遞'tr',而不是'&tr'。 –
謝謝,這工作!我使用'void *'是因爲我正在試驗一個開源庫,並且爲了我自己的目的使用它的'info_callback'函數而不用編輯太多。根據'msg',我決定'void *'實際指向什麼並執行一些操作。 –