一个关于C的菜鸟问题,还请各位多多指教!:)

apple_boy 2002-01-27 12:50:34
本人是一个VC的初学者,想对两个结构体变量分别赋值为0至25,A至Z
但是,运行一看却是另外一个结果,百思不得其解,还请高手多多指教。
程序和运行结果如下(Windows2000+VC6):
#include<stdio.h>
main()
{
int i;
struct lx
{
int a;
char b;
};
struct lx c[25],d[25];
for (i=0;i<26;i++)
{
c[i].a=i;
d[i].a=i;
c[i].b='a'+i;
d[i].b='a'+i;
}
for (i=0;i<26;i++)
{
printf("%d ",c[i].a);
}
printf("\n");
for (i=0;i<26;i++)
{
printf("%d ",d[i].a);
}
printf("\n");
for (i=0;i<26;i++)
{
printf("%c ",c[i].b);
}
printf("\n");
for (i=0;i<26;i++)
{
printf("%c ",d[i].b);
}
printf("\n");
}

这里是运行结果:

25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
z b c d e f g h i j k l m n o p q r s t u v w x y z
a b c d e f g h i j k l m n o p q r s t u v w x y z

请注意:结果第一行的第一个数为“25”,结果第三行的第一个字母为“z“。
其它还算正常。
小弟我先行谢过。
E-mail:apple_sir@x263.net
...全文
102 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
skyenemyi 2002-01-27
  • 打赏
  • 举报
回复
foxmike先生好象没讲到关键的地方,为什么d[i].a可以得到"正确"(所希望)的结果呢?仅仅用radom解释吗?我想编写3段或4段数组可能会对程序运行的过程了解得更清晰.请指教.
zdq3201 2002-01-27
  • 打赏
  • 举报
回复
struct lx c[25],d[25];改为struct lx c[26],d[26];即可
baoch110 2002-01-27
  • 打赏
  • 举报
回复
同一楼上的观点
apple_boy 2002-01-27
  • 打赏
  • 举报
回复
多谢各位,再见。
foxmike 2002-01-27
  • 打赏
  • 举报
回复
你遇到的问题是c++中最隐蔽,也是最严重,常常被程序员所提到的问题---数组越界访问。
你定义了两个同类型,同大小的数组c,d。他们在程序的堆栈中分配空间。
所以可能的内存布局为。
内存的某一段:xxxx:xxxx d[0]
xxxx:xxxx d[1]
.
.
.
xxxx:xxxx d[24]
xxxx:xxxx c[0]
xxxx:xxxx c[1]
.
.
.
xxxx:xxxx c[24]
这样当你在程序中用循环计数25时就有可能通过对d[25]的访问修改了c[0]的值为c[0].a=25,
c[0].b='z',从而造成输出时与你想象的不一样的结果。
我把修改后的程序贴出来了,你可以单步跟踪调试。
#include<stdio.h>
#define MAX 25
void main()
{
int i;
struct lx
{
int a;
char b;
};
struct lx c[25],d[25];
for (i=0;i<MAX;i++)
{
c[i].a=i;
d[i].a=i;
c[i].b='a'+i;
d[i].b='a'+i;
}
for (i=0;i<MAX;i++)
{
printf("%d ",c[i].a);
}
printf("\n");
for (i=0;i<MAX;i++)
{
printf("%d ",d[i].a);
}
printf("\n");
for (i=0;i<MAX;i++)
{
printf("%c ",c[i].b);
}
printf("\n");
for (i=0;i<MAX;i++)
{
printf("%c ",d[i].b);
}
printf("\n");
}
sqhua 2002-01-27
  • 打赏
  • 举报
回复
数组的第一个下标应是:0,最后一个下标是数组容量 Count - 1

而你在这却写到了 i<26 ,如此一来就会是有 d[25] 的情况出现,算是超出了原先的内存区

为什么会是第一行的第一个就出错了呢,多半与数据在内存的存放顺序有关。
vctony 2002-01-27
  • 打赏
  • 举报
回复
try to declare the variable 'i' as the type 'short int',please!
本程序90%代码为作者原创 其余代码均为网络收集使用 版权归原作者所有 程序主要开发语言采用c# 其余的语言也有采用 软件没什么技术含量 本扫描器没有启发引擎 仅仅只有简单的未知文件分析模块 可以有一定的未知病毒判断能力 因为考虑到作者时间和精力等问题 本程序只采用了文本数据库作为病毒库和可信库 病毒库文件夹为bdk 可信库文件夹为kxk 欢迎有志之士继续在这基础上优化进行开发(前提是必须遵守gpl开源协议) 软件纯属原创 为本人自主作品 代码写的很垃圾 各位高手不喜勿喷 仅为思路学习 帮助更多小白学习编程思想 纯属无私奉献 多多指教 作者本人也是半屌子程序员一个 本软件有许多我已知的bug 没修复的原因是时间真的十分有限 都是小bug 还大牛们改改在把源码发出来让大家学习一下 开发本程序的初衷就是开源和学习 至于扫描效果和修复效果说实话还是比较差的 因为那个未知文件分析模块的dll我也没怎么写 至于那些dll都是简单的代码实现 考虑到某些国产“山寨”的产品 盗用别人的成果所以我就不发源码了 如果有开发软件的作者赏脸愿意合作的话我还是愿意改进的 软件采用c#(70%) c/c++(20%)易语言(10%)进行开发。。。。编译环境:vs2013 win8/64位 因为底层技术学的不咋的 病毒就是简单的文件删除和修复下注册表 没什么技术含量 至于我开发的自主云。。。 那个纯属就是是tcp协议的网络通讯然后在服务器上查找数据库 也没多大的技术含量 服务器是我买的vps 还是花了我不少钱的 服务器在北京 速度应该不会慢 预计半年内服务器的云不会消失 用本引擎diy杀软的朋友不必担心 如果需要我这菜鸟的技术支持等联系我QQ1620493525(加的时候注明一下谢谢了!) 如果有什么好玩的c语言/c#语言的项目拉上我打打酱油我也是相当开心的(易语言的项目就算了。。。) 本软件是我创建的第一个开源项目 转载注明作者的联系方式以及gpl开源协议 大牛们不喜勿喷。。。。仅为娱乐学习 重在学习 让大家都可以学到基础的编程知识和杀毒知识何乐而不为呢? 介于本人技术实在不怎么样。。。最近在开发一款脚本语言(用纯c) 这款脚本语言主要是为了解决windows方面的一些问题(特点:简单 高效 ) 可以用来迅速编写病毒专杀等工具(当然是我自己发明的语法。。。)是全英文的 但是肯定会比易语言简单,直接 直接进行c解释器效率应该不会很低 因为是低级的小脚本语言所以大家别见笑。。。如果有可以合作的志同道合的朋友可以联系我一起合作。。。。 另外本扫描器估计禁不起评测 查杀率略低了。。也没有启发 所以大家学习参考就行了。。。。 如果有哪个软件赏脸采用本引擎务必写上本人的版权(QQ等等

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧