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

发布于 2022-10-15 09:07:39 字数 2596 浏览 23 评论 0

一个结构:
  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}
}
我没语言了,望高人指点

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

瘫痪情歌 2022-10-22 09:07:39
  1. short inclass[MAX_WEEK_LESSON];

复制代码改成

  1. wchar_t inclass[MAX_WEEK_LESSON];

复制代码我看它还越界?

噩梦成真你也成魔 2022-10-22 09:07:39

回复 2# nketc

    为何这样就不越了?

情未る 2022-10-22 09:07:39

回复 3# jeung

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

时光暖心i 2022-10-22 09:07:39

本帖最后由 jeung 于 2011-04-19 22:56 编辑

回复 4# nketc

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

随遇而安 2022-10-22 09:07:39

印象中 Windows上确实是2,linux下gcc是4
有懂行高手知道标准咋规定的吗?

哥,最终变帅啦 2022-10-22 09:07:39

回复 6# nketc

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

薄情伤 2022-10-22 09:07:39

回复  nketc

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

    有印象,是这样,

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文