memset初始化数组易错点

2024-09-04 05:38
文章标签 数组 初始化 memset 易错

本文主要是介绍memset初始化数组易错点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、memset(a, 1, sizeof a);

如下代码,不少同学会以为a[]被初始化为1,其实不是的,是被初始化为16843009,为什么是这个数呢?

#include <bits/stdc++.h>
using namespace std;
int n, a[14];
int main()
{memset(a, 1, sizeof a);for(int i=0; i<14; ++i){cout << a[i] << endl;}return 0;
}

运行结构如下:

memset(a, 1, sizeof a);

原因

拿memset(a, 1, sizeof a); 为例, memset是按字节对整数数组a[]初始化,地址中每个字节都初始化为1,我们知道在大部分机器中,int占4个字节,所以使用memset对a初始化为1时,对应每一个a[i],是有4个字节的。那么每个a[i]会被初始化4个1,具体看下面:

每个a[i]占4个字节,每个字节8位,每个字节的8位初始化为1,用二进制表示为: 00000001

那么4个字节,每个字节都初始化为1,用二进制表示为 00000001 00000001 00000001 00000001,对应的10进制数为16843009。

所以初始化后的a[i]不是1,而是16843009。

通过程序计算,验证:

#include <bits/stdc++.h>
using namespace std;
int n, a[14];
int main()
{memset(a, 1, sizeof a);cout << fixed << setprecision(0) << pow(2,0)+pow(2,8)+pow(2,16)+pow(2,24) << endl;for(int i=0; i<14; ++i){cout << a[i] << endl;}return 0;
}

二、memset(a, 0x7f, sizeof a);

对于memset(a, 0x7f, sizeof a),memset是按字节对整数数组a[]初始化,地址中每个字节都初始化为0x7f,也就是二进制的01111111,(前面4为是7,后面4为是f)。我们知道在大部分机器中,int占4个字节,所以使用memset对a初始化为0x7f时,对应每一个a[i],是有4个字节的。那么每个a[i]会被初始化4个0x7f,具体看下面:

每个a[i]占4个字节,每个字节8位,每个字节的8位初始化为0x7f,用二进制表示为: 01111111

那么4个字节,每个字节都初始化为0x7f,用二进制表示为 01111111 01111111 01111111 01111111。

三、那么memset有什么用呢?

memset(a, 0, sizeof a); 可以初始化为0,因为4个字节,每个字节初始化为0之后的值为: 00000000 00000000 00000000 00000000,仍然是0

memset(a, -1, sizeof a); 可以初始化为-1,因为4个字节,每个字节初始化为-1之后的值为: 11111111 11111111 11111111 11111111,仍然是-1

可以初始化为一个比较大的值,因为每个字节只有8位,所以memset第二个参数的范围是00000000-11111111,或者0x00-0xFF(常用这种写法)

可一般用memset(a, 0x7f, sizeof a);来给数组赋一个比较大的值。

 

不熟悉的同学,用memset的时候一定要检查初始化是否如你所愿。

这篇关于memset初始化数组易错点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135148

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

计算数组的斜率,偏移,R2

模拟Excel中的R2的计算。         public bool fnCheckRear_R2(List<double[]> lRear, int iMinRear, int iMaxRear, ref double dR2)         {             bool bResult = true;             int n = 0;             dou

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

PHP7扩展开发之数组处理

前言 这次,我们将演示如何在PHP扩展中如何对数组进行处理。要实现的PHP代码如下: <?phpfunction array_concat ($arr, $prefix) {foreach($arr as $key => $val) {if (isset($prefix[$key]) && is_string($val) && is_string($prefix[$key])) {$arr[

Go 数组赋值问题

package mainimport "fmt"type Student struct {Name stringAge int}func main() {data := make(map[string]*Student)list := []Student{{Name:"a",Age:1},{Name:"b",Age:2},{Name:"c",Age:3},}// 错误 都指向了最后一个v// a