void foo(void* p) {
double d = (double) p; // Doesn’t compile.
printf(“%f\n”, d);
}
我需要的是能夠打電話
foo((void*) 13.0);
并列印 13.0。
筆記
我需要這個來存盤源節點和存盤在 C 哈希圖中的任意節點之間的距離(雙精度型),該哈希映射在圖形搜索中是通用的“void*”。見https://github.com/coderodde/BidirectionalDijkstra4Perl2
uj5u.com熱心網友回復:
埃里克的回答已經給出了標準方法。
但是如果 a 的大小void *不小于 a 的大小double,則可以將 a 的表示形式存盤double在 a 中void *。從那時起,您不能將指標用于任何事情,只能將表示提取回double物件。這是一個演示它的示例代碼:
#include <stdio.h>
#include <assert.h>
#include <memory.h>
void foo(void* p) {
double d;
memcpy(&d, &p, sizeof(d));
printf(" % f\n", d);
}
int main() {
void* p;
// ensure that the representation of a double can fit in a void *
static_assert(sizeof(void*) >= sizeof(double), "sizeof(double) > sizeof(void *)");
double d = 13.0;
memcpy(&p, &d, sizeof(d));
foo(p);
return 0;
}
但請注意:這只能用作處理遺留代碼的解決方法。可移植性僅限于雙精度大小不大于 void * 大小的平臺,這在 32 位平臺上是錯誤的。以 32 位模式編譯上述代碼會引發編譯錯誤:
error ...: sizeof(double) > sizeof(void *)
uj5u.com熱心網友回復:
當規范具有通過 提供資料void *的方法時,您通常打算使用它的方式是為資料分配記憶體并將記憶體地址作為void *. 然后接收資料的軟體將其轉換void *為指向適當型別的指標,并使用該指標訪問記憶體中的資料。
因此,如果您只需要一個double值,您可以這樣做:
double *p = malloc(sizeof *p); // Allocate memory for the data.
if (!p) // Guard against allocation failure.
{
fprintf(stderr, "Error, unable to allocate memory.\n");
exit(EXIT_FAILURE);
}
*p = 13.0; // Store data in memory.
foo(p); // Pass the address of the data to foo.
稍后,在某個獲得資料地址的例程中,您將執行以下操作:
void MyCallBackRoutine(void *vp) // Might be "const void *" instead.
{
double *p = vp; // Convert to "double *". Might need "const" with it.
printf("The conveyed data is %g.\n", *p);
}
您還應該在不再需要時釋放記憶體。
如果您需要的不僅僅是一個double或其他單個專案,您將創建一個struct包含您需要的所有成員并將所有資料放入其中。
uj5u.com熱心網友回復:
你可以通過做一個小指標技巧來做到這一點
void foo(void *p)
{
double d = *((double *) &p);
printf("%f\n", d);
}
它通過獲取指向 p 的指標并將其取消參考為雙精度來作業,因此您可以將 void * 轉換為雙精度
但請注意,只有當 double 和 void * 在您的代碼將運行的計算機上具有相同的 len 時
它才有效,否則它無法作業,因為double 存盤在記憶體中的方式
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/439017.html
上一篇:結構和指標取消參考問題
下一篇:將字串傳遞給c中的指標
