免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2841 | 回复: 5
打印 上一主题 下一主题

[C] c语言的二维数组的memset的bug [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-10 22:47 |只看该作者 |倒序浏览
本帖最后由 sculida 于 2015-09-11 00:05 编辑

/*用malloc创建一个5行9列的char数组。然后每一行都memset全部设置为字符'U'。但是最后发现,第一行里的字符居然全变了!!!*/
环境 centos gcc
代码
  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #include<string.h>
  4. #define length 9
  5. #define width 5
  6. void dump1(const char *);
  7. void dump(const char **);

  8. int main() {
  9.         char **p=NULL;
  10.         p=(char **)malloc(width);
  11.         int i=0;
  12.         for (i=0; i<width; i++) {
  13.                 p[i]=(char *)malloc(length);
  14.                 memset(p[i], 'U', length);
  15.                 printf("%x %x\n", p[i], p[i]+length);
  16.                 printf("%d\t", i);
  17.                 dump1((const char*)p[0]);
  18.         }
  19.         dump((const char**)p);
  20.         return 0;
  21. }

  22. void dump(const char **p) {
  23.         printf("begin dump\n");
  24.         int i=0;
  25.         for (i=0; i<width; i++) {
  26.                 dump1(p[i]);
  27.         }
  28. }
  29. void dump1(const char *pi) {
  30.         int j=0;
  31.         for (j=0; j<length; j++) {
  32.                 printf("%d ", pi[j]);
  33.         }      
  34.         printf("\n");
  35. }
复制代码
-----------------------------------------------------------------------------------------------------------------------
执行结果:
9b4030 9b4039
0       85 85 85 85 85 85 85 85 85
9b4050 9b4059
1       85 85 85 85 85 85 85 85 85
9b4070 9b4079
2       85 85 85 85 85 85 85 85 85
9b4090 9b4099
3       85 85 85 85 85 85 85 85 85
9b40b0 9b40b9
4       -80 64 -101 0 0 0 0 0 85
begin dump
-80 64 -101 0 0 0 0 0 85
85 85 85 85 85 85 85 85 85
85 85 85 85 85 85 85 85 85
85 85 85 85 85 85 85 85 85
85 85 85 85 85 85 85 85 85
--------------------------------------------------------------------------------------------------
说明第5次循环的时候,p[0]这一行的值改变了。而且p[j]各个位置的地址都不一样,不大可能是memset直接去修改p[0]行

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2015-09-10 23:21 |只看该作者
用代码方式贴你的代码。

bug应该也是你自己程序的问题

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
3 [报告]
发表于 2015-09-11 08:38 |只看该作者
p=(char **)malloc(width);
p=(char **)malloc(width*sizeof(char*));

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2015-09-11 08:44 |只看该作者
p=(char **)malloc(width * sizeof(char *));

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
5 [报告]
发表于 2015-09-11 08:46 |只看该作者
原来已经有回复了

论坛徽章:
0
6 [报告]
发表于 2015-09-11 08:51 |只看该作者
本帖最后由 sculida 于 2015-09-11 08:52 编辑

閸ョ偛锟斤拷 3# bruceteen

thank you!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP