2012-02-13 108 views
7

我有一个类似于此的循环,其中arrayfunction设置所有数组值,compute_with_both_arrays基于这两个数组计算数字。阵列等于另一个阵列

他们的方式,我下面做不对array1 = array2工作。有没有一种方法可以做到这一点,而不需要在每个循环中运行两次arrayfuncion?

float sum = 0; 

float array1[10]; 
arrayfunction(0, array1); 

for(i=1; i<10; i++) { 
    float array2[10] 
    arrayfunction(1, array2); 

    float s; 
    s = compute_with_both_arrays(array1, array2); 
    sum = sum + s; 

    array1 = array2; 
} 
+6

'array1'不可分配。如果你的代码片断编译,我建议你摆脱你的编译器。 – pmg 2012-02-13 15:13:20

回答

9

必须手动存储器从一个阵列使用函数复制到另一个像memcpy

因此,例如:

memcpy(array1, array2, sizeof(array1)); 

请记住,我们可以使用sizeof操作上array1,因为它是在栈上分配一个明确的阵列。作为一个评论者指出,我们通过目的地的大小来避免缓冲区溢出。请注意,对于静态分配的阵列也可以使用相同的技术,但是不能使用在堆上动态分配的阵列上使用malloc,或者使用某些指向数组的指针......在这些情况下,您必须显式传递数组大小作为第三个参数。

最后,你需要使用memcpyfor -loop,因为该功能用于在机器代码级复制的内存使用的指令块通常优化的将远远超出带一个for循环的效率即使开启了编译器优化。

+0

值得注意的是,现代编译器会自动将for循环副本转换为对memcpy(或展开后的副本序列,如果大小很小)的调用。这就是说,最好调用'memcpy'。 – 2012-02-13 15:28:40

+0

为了安全起见,您应该始终传递目标数组的大小:“sizeof array1”而不是“sizeof array2”。 – ouah 2012-02-13 15:34:12

+0

@ouah:谢谢,我更新了该信息的发布 – Jason 2012-02-13 17:28:50