2012-03-02 105 views
0

我有這樣的結構像以下:指針傳遞到一個初始化結構中的功能

typedef struct{ 
char static_data[10]; 
int a; 
int b; 
} my_ds; 

我已經初始化它像以下:

my_ds * ds = (my_ds *)malloc(sizeof(my_ds)); 
memmove(my_ds->static_data, buf, len); 
ds->a = c; 
ds->b = d; 

和在函數傳遞它:

int my_fun(void ** data); 
my_fun((void *)&ds); 

my_fun中發生了什麼,第一個字段static [10]被正確初始化,但其他兩個值是零。我在這裏錯過了什麼?

+1

'炭靜態[10]'?你是如何聲明一個名爲'static'0.0的字段? – cnicutar 2012-03-02 15:36:19

+0

抱歉,糾正它。 – CodeBladeRunner 2012-03-02 15:37:56

+0

'len'有多大? – cnicutar 2012-03-02 15:38:50

回答

0

memmove()?我想你打算使用memcpy()或strcpy()或甚至strncpy()!

另外double **(可能)不需要在my_fun(void **data) void指針可以指向任何東西,包括一個void指針。 (但取決於功能定義,未顯示)

在這種情況下,my_fun ((void**) &ds);中的&符號(也不是cast)也不是必需的。 任何指針可以被鑄造成一個空指針中C.

my_ds * ds; 
ds = malloc(sizeof *ds); 
if (len >= sizeof my_ds->static_data) len = sizeof my_ds->static_data - 1; 
memcpy(my_ds->static_data, buf, len); 
my_ds->static_data[len] = 0; 
ds->a = c; 
ds->b = d; 
+0

'memmove()'有什麼問題?它只是知道如何處理重疊緩衝區的memcpy()。在技​​術上, – 2012-03-02 17:34:39

+0

沒有什麼不妥。但是在這種情況下緩衝區不能重疊,所以不需要memmove()。 len參數仍然是錯誤的潛在向量,與用於複製的函數無關。 – wildplasser 2012-03-02 17:39:53

+0

1.你是對的*虛空***的東西。我應該注意到。我會運行你的建議併發布更新。感謝您的評論 – CodeBladeRunner 2012-03-02 19:10:27