采集2D数组并将其合并为一个

时间:2019-07-11 20:29:50

标签: c arrays memory-layout

我试图弄清楚如何将2D数组合并为一个。

我有一个二维数组,如下所示:

#include <stdio.h>

#define ROW 2
#define COL 10

int
main(void)
{
  int array[ROW][COL] = {2,6,12,18,23,55,57,58,59,60} , {1,3,5,9,11,19,27,28,31,56};
}

我试图使用嵌套的for循环,但没有任何运气。

3 个答案:

答案 0 :(得分:1)

执行以下操作:

#include <string.h> /* for memcpy() */

#define ROW (2)
#define COL (10)

int main(void)
{
  int array[ROW][COL] = {
    {  2,  6, 12, 18, 23, 55, 57, 58, 59, 60}, 
    {  1,  3,  5,  9, 11, 19, 27, 28, 31, 56}
  };

  int array1D[ROW*COL];
  memcpy(array1D, array, ROW*COL * sizeof(int));
}

在C数组中,确保将元素以连续的方式放置在内存中(无填充!)。因此,只需复制内存即可。

答案 1 :(得分:0)

memcpy不能保证正常工作。从技术上讲,您正在制作一个数组数组,并且取决于每个单独的“线性”数组的内存分配方式,memcpy可能会或可能不会工作。 与您分配的方式相同,但不能保证。

这就是您想要做的。

#include <stdio.h>

#define ROW 2
#define COL 10

int
main(void)
{
  int array[ROW][COL] ={ {2,6,12,18,23,55,57,58,59,60} , {1,3,5,9,11,19,27,28,31,56}};

  int i,j;

  int array1D[ROW*COL];

  for (i=0; i<ROW; i++){
        for (j=0; j<COL; j++){
            array1D[i*COL+j]=array[i][j];
        }
   }

   for (i=0; i<ROW*COL; i++){
      printf("%d ",array1D[i]);
   }

}

请注意,这里i代表行,j列。要访问单个int并保持“ 2d”性质,索引将为row #*column length+column #。或i*COL+j

答案 2 :(得分:0)

/* merge nbyA bytes of data in a with nbyB bytes of data in b. Return result. */
void *merge(const void *a, size_t nbyA, const void *b, size_t nbyB)
{
    void *buf = malloc(nbyA + nbyB);
    if (buf) {
        memcpy(buf, a, nbyA);
        memmove(buf + nbyA, b, nbyB);
    }

    return buf; /* caller must free */
}

a通过array[0];到b通过array[1]

此解决方案的优点是您具有通用的merge函数,该函数不仅可以用于合并2D数组的两个子数组,而且可以用于合并任意两个数据块。