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.csdn.net/qtyl1988/article/details/8033181

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

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

C语言中的sizeof中的数组和指针相关推荐

  1. c语言sizeof(test),解析C语言中的sizeof

    一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出了其操作数的存储大小.操作数可以是一个表达式或括在括号内的 ...

  2. c语言中sizeof是一个标准库函数,对C语言中的sizeof的介绍分析

    对C语言中的sizeof的介绍分析 引导语::sizeof是C语言中判断数据类型或者表达式长度符,以下是百分网小编分享给大家的对C语言中的sizeof的介绍分析,欢迎阅读! 1.定义 sizeof是C ...

  3. C语言中的sizeof()和strlen()的区别

    C语言中的sizeof和strlen的区别 sizeof() strlen 大量案例(想深入了解可以看) 1.(花括号int的sizeof()) 2.(花括号char的sizeof()) 3.(字符串 ...

  4. sizeof 在C语言的作用,C语言中的sizeof的用法详解

    C语言中的sizeof的用法详解 一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出了其操作数的存储大小.操 ...

  5. C语言中scanf()函数中的是什么

    困惑初学者的C语言中scanf()函数中的&到底是什么 对于初学者而言,肯定有过这样一个困惑:为什么在使用scanf函数输入数据时有时需要在参数前加一个&,而有时却不用. 在回答&qu ...

  6. c语言中sizeof结构体,C语言中的sizeof用法

    C语言中的sizeof是一个很有意思的关键字,经常有人用不对,搞不清不是什么.我以前也有用错的时候,现在写一写,也算是提醒一下自己吧.反正现在来看,还在搞sizeof是什么意思,怎么用正确,还是有点搞 ...

  7. go语言中fmt包中Print、Printf、Println输出相关函数的区别

    go语言中fmt包中Print.Printf.Println输出相关函数的区别 区别: Print系列函数将内容输出到系统的标准输出.其区别:Print函数式直接输出内容,Printf函数支持格式化输 ...

  8. c语言中for循环逗号表达式,c语言中for循环中()里的三个表达式分别省略都

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:c语言中for循环 中()里的三个表达式分别省略都是什么意思?回答:将参加循环的语句括起来:末尾循环体){ 中间循环体: } 其中, ...

  9. 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明...

    [VS开发][编程开发][C/C++开发]结构体中的数组与指针的内存分配情况说明 标签:[VS开发] [编程开发] 主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性.以及 ...

最新文章

  1. 网络营销外包——网络营销外包专员如何做好网站锚文本优化?
  2. windows 环境下python 安装 pypcap 并用pyinstaller打包到exe,解决DLL 加载失败。
  3. (建议收藏)产品经理要懂的SaaS知识,一文打包给你
  4. 【css3】旋转倒计时
  5. 两种大小端判断的方式
  6. 用 Keepalived+HAProxy 实现高可用负载均衡的配置方法
  7. jsp___jstl标签
  8. linux线程退出正确姿势demo
  9. 学JS的心路历程 - JS应用
  10. 【博客管理】博客格式说明【置顶】
  11. 计算机图形学完整笔记(五):二维图形变换
  12. 华硕aura完全卸载_华硕RadeonRX 5500XT显卡,散热强力升级,畅玩游戏冷静体验
  13. 基于vue的电商后台管理系统
  14. ds18b20驱动程序Linux,ARM-linux嵌入式内核驱动——DS18B20的驱动
  15. 计网实验总结一:路由器配置
  16. 狂神Docker笔记之:Docker的常用命令
  17. 记住这三个方法,让你的钱越花越多
  18. 人人站CMS缓存过大清理方法
  19. iOS 热更新/热修复
  20. 推荐一个医疗器械管理软件能通过gsp并且有追溯功能的

热门文章

  1. vue 如何判断两个数组相同_如何判断车头与障碍物的距离,教你两个办法,轻松靠墙10公分...
  2. 高温预警c语言,注意 | 高温预警来了!最高38°C!高温7连击!
  3. memcpy-结构体的复制
  4. Matlab中fft作频谱横纵坐标
  5. C语言中fgets()函数
  6. 基区宽度调制效应(厄尔利(Early)效应)
  7. Excel公式不同引用地址方式的应用总结
  8. 使用librosa计算pcen
  9. micro-mvc框架支持mvc各层业务代码热部署
  10. (转)自动化管理工具Saltstack之nginx部署