二維數組使用memcpy賦值,使用malloc動態申請內存,以及結構體數組的memcpy

二維數組使用memcpy賦值:

//void *memcpy(void *dest, const void *src, size_t n);從源src所指的內存地址的起始位置開始拷貝n個
//字節到目標dest所指的內存地址的起始位置中。調用該函數需要引用string.h頭文件.
int a[M][N], b[M][N];
memcpy(b, a, sizeof(a));

/////////////////////////////////////////結構體中二維數組的memcpy//////
memcpy(cl_ctx->wq[0], ctx->wq[0], sizeof(cl_ctx->wq[0]));//指針在64位系統佔8個字節,ctx->wq[1]是指針,因此sizeof(ctx->wq[1])=8,故不可用
memcpy(cl_ctx->wq[1], ctx->wq[1], sizeof(cl_ctx->wq[1]));
//或者
memcpy(&cl_ctx->wq[0][0], &ctx->wq[0][0], sizeof(cl_ctx->wq));
memcpy(cl_ctx->wq, ctx->wq, sizeof(cl_ctx->wq));
//均可以.
//但是如果兩個結構體中第一個是wq[2][64],另一個是*wq[2],則只能使用上面的兩個對每個維度單獨賦值,因爲*wq[2]的第二維可能不是64.
///////////結構體數組的memcpy///////////////////////////////////////////////////
typedef struct _CL_CORE{
	ENC_SBAC     s_curr_before_split[MAX_CU_DEPTH][MAX_CU_DEPTH];
	ENC_SBAC     s_curr_best[MAX_CU_DEPTH][MAX_CU_DEPTH];
	ENC_SBAC     s_next_best[MAX_CU_DEPTH][MAX_CU_DEPTH];
	ENC_CU_DATA  cu_data_best[MAX_CU_DEPTH][MAX_CU_DEPTH];
	ENC_CU_DATA  cu_data_temp[MAX_CU_DEPTH][MAX_CU_DEPTH];
}CL_CORE;

memcpy(&cl_core->s_curr_before_split[0][0], &core->s_curr_before_split[0][0], sizeof(cl_core->s_curr_before_split));
memcpy(cl_core->s_curr_before_split, core->s_curr_before_split, sizeof(cl_core->s_curr_before_split));

例一:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void printarr2d(int (*a)[3],int row,int col);
int main()
{
    int i,j;
    int a[2][3] = {{1,2,3},{4,5,6}};
    int b[4][3] = {{0,0,0},{0,0,0}};
     memcpy(b[2],a,sizeof(int)*2*3);//b[2]代表以b[2]爲起始地址開始賦值
     printarr2d(b,4,3);
     return 0;
}
/***********************************************
打印顯示數組
************************************************/
void printarr2d(int (*a)[3],int row,int col)
{
 int i,j;
 for(i=0; i<row; i++)
    {
        for(j=0; j<col; j++)
        {
            printf("%d", a[i][j]);
        }
         printf("\n");
    }
}
 

 

例二:

#include"string.h" 
#include"stdio.h"
int main(void)
{ 
  int i,j;
  int a[2][3]={{1,2,3},{4,5,6}};  
  int b[2][3];
  memcpy(&b[0][0],&a[0][0],24);
  printf("%d",b[1][0]);
}

例三:

#include <stdio.h>
void print(int *data,size_t m,size_t n); //二維數組顯示子函數

int main(void)
{
    int src[][3]={{1,2,3},{4,5,6},{7,8,9},{1,2,3},{4,5,6},{7,8,9}};  
    int des[6][3]={0,0};//要小心,行數固定
    printf("%d",sizeof(src));
    print(src,6,3);
    memcpy(des,src,sizeof(src));
    print(des,6,3);

    return 1;
}
//二維子函數顯示功能
void print(int data[][3], size_t m,size_t n)
{

    int i,j;
    
    printf("\n");
    for(i=0;i<m;i++)
    {    for(j=0;j<n;j++)
        {
            printf("%d ",data[i][j]);
        }
    printf("\n");
    }
}

 

二維數組使用malloc動態申請內存:

https://blog.csdn.net/fengxinlinux/article/details/51541003

方法一:利用二級指針申請一個二維數組。

#include<stdio.h>  
#include<stdlib.h>  
  
  
int main()  
{  
    int **a;  //用二級指針動態申請二維數組  
    int i,j;  
    int m,n;  
    printf("請輸入行數\n");  
    scanf("%d",&m);  
    printf("請輸入列數\n");  
    scanf("%d",&n);  
    a=(int**)malloc(sizeof(int*)*m);  
    for(i=0;i<m;i++)  
    a[i]=(int*)malloc(sizeof(int)*n);  
    for(i=0;i<m;i++)  
    {
        for(j=0;j<n;j++)  
        {
            printf("%p\n",&a[i][j]);     //輸出每個元素地址,每行的列與列之間的地址時連續的,行與行之間的地址不連續
        }
    }
    for(i=0;i<m;i++)  
    free(a[i]);
 
    free(a);  
    return 0;  
} 

方法二:用數組指針形式申請一個二維數組。

#include<stdio.h>  
#include<stdlib.h>  
  
  
int main()  
{  
    int i,j;  
    //申請一個3行2列的整型數組  
    int (*a)[2]=(int(*)[2])malloc(sizeof(int)*3*2);  
    for(i=0;i<3;i++)  
    {
        for(j=0;j<2;j++)  
        {  
            printf("%p\n",&a[i][j]);  //輸出數組每個元素地址,每個元素的地址是連續的
        }
    }
 
 
    free(a);
    return 0;  
}  

方法三:用一個單獨的一維數組來模擬二維數組。

#include <stdio.h>
#include <stdlib.h>
 
 
int main()
{
    int nrows,ncolumns;
    int *Array;
    int i,j;
    printf("please input nrows&ncolumns:\n");
    scanf("%d%d",&nrows,&ncolumns);
    Array=(int *)malloc(nrows*ncolumns*sizeof(int));   //申請內存空間
    for(i=0;i<nrows;i++)
    {
        for(j=0;j<ncolumns;j++)
        {
            Array[i*ncolumns+j]=1;
            printf("%d ",Array[i*ncolumns+j]);   //用Array[i*ncolumns+j] 訪問第i,j個成員
        }
        printf("\n");
    }
    free(Array);
    return 0;
}
 
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章