【问题标题】:Array equal another array数组等于另一个数组
【发布时间】:2012-02-13 15:10:15
【问题描述】:

我有一个类似这样的循环,其中 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;
}

【问题讨论】:

  • array1 不可分配。如果您的 sn-p 已编译,我建议您摆脱编译器。

标签: c arrays pointers


【解决方案1】:

您必须使用memcpy 之类的函数手动将内存从一个数组复制到另一个数组。

例如:

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

请记住,我们可以在 array1 上使用 sizeof 运算符,因为它是在堆栈上分配的显式数组。正如评论者所指出的,我们传递目标的大小以避免缓冲区溢出。请注意,同样的技术也可以用于静态分配的数组,但是您不能在使用malloc 或使用一些指向-an-的指针在堆上动态分配的数组上使用它array ... 在这些情况下,您必须以字节为单位显式传递数组的大小作为第三个参数。

最后,您将希望在 for 循环上使用 memcpy,因为该函数通常针对使用机器代码级别的指令复制内存块进行优化,这将远远超过for-loop,即使打开了编译器优化。

【讨论】:

  • 值得注意的是,现代编译器会自动将 for 循环复制转换为对 memcpy 的调用(或展开的复制序列,如果大小很小)。也就是说,是的,最好打电话给memcpy
  • 为了安全起见,您应该始终传递目标数组的大小:sizeof array1 而不是 sizeof array2
猜你喜欢
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多