免费注册 查看新帖 |

Chinaunix

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

[菜鸟]为什么分明size除了2,wmemset还是越了界 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-19 20:28 |只看该作者 |倒序浏览
一个结构:
  9 struct teacher{
10         char name[MAX_STRLEN];
11         short subject;
12         short take; /* number of classes teacher take */
13         short inclass[MAX_WEEK_LESSON];
14         short day_lesson[7];
15 };  

这样的初始化这个teacher结构的一个长ntchr的数组tchrs:
12         for(i=0;i<ntchr;i++){
13                 tchrs[i].subject=-1;
14                 tchrs[i].take=0;
15                 bzero(tchrs[i].day_lesson,sizeof(tchrs[0].day_lesson));
16                 wmemset((wchar_t*)tchrs[i].inclass,-1,
17                                 sizeof(tchrs[0].inclass)/sizeof(tchrs[0].inclass[0]));
18         }

gdb发现它越界了,这里我监视tchrs[0],注意在wmemset之后连day_lesson都变-1了:
15                      bzero(tchrs[i].day_lesson,sizeof(tchrs[0].day_lesson));
6: tchrs[0] = {
  name = '\0' <repeats 29 times>,
  subject = -1,
  take = 0,
  inclass = {0 <repeats 75 times>},
  day_lesson = {0, 0, 0, 0, 0, 0, 0}
}
(gdb)
16                      wmemset((wchar_t*)tchrs[i].inclass,-1,
6: tchrs[0] = {
  name = '\0' <repeats 29 times>,
  subject = -1,
  take = 0,
  inclass = {0 <repeats 75 times>},
  day_lesson = {0, 0, 0, 0, 0, 0, 0}
}
(gdb)
12              for(i=0;i<ntchr;i++){
6: tchrs[0] = {
  name = '\0' <repeats 29 times>,
  subject = -1,
  take = 0,
  inclass = {-1 <repeats 75 times>},
  day_lesson = {-1, -1, -1, -1, -1, -1, -1}
}
我没语言了,望高人指点

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
2 [报告]
发表于 2011-04-19 22:06 |只看该作者
  1. short inclass[MAX_WEEK_LESSON];
复制代码
改成
  1. wchar_t inclass[MAX_WEEK_LESSON];
复制代码
我看它还越界?

论坛徽章:
0
3 [报告]
发表于 2011-04-19 22:28 |只看该作者
回复 2# nketc


    为何这样就不越了?

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
4 [报告]
发表于 2011-04-19 22:40 |只看该作者
回复 3# jeung


    我没试,你试了吗?
如果没越的话,打印 sizeof (wchar_t)就明白了。

论坛徽章:
0
5 [报告]
发表于 2011-04-19 22:53 |只看该作者
本帖最后由 jeung 于 2011-04-19 22:56 编辑

回复 4# nketc


    发现了,原来是4,我一直以为是2。-1是0xFF...FF这样的吧

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
6 [报告]
发表于 2011-04-19 22:56 |只看该作者
印象中 Windows上确实是2,linux下gcc是4
有懂行高手知道标准咋规定的吗?

论坛徽章:
0
7 [报告]
发表于 2011-04-20 00:23 |只看该作者
回复 6# nketc


    C 标准的作风一向是“够大就好”,或者“XX 的表示范围是 XX 的一个子集”之类的

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
8 [报告]
发表于 2011-04-20 00:39 |只看该作者
回复  nketc


    C 标准的作风一向是“够大就好”,或者“XX 的表示范围是 XX 的一个子集”之类的:mr ...
变异老鼠 发表于 2011-04-20 00:23



    有印象,是这样,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP