2012-07-28 82 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

相关问题