C语言中,数组初始化的方式主要有三种:

1、声明时,使用 {0} 初始化;

2、使用memset;

3、用for循环赋值。

那么,这三种方法的原理以及效率如何呢? 请看下面的测试代码:

#define ARRAY_SIZE_MAX  (1*1024*1024)void function1()
{char array[ARRAY_SIZE_MAX] = {0};  //声明时使用{0}初始化为全0
}void function2()
{char array[ARRAY_SIZE_MAX];memset(array, 0, ARRAY_SIZE_MAX);  //使用memset方法
}void function3()
{int i = 0;char array[ARRAY_SIZE_MAX];for (i = 0; i < ARRAY_SIZE_MAX; i++)  //for循环赋值{array[i] = 0;}
}

效率:

分别执行上面三种方法,统计下平均时间可以得出:  for循环浪费的时间最多,{0} 与memset 耗时差不多。

原理:

1、for循环赋值,就是循环赋值,不解释了

2、memset,很容易找到memset内部实现代码,这里也不解释了

3、{0} 内部是怎么实现的呢?

将上述代码编译成汇编格式如下:

function1如下:

 pushl   %ebpmovl    %esp, %ebpsubl  $1048600, %espleal  -1048584(%ebp), %eaxmovl    $1048576, %edxmovl  %edx, 8(%esp)movl   $0, 4(%esp)movl %eax, (%esp)call    memsetleaveret

function2如下:

 pushl   %ebpmovl    %esp, %ebpsubl  $1048600, %espmovl  $1048576, 8(%esp)movl   $0, 4(%esp)leal -1048584(%ebp), %eaxmovl    %eax, (%esp)call    memsetleaveret

通过汇编代码可以看出,{0}初始化方式,调用了memset函数!
对三种方法的选取:

1、for 最浪费时间,不建议(其实memset内部也是用循环实现的,只不过memset经过了严格优化,所以性能更高);

2、{0} 可能有移植性问题,虽然绝大多数编译器看到{0} 都是将数组全部初始化为0, 但是不保证所有编译器都是这样实现的;

3、综合1、2, 推荐使用memset方法。

上述代码,结果以及观点仅仅是一家之言,如果有问题,多谢指正!

C语言数组初始化的三种方法相关推荐

  1. c语言定义不定长数组初始化_C语言数组初始化的三种方式

    1.{0} 初始化 int arr1[3] = {0}; 使用 {0} 的方式最简洁,一般在定义的时候使用. 2.for 循环初始化 int arr2[3]; for (int i = 0; i &l ...

  2. c语言数组最大可定义多少位_C语言求数组的最大值三种方法

    /* 黄哥Python培训 黄哥所写*/#include int maxValue(int* arr, int n);int maxRecursionValue(int* arr, int n);in ...

  3. C语言中调用数组元素的三种方法:下标法、数组名法、指针法

    /*调用数组元素的三种方法:下标法.数组名法.指针法*/ #include<stdio.h> int main() {int a[] = { 1,2,3,4,5 }, i, * p;pri ...

  4. C语言常见问题——数组初始化的四种方法

    有一回,小易同学对我说:"你学过编程吗",我略略点一点头.他说,"学过编程,我便考一考你,在使用数组之前,应不应该初始化数组?" 我暗想,这么简单的问题,也配考 ...

  5. java类初始数组_java中数组初始化的三种方式是什么

    java中数组初始化的三种方式是:1.静态初始化,如[int a[] = {2, 0, 1, 9, 2020}]:2.动态初始化,如[int[] c = new int[4]]:3.默认初始化,如[i ...

  6. JAVA输出数组元素的三种方法(for/for each/toString)

    2022_02_19学习输出数组元素的三种方法以及c语言和java中数组的不同点 方法一:for循环输出数组元素 方法二:for each循环语句 方法三:Arrays类中的toString方法 c语 ...

  7. C语言求最大公约数三种方法详解

    C语言求最大公约数三种方法详解 题目要求 常用写法(穷举法) 辗转相减法 辗转相除法 main函数 整体代码 题目要求 运行最大公约数的常用算法,并进行程序的调式与测试. 常用写法(穷举法) 从两个数 ...

  8. JS数组添加元素的三种方法

    JS数组添加元素的三种方法 1.push() 方法可以向数组末尾添加一个或多个元素,并且返回新的长度 语法:arr.push(element1,element2,element3,····) 参数 概 ...

  9. 数组初始化的三种方式

    数组初始化的三种方式 动态初始化:数组定义与为数组分配空间和赋值的操作分开进行: 静态初始化:在定义数字的同时就为数组元素分配空间并赋值: 默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此 ...

最新文章

  1. 0314互联网新闻 | 陌陌秘密发布6款产品;白熊求职完成数百万元天使轮融资
  2. 从windows server的文件服务到分布式文件服务(二)
  3. P4199-万径人踪灭【FFT】
  4. JVM因“ OutOfMemory”错误而关闭-我该怎么办?
  5. 设计模式学习笔记——组合(Composite)模式
  6. 定义css设备类型-Media Queries
  7. 用JavaScript和HTML5创建文件上传器
  8. 查找一:C++静态查找
  9. java将数据写入csv文件,从csv文件中读取数据
  10. 理解GAN生成对抗网络
  11. Quora 用了哪些技术 ?(zz)
  12. 室外定位篇:一文解读高精度RTK定位
  13. linux的ls -l显示的total 4是什么意思?我使用ls -a -l显示的total12,同一个文件夹显示了不同的信息?
  14. 620集成显卡和mx250,残血还是满血?一招看清MX250显卡真面目
  15. 第五届强网杯全国网络安全挑战赛 题目复现(有题目附件,详解)
  16. 详解Transformer中Self-Attention以及Multi-Head Attention
  17. 【阿里云IoT+YF3300】10.快速开发188协议设备驱动
  18. 针对源代码保密源代码安全管理产品选型建议
  19. 靶机实战(bulldog)
  20. Itext pdf的页眉页脚

热门文章

  1. win10打开程序响应很慢_Win10系统打开此电脑卡住不能正常打开的解决办法
  2. 手机突然没信号!伪基站究竟是怎样搞鬼的?
  3. android压感屏幕,原生Android确认支持压感屏:苹果懵逼了
  4. OPNET和STK软件修改背景颜色用于黑白打印
  5. python自动生成鸡汤文_马尔可夫链文本生成的简单应用:不足20行的Python代码生成鸡汤文...
  6. Python测试平台开发实战
  7. Vue为什么能逆袭 Angular和React成为主流前端框架?
  8. 拉格朗日插值 - 洛谷 P4781
  9. OpenStack相关的邮件列表和IRC
  10. 虚拟机启动没有ip地址