2012-07-28 104 views
1

我想將存儲在結構中的一些數據複製到另一個結構中。下面的代碼是否工作?它是否被推薦?將結構複製到另一個

#define SIZE 100 
struct { 
int *a; 
int *b; 
} Test; 
Test t1; 
t1.a = malloc(SIZE); 
t1.b = malloc(SIZE); 

Test t2; 
memcpy(t2,t1,sizeof(Test)); 
+0

't2 = t1'會更準確。但在分享像這樣的指針時要小心。 – DCoder 2012-07-28 14:33:58

+1

詳細說明@DCoder說的話,在這種情況下,您不會複製't1.a'和't1.b'的內存,您將複製一個指向該內存的結構。 – rudolph9 2012-07-28 14:36:00

+0

爲了確保正確使用它,'malloc(100)'將保留100個字節,而不是100個整數。通常,爲了明確它,你會看到'malloc(NUM_ELEMENTS * SIZE_OF_ONE_ELEMENT)'。 – chris 2012-07-28 14:36:14

回答

5

是否有效取決於您打算如何操作。它將t1中的位複製到t2,包括填充,但它當然會複製指針,而不是指向的值。

如果你不關心填充比特 - 爲什麼你應該 - 一個簡單的任務

Test t2 = t1; 

是所有你需要複製的指針。

如果您希望指向的值被複制和複製,您的代碼和簡單的賦值都不起作用。

要複製指向內存塊,首先,您必須知道它們的大小。沒有(可移植的)方式從指針中找出指向內存塊的大小。

如果大小由#define給出,那麼您當然可以重複使用它,否則您需要將分配的塊的大小存儲在某處。

但是由於新分配的內存塊的地址與要複製的塊不同,因此我們不需要複製從t1t2的指針值。

Test t2; 
t2.a = malloc(SIZE); /* be aware that this is bytes, not number of ints */ 
t2.b = malloc(SIZE); 
if (t2.a == NULL || t2.b == NULL) { 
    /* malloc failed, exit, or clean up if possible */ 
    fprintf(stderr,"Allocation failure, exiting\n"); 
    exit(EXIT_FAILURE); 
} 
/* malloc was successful in both cases, copy memory */ 
memcpy(t2.a, t1.a, SIZE); 
memcpy(t2.b, t1.b, SIZE); 
+0

不,我需要複製存儲在數組a和b中的整數數據。 – KasraM 2012-07-28 14:38:03

+0

在這種情況下,您需要'malloc'新的內存並複製該內容,我將其添加到我的答案中。 – 2012-07-28 14:38:53

+0

有什麼辦法可以跳過實現複製功能或避免循環? – KasraM 2012-07-28 14:39:44

相關問題