关于在C中等同数组的问题

时间:2010-09-20 20:59:10

标签: c arrays

假设我有两个int数组x和y,它们都有长度3. x = {0,1,2}。

是否有任何一步将x的值分配给y。当我做y = x,并尝试打印y的值时,

代码无法编译。

我不想经历编写for循环的痛苦,并写y [i] = x [i]

7 个答案:

答案 0 :(得分:11)

您可以使用memcpymemmove

memcpy(y, x, sizeof x);

答案 1 :(得分:3)

你需要循环。

这些基本上是固定的指针,因此您不能只将一个指定给另一个指针。你必须复制每个值。

修改

这就是为什么我不推荐memcpy

  1. 任何小的都不快 元素数量;它可能会 慢一点。

  2. 他正在使用的memcpy版本 不包括任何保障措施 防止缓冲区溢出。这是很 容易,即使对于非新手来说也是如此 混淆元素的数量 元素的总大小, 导致严重的错误。它少了 容易搞乱for循环。

  3. 由于这只是C,你可以 (通常)安全地记忆一个元素。 如果这是C ++,你会想要 确保复制构造函数是 调用。这使得使用 记住一个坏习惯。

  4. 直接回应卡尔:

    1. 是的,memcpy可以非常快 大数据简单数据。这是 不是我们在这里处理的, 虽然。

    2. 我并不关心 memcpy中的错误, 但是使用它时容易出错。 它需要字节数,但是 自然的东西将是元素的数量。 for循环将使用元素计数。 在许多平台上,有更安全的版本 推断缓冲区大小并防止 覆盖;我推荐其中一个,如果 可能,memcpy是个好主意。

    3. 如果这是一个C ++对象数组,那么 作为std::string,然后使用memcpy代替 调用复制构造函数将是一个 错误本身。是的,我确实意识到了 例如C,而不是C ++,但事实并非如此 做个好主意。

答案 2 :(得分:3)

虽然你不能这样做:

int x[ 3 ] = { 0, 1, 2 };  // an array of three items
int y[ 3 ];                // another array of three items

y = x;                     // compile error - y isn't a pointer that can be reassigned.

你可以这样做:

int x[ 3 ] = { 0, 1, 2 };
int *y = x;   // a pointer to an array

您正在创建y作为指向数组x的指针,而不是x的副本。如果您更改x的值,那么在引用y时也会显示这些更改。

答案 3 :(得分:1)

如果将两个或多个变量声明为相同类型的结构,并且结构的定义包含数组,则可以将变量分配给彼此,并且将完整地复制数组。有时,为了这个目的,创建一个包含单个数组的结构可能很方便。

答案 4 :(得分:1)

在结构(或者联合,在这种情况下)中滚动它们。

struct int3 {
    int A[3];
};

int3 x = {{ 0, 1, 2 }};
int3 y = x;

这通常不会导致编译器编写的代码比执行每个元素的单个副本或使用memcpy更好,并且可能导致更差的代码。

答案 5 :(得分:0)

您需要循环或调用为您执行此操作的库函数,例如的memcpy /的memmove。

答案 6 :(得分:0)

语言无法内置。但是,您可以找到一个库调用来执行此操作。如果这是你经常做的事情,你可以自己轻松编写这个功能。