在编程中有时需要使用二维数组作为buffer,下面是我写的一个二维数组的demo。

这里面涉及到几个内存操作的知识点,一个一个的来讲。

1. 创建两个1维数组,用于给二维数组填充值的时候使用。

/*2行27列,一维数组长度为27*/
#define BUFF_SIZE_ROW 2
#define BUFF_SIZE_COL 27int main()
{/*初始化两个原子数据,全1和全2*/unsigned char data[BUFF_SIZE_COL];unsigned char data1[BUFF_SIZE_COL];/*memset整体为数组赋值某个值*/memset(data, 1, BUFF_SIZE_COL);memset(data1, 2, BUFF_SIZE_COL);

这一段包含两个知识点,一个是一位数字的创建,和一维数组的一个整体一次性赋值。用到的重点函数的memset。

2.动态创建二维数组,用法如下

unsigned char **buffer_a = (unsigned char **)malloc(BUFF_SIZE_ROW * sizeof(unsigned char *));for(int i = 0; i < BUFF_SIZE_ROW; i++){buffer_a[i] = (unsigned char *)malloc(BUFF_SIZE_COL * sizeof(unsigned char));}

3.将原子一维数组填充到动态创建的二维数组中

/*将原子数据赋值给buffer_a*/memcpy(buffer_a[0], data1, BUFF_SIZE_COL);memcpy(buffer_a[1], data1, BUFF_SIZE_COL);

这部分用到的知识点是memcpy,这里一定要注意copy的内存大小。

4.将一个动态创建的二维数组赋值给另外一个动态创建的二维数组

/*将buffer_a循环赋值给buffer_b*/for (size_t i = 0; i < BUFF_SIZE_ROW; i++){memcpy(buffer_b[i], buffer_a[i], BUFF_SIZE_COL);}

这里注意buffer_b的创建方式与buffer_a一致。

5.释放二维数组

/*释放buffer,先释放行,再释放列*/for(int i = 0; i < BUFF_SIZE_ROW; i++)free(buffer_a[i]);free(buffer_a);buffer_a = NULL; 

这里注意要先free掉列,再释放行,与创建时相反

下面是完整的测试代码:

#include <stdio.h>
#include <windows.h>/*2行27列,一维数组长度为27*/
#define BUFF_SIZE_ROW 2
#define BUFF_SIZE_COL 27int main()
{/*初始化两个原子数据,全1和全2*/unsigned char data[BUFF_SIZE_COL];unsigned char data1[BUFF_SIZE_COL];/*memset整体为数组赋值某个值*/memset(data, 1, BUFF_SIZE_COL);memset(data1, 2, BUFF_SIZE_COL);/*创建二维动态数组buffer_a和buffer_b*/unsigned char **buffer_a = (unsigned char **)malloc(BUFF_SIZE_ROW * sizeof(unsigned char *));for(int i = 0; i < BUFF_SIZE_ROW; i++){buffer_a[i] = (unsigned char *)malloc(BUFF_SIZE_COL * sizeof(unsigned char));}unsigned char **buffer_b = (unsigned char **)malloc(BUFF_SIZE_ROW * sizeof(unsigned char *));for(int i = 0; i < BUFF_SIZE_ROW; i++){buffer_b[i] = (unsigned char *)malloc(BUFF_SIZE_COL * sizeof(unsigned char));}/*将原子数据赋值给buffer_a*/memcpy(buffer_a[0], data1, BUFF_SIZE_COL);memcpy(buffer_a[1], data1, BUFF_SIZE_COL);/*将buffer_a循环赋值给buffer_b*/for (size_t i = 0; i < BUFF_SIZE_ROW; i++){memcpy(buffer_b[i], buffer_a[i], BUFF_SIZE_COL);}/*输出A B的第一行数据,验证是否等于data*/for (size_t i = 0; i < BUFF_SIZE_COL; i++){printf("a %d, %d\r\n", i, buffer_a[0][i]);}for (size_t i = 0; i < BUFF_SIZE_COL; i++){printf("b %d, %d\r\n", i, buffer_b[0][i]);}/*释放buffer,先释放列,再释放行*/for(int i = 0; i < BUFF_SIZE_ROW; i++)free(buffer_a[i]);free(buffer_a);buffer_a = NULL; for(int i = 0; i < BUFF_SIZE_ROW; i++)free(buffer_b[i]);free(buffer_b);buffer_b = NULL; system("pause");return 0;
}

linux kernel

    int i, j;uint8_t **buffer_a = (uint8_t **)kmalloc(BUFF_SIZE * sizeof(uint8_t *), GFP_KERNEL);uint8_t **buffer_b = (uint8_t **)kmalloc(BUFF_SIZE * sizeof(uint8_t *), GFP_KERNEL);uint8_t data[SAMP_SIZE];memset(data, 0xff, SAMP_SIZE);for (i = 0; i < BUFF_SIZE; i++){buffer_a[i] = (uint8_t *)kmalloc(SAMP_SIZE * sizeof(uint8_t), GFP_KERNEL);}for (i = 0; i < BUFF_SIZE; i++){buffer_b[i] = (uint8_t *)kmalloc(SAMP_SIZE * sizeof(uint8_t), GFP_KERNEL);}calltime = ktime_get();for (i = 0; i < BUFF_SIZE; i++){memcpy(buffer_a[i], data, SAMP_SIZE);}for (j = 0; j < 100; j++){/* code */for (i = 0; i < BUFF_SIZE; i++){memcpy(buffer_b[i], buffer_a[i], SAMP_SIZE);}}rettime = ktime_get();delta = ktime_sub(rettime, calltime);duration = (unsigned long long )ktime_to_ns(delta) >> 10;printk("buffer copy use %lld us\r\n", duration);/*free buffer*/for (i = 0; i < BUFF_SIZE; i++){kfree(buffer_a[i]);}kfree(buffer_a);buffer_a = NULL; for(i = 0; i < BUFF_SIZE; i++){kfree(buffer_b[i]);}   kfree(buffer_b);buffer_b = NULL; 

C语言动态创建二维数组相关推荐

  1. C语言-动态创建二维数组

    文章目录 1 前言 2 动态创建的实现方法 2.1 方法1(适用于二级指针传递) 2.2 方法2(模拟C语言数组的储存方式) 1 前言 参照我之前的一篇文章 二维数组做函数的参数 文章中提到,当我们想 ...

  2. c语言动态生成二维数组,C语言 动态创建二维数组

    /*C语言 如何动态创建二维数组 转化为一维数组申请数组,创建和释放都比较简单 */ #include #include #include #define RANK 10 #define COLUMN ...

  3. malloc动态创建二维数组(C语言)

    c语言用malloc动态创建二维数组 #include <stdio.h> #include <stdlib.h> void fun(int m,int n){//行数,列数 ...

  4. C++ 动态创建二维数组

    背景知识: 对二维数组的理解方式至关重要:把二维数组看成是一种特殊的一维数组,它的元素又是一个一维数组. 例如:int a[3][4], 可以理解为定义了3个一维数组,即相当于  a[0], a[1] ...

  5. C++ 动态创建二维数组int** B = new int* [n];

    #include <iostream> using namespace std;int main() {//动态创建一维数组int* A = new int[10]; //int A[10 ...

  6. 动态创建 二维数组和三维数组,最后将数据转为OPENCV图片显示

    二维 //int **dpPT1 = new int*[Index_Qty];//动态申请二维数组//int **dpPT2 = new int*[Index_Qty];//int **dpPP = ...

  7. C++动态创建多维数组

    众所周知,在c++里动态创建一个一维数组可以直接: int* arr = new int[length]; 但是,如果到了二维,这样是行不通的: int** arr = new int[length] ...

  8. python创建一个n*m的二维数组_Python中创建二维数组

    Python中创建二维数组 二维数组 二维数组本质上是以数组作为数组元素的数组,即"数组的数组",类型说明符 数组名[常量表达式][常量表达式].二维数组又称为矩阵,行列数相等的矩 ...

  9. c语言字符串二维数组的动态分配应,C语言中动态分配二维数组复习过程.doc

    C语言中动态分配二维数组复习过程.doc C语言中动态分配二维数组在C中动态分配内存的,对于单个变量,字符串,一维数组等,都是很容易的.C中动态分配二维数组的方法,很少有C语言书中描述,我查找了有的C ...

最新文章

  1. unigui中弹出对话框原窗体是没有了_最前线 | 微信对话框“搜一搜”功能上线,独辟蹊径的腾讯打着什么算盘?...
  2. 干货|4条实用小建议,送给初入NLP领域的你(附链接)
  3. type python_typepython
  4. 心疼啊今天在四季青买衣服的时候在试衣服的时候,竟然有个小偷把我的n73手机给偷去了,...
  5. 将ArXiv中的Reference导入EndNote
  6. struts-config.xml 简述
  7. Goland 这些实操技巧,你可能还不会!
  8. [原创]web application中使用Profile应该注意的问题
  9. boost 获取时间
  10. 研发工程规范性模型-DevSecOps
  11. inode对接微软服务器,14 普通用户接入-iNode客户端升级
  12. EXP-00091 Exporting questionable statistics问题解决
  13. 大平原顾问快讯FRX移至新服务器
  14. Windows语音通话SDK集成及功能实现(实时语音通话四)
  15. php的简单网站设计
  16. 台式计算机连不上网,台式机插上网线连不上网怎么办?
  17. 【CVPR 2021】pixelNeRF: Neural Radiance Fields from One or Few Images
  18. import numpy出现ImportError: DLL load failed: 找不到指定的模块的解决方案
  19. 玻尔兹曼机BM 受限玻尔兹曼机 RBM
  20. 【Linux】网络管理与相关应用

热门文章

  1. Python的IPy模块
  2. 古代文学经典、现代文学经典
  3. unity获取脚本组件_获取物件脚本、变数、名称
  4. html5橡皮檫特效
  5. 织梦批量获取文章链接
  6. 4、Latex学习笔记之数学公式篇
  7. spacedesk-笔记本、平板、扩展屏幕-解决平板字体太小的问题
  8. 微信小程序输入框会字体显示不全或者换行
  9. 如何认识区分轻重缓急以及自我定位
  10. java毕业设计视频点播系统演示录像源码+lw文档+mybatis+系统+mysql数据库+调试