2009-08-25 126 views
10

我有一個任意值的數組,所以我將它定義爲一個void指針數組,所以我可以指向任何類型的信息(如int,字符數組等)。但是,我如何實際分配int如果我有一個void指針,我該如何將一個int放入它?

就拿這些初始化:

void* data[10]; 
int x = 100; 

我的直覺會想到這一點,但是這給編譯錯誤:

data[0] = malloc(sizeof(int)); 
*(data[0]) = x; 

我也想過用&x,但我想借此地址(根據我的理解)將在退出程序後被清除。所以,如果我有一個局部變量x,我將如何正確地將它變成無效指針類型的變量?

回答

24
*((int*)data[0])=x; 

會做到這一點。

您可能想考慮使用聯合。事情是這樣的:

union myvalues 
{ 
    int i; 
    double d; 
    long l; 
}; 

然後,您可以有

union myvalues *foo[10]; 
foo[0] = malloc(sizeof(union myvalues)); 
foo[0]->i = x; 

您也可以typedef工會。 sizeof(union myvalues)將會是最大的sizeof的成員。因此,如果聯合中有int i;char c[40],則sizeof(union myvalues)將爲40.寫入i將覆蓋c中的前4個字符(假設您的整數爲4個字節)。

+0

或者乾脆使用一個工會的數組,忘記malloc – 2009-08-25 11:23:51

+0

確實,好點。我與原來的距離最近。 – 2009-08-25 11:25:42

+0

謝謝,但這將與字符數組指針(char *)一起工作。這會不會在某些平臺上導致對齊問題?最後,如果我有一個char [40],如果我只打算使用4,那麼保留40個字節似乎會浪費內存。:-) – pbean 2009-08-25 11:36:12

9
*((int *)data[0]) = x; 

將會創建一個x副本,所以它是一個局部變量並不重要。

1

的混疊方面的原因其遠不如做

mempcy(data[0], &x, sizeof(int)); 

碰巧的編譯器將優化的memcpy調用出來爲的sizeof(int)的是一個恆定值,但它不會打破各種走樣規則。

+0

哪個別名規則? – 2009-08-25 11:38:35

+0

我認爲Goz擔心類型竄改,但由於您無法解除引用void *,因此使用'void *'指針來替代別名通常是安全的。在將其轉換爲「int *」或「char *」以外的任何內容後,請勿對其進行解引用。 – 2009-08-25 12:35:24

2

雖然你可以使用一個投來進行分配,這大概是乾淨多寫這樣的代碼:

 
void *data[ 10 ]; 
int x = 100; 
int *p; 

p = malloc(sizeof *p); 
data[ 0 ] = p; 
*p = x; 
+0

我同意你這個簡單的例子,那是我第一次去的方法。然而,問題是有許多不同的可能的數據類型等等,所以我將不得不聲明大量的臨時局部變量,這些變量可能會或可能不會在某個執行中使用。 – pbean 2009-08-25 12:20:56

+0

+1使用較少的標點符號 – sigjuice 2009-08-25 16:47:42

1

試試這個:

data[0] = malloc(sizeof(int)); 
*((int*)data[0]) = x; 

(int) (*(data[0])) = x; 

別忘了

free (data[0]); 

之後。

相關問題