簡體   English   中英

將void指針作為函數參數傳遞並將其強制轉換為timeval數組

[英]Pass void pointer as function parameter and cast it to timeval array

假設我有一個函數calc_sum() ,我想測量它的執行時間。 我有一個回調函數info_callback() ,它輸出一條消息並計算執行時間,它以void指針為參數。 我想將void* struct timeval *轉換為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);
}  

您應該將tr傳遞給info_callback而不是&tr tr指向您分配的數組; &tr是指向指針tr的指針。

順便說一句,使用void *代替實際類型的任何特殊原因? 如果您使用的是實際類型,則編譯器會對此進行標記。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM