将2d数组的一部分分配给1d数组

时间:2011-10-03 22:24:12

标签: c multidimensional-array

如何执行以下操作:

int A[2][2];
int B[2];
A[1][0]=2;
B=A[1];
printf("%d",B[0]); //prints out 2

我必须使用malloc吗?我知道在更高级别的语言中,上述方法可行,但我对在C

中做什么感到有点困惑

4 个答案:

答案 0 :(得分:1)

这里的问题是变量被声明为int B,你应该将它声明为int B[2]

在您的代码中,当您将A[1]分配给B时,它会将A[1]的第一个元素的值分配给B

您可以声明为int *B,因此您将A[1]的ptr分配给B。实际上,取决于编译器将无法编译。要测试,请执行:

int *B;
B = A[1];
printf("%d, %d", B[0], B[1]);

答案 1 :(得分:1)

你不能分配给数组(虽然你可以初始化它们,这是非常不同的。)

您可以通过分配B逐个元素

来执行您想要的操作
B[0] = A[1][0];
B[1] = A[1][1];

或者,有一个循环

for (k=0; k<2; k++) B[k] = A[1][k];

答案 2 :(得分:1)

你可以memcpy()。

#include <stdio.h>
#include <string.h>

int main() {
  int a[2][2] = {{1, 2}, {3, 4}};
  int b[2];

  // Syntax: memcpy(to, from, number_of_bytes_to_copy);
  // (to and from should be pointers)
  memcpy(b, a[1], sizeof(int) * 2);

  printf("%d %d", b[0], b[1]);
}

输出:

3 4

答案 3 :(得分:0)

数组不可分配。您无法分配整个阵列。无论是2D,1D还是42D都没有任何区别。

使用memcpy

static_assert(sizeof B == sizeof A[1]);
memcpy(B, A[1], sizeof B);

编写自己的数组复制功能或使用宏

#define ARR_COPY(d, s, n) do{\
    size_t i_, n_; for (i_ = 0, n_ = (n); i_ < n_; ++i_) (d)[i_] = (s)[i_];\
  }while(0)

ARR_COPY(B, A[1], 2);