我想將存儲在結構中的一些數據複製到另一個結構中。下面的代碼是否工作?它是否被推薦?將結構複製到另一個
#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));
我想將存儲在結構中的一些數據複製到另一個結構中。下面的代碼是否工作?它是否被推薦?將結構複製到另一個
#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));
是否有效取決於您打算如何操作。它將t1
中的位複製到t2
,包括填充,但它當然會複製指針,而不是指向的值。
如果你不關心填充比特 - 爲什麼你應該 - 一個簡單的任務
Test t2 = t1;
是所有你需要複製的指針。
如果您希望指向的值被複制和複製,您的代碼和簡單的賦值都不起作用。
要複製指向內存塊,首先,您必須知道它們的大小。沒有(可移植的)方式從指針中找出指向內存塊的大小。
如果大小由#define
給出,那麼您當然可以重複使用它,否則您需要將分配的塊的大小存儲在某處。
但是由於新分配的內存塊的地址與要複製的塊不同,因此我們不需要複製從t1
到t2
的指針值。
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);
't2 = t1'會更準確。但在分享像這樣的指針時要小心。 – DCoder 2012-07-28 14:33:58
詳細說明@DCoder說的話,在這種情況下,您不會複製't1.a'和't1.b'的內存,您將複製一個指向該內存的結構。 – rudolph9 2012-07-28 14:36:00
爲了確保正確使用它,'malloc(100)'將保留100個字節,而不是100個整數。通常,爲了明確它,你會看到'malloc(NUM_ELEMENTS * SIZE_OF_ONE_ELEMENT)'。 – chris 2012-07-28 14:36:14