为啥memset不能将数组元素初始化为1

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥memset不能将数组元素初始化为1相关的知识,希望对你有一定的参考价值。

当然不行啦。

memset只有赋值是-1,0是正确的,原因如下:

用memset初始化数组为1出错-CSDN

memset是按字节赋值的,取变量a的后8位二进制进行赋值。

1的二进制是(00000000 00000000 00000000 00000001),取后8位(00000001),int型占4个字节,当初始化为1时,它把一个int的每个字节都设置为1,也就是0x01010101,二进制是00000001 00000001 00000001 00000001,十进制就是16843009。

之所以输入0,-1时正确,纯属巧合。

0,二进制是(00000000 00000000 00000000 00000000),取后8位(00000000),初始化后00000000 00000000 00000000 00000000结果是0
-1,负数在计算机中以补码存储,二进制是(11111111 11111111 11111111 11111111),取后8位(11111111),则是11111111 11111111 11111111 11111111结果也是-1

其他的数字的赋值只能用for:

for(int i=1;i<=n;i++)

z[i]=1;

参考技术A 很简单memset是一个字节一个字节的设置,把一个int的每个字节都设置为1,也就是0x01010101,十进制就是16843009 参考技术B 1、效果是一样的,memset更常用。memset的效率比for循环要高出很多。
2、使用memset函数与将函数代码写在自己的程序里是不一样的,C标准库中的memset对Cache的利用做了优化,具体的在《C专家编程》151页有解释,这里给出测试:

#include <string.h>
#define MAXSIZE 100000

int main()

char arr[MAXSIZE];
for(int i=0;i<10000;i++)

memset(arr,'0',sizeof(arr));
// for(int j=0;j<MAXSIZE;j++)
// arr[0] = '0';

return 0;


程序里的注释部分与memset行分别使用,结果是使用memset的程序运行时间大约为0.1s,而用for循环的程序要3s多。综上:memset()可以用在字符数组的初始化以及类似于memset(arr,0,n*sizeof(int));的情况,效率比手动赋值要高的多。

如何将二维数组的所有元素初始化为java中的任何特定值

【中文标题】如何将二维数组的所有元素初始化为java中的任何特定值【英文标题】:How to initialize all the elements of a 2D array to any specific value in java 【发布时间】:2018-09-28 13:04:21 【问题描述】:

在 C++ 中有一个函数 ( memset() ) 可以初始化一维数组和任何多维数组的值。但是在java中有一个函数fill可以初始化一维数组但不能初始化多维数组。

【问题讨论】:

您能详细说明一下吗?你想在java中做什么,你是怎么做的,为什么它不起作用? 你试过用两个循环吗? 我还没有使用循环 如果 x 是一个二维整数数组 then.to 用 3 填充 x 中的所有值使用Arrays.stream(x).forEach(a-&gt;Arrays.fill(a,03);); 【参考方案1】:

Arrays.fill() 方法可用于填充一维数组,但没有内置方法可以“深度”填充多维数组。

对于二维数组,我会这样做:

int[][] arr2 = new int[5][5];  
for(int[] arr1 : arr2) 
  Arrays.fill(arr1, 1);

【讨论】:

痛苦。太糟糕了,这在 java8/9 时间范围内没有得到改进

以上是关于为啥memset不能将数组元素初始化为1的主要内容,如果未能解决你的问题,请参考以下文章

c语言中怎么把一维数组初始化为全零啊,不用循环

如何将二维数组的所有元素初始化为java中的任何特定值

关于memset()

数组初始化及赋值的方法,memset的使用

使用 memset 初始化指针元素的二维数组

memset初始化数组的坑