C语言中的sizeof中的数组和指针

1.引子

    今日在看动态规划的0-1背包问题,看完后还是打算自己写着试试,毕竟实践才能出真知嘛.动态规划的结果是个二维数组dp,我copy书上的例子进行初始 memset(dp,0,sizeof(dp)),考虑到程序的健壮性,对于数组我都是用的动态申请,自然二维数组也不例外[动态二维数组的建立可参见本blog的延伸].

    程序写完后,但是却不能运行,开始单步调试,当进行到dp的赋值时老是报指针的错误!!!开始我以为是指针越界什么的,仔细才发现dp的数组维数确实要多申请一个用来存放初始情况的值(全是0).但还是不行.只要乖乖的用两个for循环来赋值,这下程序确实可以出结果了.这说明刚才确实是初始化的时候出了问题.这才把问题瞄准了memset(dp,0,sizeof(dp)).

printf("%d",sizoef(dp)); 我的dp是5行6列,结果是4?

2.思考

    百度下memset,尤其是对整形数组进行初始化的部分.memset是以字节为单位进行初始化的.然后自己就写了个一维数组的demo试试:

    

1  int b[5];
2  int *c;
3  c = malloc(sizeof(int)*5);
4  memset(b,0,sizeof(b)); // 这个是可以成功的 
5  memset(c,0,sizeof(c)); // 也可以执行
6  printf("%d",b[2]);  //结果是0,b[0~3] = 0;
7  printf("%d",c[2]);  //结果却不是0!!!;
8  printf("%d %d",sizeof(b),sizeof(c));

 

       b[2] 与 c[2]的值不一样,两者的初始化的差别就在sizeof(b)与sizeof(c)上,这两个的结果是20,4!!!

       memset是以字节为单位进行初始化,第4行对b的20个字节全部初始化了,第5行只对c的前4个字节初始化了,c指向的还是20个字节的内存,所以c[0] = 0;但是c[1~3]就不是了.

       这两个的不同差别在哪呢?参阅sizeof

       首先这是个操作符而不是一个函数.计算数据类型的长度符的.上述中c和b都是存放5个整数,有什么不同吗?

       int b[]是一个数组,sizeof()值是其数据类型的sizeof值*其数组的长度;

   int *c是一个指针变量,sizeof中说明了一个指针变量的sizeof值必定是4(32bit),与其指向的数据类型无关;

3.解决

       然后在看动态规划的例子中dp是声明的二维数组dp[][],而我是的是int **dp;是一个指向指针的指针,所以是4;

       参考对一维数组初始化的例子,可以这样:

       

 1 // C++ -version
 2 int **array;
 3 array=new int *[10];
 4 for(int i=0;i<10;i++)
 5 
 6 {
 7          array[i]=new int [5];
 8 
 9        memset(array[i],0,5*sizeof(int));
10 
11 }

      c语言的把new 换成malloc即可!  

4.延伸

    1. 动态的二维数组

     

1 int r,c;
2 int **a;  //创建二维指针来指向数组
3 scanf("%d%d",&r,&c);
4 a  = (int **) malloc(sizeof(int *) * r);//注意申请的指针格式
5 for (j=0;j<r;j++){
6 a[j] = (int *) malloc(sizeof(int) * c);
7 ……
8 ……
9 }

     2. memset对整形数组初始化的错误是初始化为1,memset对整形只能初始化为0,这个情况memset中有讲;

         更多阅读课参考如下:

         http://blog.youkuaiyun.com/qtyl1988/article/details/8033181

 PS: 此blog是过了一夜写的,个人也忘了当初怎么就把错误的原因一步步的关注到sizeof的,我记得我好想开始还不是关注的此处.反正是又学到了!

 

转载于:https://www.cnblogs.com/programmer-cjr/p/3902411.html

内容概要:本文档详细介绍了Analog Devices公司生产的AD8436真均方根-直流(RMS-to-DC)转换器的技术细节及其应用场景。AD8436由三个独立模块构成:轨到轨FET输入放大器、高动态范围均方根计算内核精密轨到轨输出放大器。该器件不仅体积小巧、功耗低,而且具有广泛的输入电压范围快速响应特性。文档涵盖了AD8436的工作原理、配置选项、外部组件选择(如电容)、增益调节、单电源供电、电流互感器配置、接地故障检测、三相电源监测等方面的内容。此外,还特别强调了PCB设计注意事项误差源分析,旨在帮助工程师更好地理解应用这款高性能的RMS-DC转换器。 适合人群:从事模拟电路设计的专业工程师技术人员,尤其是那些需要精确测量交流电信号均方根值的应用开发者。 使用场景及目标:①用于工业自动化、医疗设备、电力监控等领域,实现对交流电压或电流的精准测量;②适用于手持式字万用表及其他便携式仪器仪表,提供高效的单电源解决方案;③在电流互感器配置中,用于检测微小的电流变化,保障电气安全;④应用于三相电力系统监控,优化建立时间转换精度。 其他说明:为了确保最佳性能,文档推荐使用高质量的电容器件,并给出了详细的PCB布局指导。同时提醒用户关注电介质吸收泄漏电流等因素对测量准确性的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值