簡體   English   中英

如何從void * array-C獲取結構?

[英]How can I get structure from void* array - C?

我試圖從void* array檢索傳遞給函數作為參數的值。

這是作為void * data參數傳遞給我的函數的:

void *sredp[3];
sredp[0] = (void*)buf;
sredp[1] = (void*)(&len);
sredp[2] = (void*)(&ri);

來源: https//github.com/kamailio/kamailio/blob/master/udp_server.c#L481

對於前兩個字段的解除引用,我使用此代碼:

int my_fnc(void *data)
{
        str *obuf;
        obuf = (str*)data;
}

str是Kamailio服務器的內部類型( http://www.asipto.com/pub/kamailio-devel-guide/#c05str )。

我想知道如何從void *data取消引用ri字段。 我試圖這樣做:

int my_fnc(void *data)
{
        struct receive_info * ri;
        ri = (struct receive_info*)(data + 2*sizeof(void*));
}

當我試圖打印receive_info結構( https://github.com/sipwise/kamailio/blob/4ee1c6a799713b999aac23de74b26badbe06d0aa/ip_addr.h#L132 )時,它似乎給了我一些數據,但我不知道這些是否只是一些隨機的來自內存的字節或它是我應該檢索的正確數據。

所以我的問題是,如果我做得對,如果有另一種/更好的方法來實現我的目標?

你不能用C中的void *做指針運算。它需要它使用sizeof(void),它實際上並不存在。

問題出在你的函數簽名中:

int my_fnc(void * data)

你的指針不是空的*,它是一個無效**。 所以在使用之前將其投射:

void** d = (void**) data;
ri = (struct receive_info*)(d + 2);

這將使用sizeof(void *),這是一個標准指針大小。

my_fnc中的data必須被視為void**才能提取真實數據。

int my_fnc(void *data)
{
   void** sredp = (void**)data;
   str* obuf = (str*)srdep[0];

   // The pointer that contains len can be obtained from srdep[1]
   // The pointer that contains ri can be obtained from srdep[2]
}

這是一個簡單的程序,說明:

#include <stdio.h>

void foo(void* data)
{
   void** realData = (void**)data;
   void* p1 = realData[0];
   void* p2 = realData[1];
   void* p3 = realData[2];

   printf("sredp[0]: %p\n", p1);
   printf("sredp[1]: %p\n", p2);
   printf("sredp[2]: %p\n", p3);

   int a1 = *(int*)p1;
   float a2 = *(float*)p2;
   double a3 = *(double*)p3;

   printf("a1: %d\n", a1);
   printf("a2: %f\n", a2);
   printf("a3: %lf\n", a3);
}

int main()
{
   int a1 = 10;
   float a2 = 20.0f;
   double a3 = 40.0;
   void *sredp[3];
   sredp[0] = &a1;
   sredp[1] = &a2;
   sredp[2] = &a3;

   printf("sredp[0]: %p\n", sredp[0]);
   printf("sredp[1]: %p\n", sredp[1]);
   printf("sredp[2]: %p\n", sredp[2]);

   foo(sredp);
}

運行程序的示例輸出:

sredp[0]: 0x28ac2c
sredp[1]: 0x28ac28
sredp[2]: 0x28ac20
sredp[0]: 0x28ac2c
sredp[1]: 0x28ac28
sredp[2]: 0x28ac20
a1: 10
a2: 20.000000
a3: 40.000000

暫無
暫無

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

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