【问题标题】:How to split array into two arrays in C如何在C中将数组拆分为两个数组
【发布时间】:2011-08-16 12:56:48
【问题描述】:

假设我在 C 中有一个数组

int array[6] = {1,2,3,4,5,6}

我怎么能把它分成

{1,2,3}

{4,5,6}

这可以使用 memcpy 吗?

谢谢,

诺诺诺

【问题讨论】:

  • 是的,但根据您需要对这些碎片做什么,这可能是不必要的。你想用这些碎片做什么?
  • 通过对它们进行操作的函数运行它们。但是,我无法修改该功能。
  • memcpy 会将内容(按字节)从源缓冲区复制到目标缓冲区。你的数组实际上不会一分为二。您必须创建两个新数组并将内容从第一个复制到新数组

标签: c arrays split memcpy


【解决方案1】:

当然。直接的解决方案是使用malloc 分配两个新数组,然后使用memcpy 将数据复制到两个数组中。

int array[6] = {1,2,3,4,5,6}
int *firstHalf = malloc(3 * sizeof(int));
if (!firstHalf) {
  /* handle error */
}

int *secondHalf = malloc(3 * sizeof(int));
if (!secondHalf) {
  /* handle error */
}

memcpy(firstHalf, array, 3 * sizeof(int));
memcpy(secondHalf, array + 3, 3 * sizeof(int));

但是,如果原始数组存在的时间足够长,您甚至可能不需要这样做。您可以使用指向原始数组的指针将数组“拆分”为两个新数组:

int array[6] = {1,2,3,4,5,6}
int *firstHalf = array;
int *secondHalf = array + 3;

【讨论】:

  • 但请记住 (1) 始终检查 malloc( ) 的返回值; (2) 不要投射返回的 ptr。
  • @Pete 不投吗?为什么不呢?
  • 因为它在 C 中不是必需的,并且被认为是不好的做法。
  • @Pete Wilson:为简洁起见,我省略了错误检查,这被夸大了。不知道 void*int* 的演员阵容是不需要的,我已经这样做了很多年,从未考虑过是否需要。感谢您的见解! :-)
【解决方案2】:
// create space for 6 ints and initialize the first 6
int array[6] = {1,2,3,4,5,6};
// reserve space for two lots of 3 contiguous integers
int one[3], two[3]; 
// copy memory of the first 3 ints of array to one
memcpy(one, array, 3 * sizeof(int)); 
// copy 3 ints worth of memory from the 4th item in array onwards
memcpy(two, &array[3], 3 * sizeof(int)); 

【讨论】:

  • 谢谢,但是请你注释代码行,我不明白他们在做什么——尤其是int one[3] = (int[3])array;。这是将array 转换为长度为 3 的数组吗?
  • +1 来自我,我喜欢你展示的解决方案,它可以进行深度复制,并且不需要 malloc/free。来自非英语母语人士的小问题:您的意思是在代码注释中写 for two *s*lots 吗?
  • @Frerich Raabe:不,我的意思是使用很多。见英文的第二个定义:en.wiktionary.org/wiki/lot,可以将事物组合成“很多”。一般来说,在 C 语言中,我会鼓励绝对最少使用 malloc。
【解决方案3】:

您不必拆分它们。如果你有

int *b = array + 3;

你有第二个数组。当您将数组传递给函数时,无论如何它都会变成指针。

【讨论】:

    【解决方案4】:

    了解 memcpy 的工作原理,无需专门拆分数组。在目标数组中所做的更改会自动转到源数组,反之亦然。

    #include<stdio.h>
    #include<stdlib.h>
    #include <string.h>
    
    double *** double3d(long int dim1,long int dim2,long int dim3)
    {
        long int i,j,k;
        double ***array;
        array=(double ***)malloc(dim1*sizeof(double **));
        for(i=0;i<dim1;i++)
        {
         array[i]=(double **)malloc(dim2*sizeof(double *));
         for(j=0;j<dim2;j++)
          array[i][j]=(double *)malloc(dim3*sizeof(double ));
        }
        return array;
    }// end double3d
    
    void summ(double ***A,double ***B, double ****C)
    {
        int i ,j ,k;
        for(i=0;i<10;i++)
        for(j=0;j<5;j++)
        for(k=0;k<5;k++)
        (*C)[i][j][k]=A[i][j][k]+B[i][j][k];
    }
    
    void main()
    {
       int i,j,k,nx,ny;
       double ***M1, ***M2, ***M3, ***M4,***M5,***M6;
       nx=5;ny=5;
        M1=double3d(10,nx,ny);
        M2=double3d(10,nx,ny);
        M3=double3d(10,nx,ny);
        M4=double3d(5,nx,ny);
        M5=double3d(5,nx,ny);
        M6=(double ***)malloc(10*sizeof(double **));
    
        for(i=0;i<10;i++)
        {
            for(j=0;j<nx;j++)
               for(k=0;k<ny;k++)
               {
               M1[i][j][k]=i;
               M2[i][j][k]=1;
               }
        }
    
    // Note random values are in M4 and M5 as they are not initalised
        memcpy(M6,     M4, 5 * sizeof(double **));
        memcpy(M6+5,   M5, 5 * sizeof(double **));
    
        for(i=0;i<5;i++)
        {
           for(j=0;j<nx;j++)
              for(k=0;k<ny;k++)
              {
                   M4[i][j][k]=200;
                   M5[i][j][k]=700;
              }
        }
    
    printf(" printing M6 Memcpy before addtion\n");
        for(j=0;j<nx;j++)
        {
           for(k=0;k<ny;k++)
               printf("%f ",M6[4][j][k]);
           printf("\n");
           for(k=0;k<ny;k++)
               printf("%f ",M6[9][j][k]);
           printf("\n");
        }
        // calling for non memcpy array
        summ(M1,M2,&M3); printf(" Non memcpy output last value : %f \n",M3[9][nx-1][ny-1]);
        // calling for memcpy
        summ(M1,M2,&M6); printf(" memcpy output last value : %f \n",M6[9][nx-1][ny-1]);
    printf(" printing M6 Memcpy for two sets after addtion\n");
        for(j=0;j<nx;j++)
        {
           for(k=0;k<ny;k++)
               printf("%f ",M6[4][j][k]);
           printf("\n");
        }
        for(j=0;j<nx;j++)
        {
           for(k=0;k<ny;k++)
               printf("%f ",M6[9][j][k]);
           printf("\n");
        }
    
        free(M6);// cleared M6
    
    printf(" printing M4 Memcpy after deleting M6\n");
        for(j=0;j<nx;j++)
        {
           for(k=0;k<ny;k++)
               printf("%.1f ,%.1f ,%.1f ,%.1f ,%.1f ",M4[0][j][k],M4[1][j][k],M4[2][j][k],M4[3][j][k],M4[4][j][k]);
           printf("\n");
        }
    
    printf(" printing M5 Memcpy after deleting M6\n");
        for(j=0;j<nx;j++)
        {
           for(k=0;k<ny;k++)
               printf("%.1f ,%.1f ,%.1f ,%.1f ,%.1f ",M5[0][j][k],M5[1][j][k],M5[2][j][k],M5[3][j][k],M5[4][j][k]);
           printf("\n");
        }
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 2020-06-25
      • 2014-07-31
      相关资源
      最近更新 更多