2011-04-19 56 views
1

我想初始化一個struct數組,但memset()的第二個參數需要一個int。有沒有另一個功能是相同的,但(void *)有第二個參數? 我想到了memcpy(),但它沒有在整個數組中設置值。任何想法?memset替代

的結構:

typedef struct { 
    int x; 
    int y; 
    char *data; 
} my_stuff; 

代碼:

my_stuff my_array[]; 
my_array = malloc(MAX * sizeof(my_stuff)); 

my_stuff *tmp; 
tmp->x = -1; 
tmp->y = 1; 
strcpy(tmp->data = "Initial state"); 

memset(my_array, tmp, sizeof(my_array)); 
+0

你到底需要一個'無效*'呢?具有非零參數的結構上的memset是相當罕見的... – Mehrdad 2011-04-19 03:10:17

+0

嗯,我只是在尋找一個函數,不會將int作爲第二個參數。這樣我可以很容易地將我的結構作爲參數傳遞。我知道我可以用for循環做,但我想找到更直觀的方式來初始化數組。 – fabricemarcelin 2011-04-19 03:16:15

+0

啊,我看到了......不幸的是,在C中沒有任何對你有幫助。:( – Mehrdad 2011-04-19 03:16:55

回答

4

memset()設置每個字節的值。對指向整數的指針(第二個參數)進行類型轉換沒有問題。主要的問題是它會比一個字節大。

我不知道任何版本的memset()複製多個字節值。我會爲此創建一個簡單的循環。

另請注意,如果您的代碼出現問題,則會出現一些其他問題。首先,sizeof(my_array)返回數據結構中的總字節數,而不是元素的數量。而且,你的代碼只會複製指針。由於目標不是指針,因此您需要實際複製它指向的數據 - 它是實際的結構。

+1

有'wmemset',但單元大小是'wchar_t',它是愚蠢的16位在Windows和32位其他地方... – 2011-04-19 03:23:00

+0

@R:是的,我忘記了'wmemset()'但是,是的,它的意圖更多的是字符而不是整數,即使在32位,它也會下降在64位系統上覆制指針的簡稱。 – 2011-04-19 03:31:11

4

沒有這個標準的功能 - 你只需要調用memcpy()在一個循環:

my_stuff *my_array = malloc(MAX * sizeof(my_stuff)); 
my_stuff tmp; 
size_t i; 

tmp.x = -1; 
tmp.y = 1; 
tmp.data = "Initial state"; 

for (i = 0; i < MAX; i++) 
    memcpy(&my_array[i], &tmp, sizeof tmp); 

請注意,您不能strcpy()轉換爲tmp.data,因爲那只是一個當沒有分配內存的指針。

+0

+1但是,我的首選是將'tmp'聲明爲常量:'const my_stuff tmp = {-1,1,「Initial state」 };' – Ben 2011-04-19 09:11:29

+0

@Ben:是的 - 用C99指定的初始值設定項更好(也應該使它成爲'靜態') – caf 2011-04-19 14:00:20

0

在這種情況下,您不能使用memset()。你應該使用memcpy()。剛剛嘗試了這一點: 1.您的malloc數組 2的陣列 3.副本的第一個元素的第一個元素初始化爲所有元素

/* step 1 */ 
my_stuff *my_array = malloc(MAX * sizeof(my_stuff)); 
int i; 

/* step 2 */ 
my_array[0].x = -1; 
my_array[0].y = 1; 
my_array[0].data = "Initial state"; 

/* step 3 */ 
for (i = 1; i < MAX; i++) 
    memcpy(&my_array[i], &my_array[0], sizeof(my_array[0]));