大神求教:C语言关于Appcrash?

freshmen2016 2016-12-20 05:30:21
新手一枚!帮忙看看下面代码,一开始是可以运行的,后来多运行几次后就运行不了,出现Appcrash错误

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef int ScoreType;
//学生结构体
typedef struct
{
int no;
ScoreType score[5];
float ave;
}Student;


//冒泡排序法
void BubbleSort(Student *a,int n)
{
int i,j,flag=1;
Student t;
for(i=1;i<n&&flag==1;i++)
{
flag=0;
for(j=0;j<n-i;j++)
{
if(a[j].ave<a[j+1].ave)
{
flag=1;
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}

//用直接选择排序法对数组a[]进行排序
void SelectSort(Student *a,int n)
{
int i,j,s;
Student t;
for(i=0;i<n-1;i++)
{
s=i;//设第i个数据元素关键字最小
for(j=i+1;j<n;j++)//寻找关键字最小的数据元素
if(a[j].ave>a[s].ave) s=j;//记住最小元素下标
if(s!=i)//当最小元素下标不为i时交换位置
{
t=a[i];
a[i]=a[s];
a[s]=t;
}
}
}

//成绩生成函数
void count(Student *a)
{
int i,j;
srand((unsigned)time(NULL));
//rand()产生的随机数是依靠一个初始值产生的
//加srand((unsigned)time(NULL))是改变这个初始值,使每次产生的随机数都不一样。;
for(i=0;i<45;i++)//第i个学生的各科成绩
{
for(j=0;j<5;j++)
a[i].score[j]=rand()%101;
}
}
//平均成绩计算函数
void aver(Student *a)
{
int i,j;
for(i=0;i<45;i++)
{
a[i].ave=0;
for(j=0;j<5;j++)
a[i].ave=a[i].ave+a[i].score[j];
a[i].ave=a[i].ave/5;
}
}

//学号
void num(Student *a)
{
int i;
for(i=0;i<45;i++)
a[i].no=2016120000+i+1;
}

void main(void)
{
Student *a,*b;
int i,j;
a=(Student *)calloc(45,sizeof(int));
b=(Student *)calloc(45,sizeof(int));
count(a);//数组赋值
num(a);
aver(a);
b=a;
printf("1班学生的未排名各科成绩\n");
printf("学号 score1 score2 score3 score4 score5\n");
for(i=0;i<45;i++)
{
printf("%d ",a[i].no+1*100);
for(j=0;j<5;j++)
printf("%5d ",a[i].score[j]);
printf("\n");
}
printf("\n");
SelectSort(a,45);
printf("1班学生的排名后成绩\n");
printf("直接选择排序:\n");
printf("学号 score1 score2 score3 score4 score5 aver\n");
for(i=0;i<45;i++)
{
printf("%d ",a[i].no+1*100);
for(j=0;j<5;j++)
printf("%5d ",a[i].score[j]);
printf("%f ",a[i].ave);
printf("\n");
}
BubbleSort(b,45);
printf("冒泡排序:\n");
printf("学号 score1 score2 score3 score4 score5 aver\n");
for(i=0;i<45;i++)
{
printf("%d ",b[i].no+1*100);
for(j=0;j<5;j++)
printf("%5d ",b[i].score[j]);
printf("%f ",b[i].ave);
printf("\n");
}
printf("\n");
free(a);
free(b);
}

问题签名:
问题事件名称: APPCRASH
应用程序名: text1.exe
应用程序版本: 0.0.0.0
应用程序时间戳: 5858f70a
故障模块名称: text1.exe
故障模块版本: 0.0.0.0
故障模块时间戳: 5858f70a
异常代码: c0000005
异常偏移: 00001326
OS 版本: 6.1.7601.2.1.0.256.1
区域设置 ID: 2052
其他信息 1: 27d4
其他信息 2: 27d435f80c6101af7b9f30166a35f47e
其他信息 3: 7c63
其他信息 4: 7c63c79d793cda6afe6b4908a62d2673

联机阅读隐私声明:
http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0804

如果无法获取联机隐私声明,请脱机阅读我们的隐私声明:
C:\Windows\system32\zh-CN\erofflps.txt
...全文
314 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
freshmen2016 2016-12-26
  • 打赏
  • 举报
回复
打错了!!!!!已经可以了 谢谢大神zhao4zhong1的帮忙!!!!!
赵4老师 2016-12-26
  • 打赏
  • 举报
回复
关于自己是否适合编程的很简单的测试: 在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案: A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感 A不适合编程(理由:打字准确度偏低、粗心大意) B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念) C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证) D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!) 如果想从A变成B的话,到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”
Saleayas 2016-12-24
  • 打赏
  • 举报
回复
为什么是 sizeof(int) 而不是sizeof(Student) 呢?
赵4老师 2016-12-23
  • 打赏
  • 举报
回复
检查输出对应的printf语句: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方,而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。 在莫名其妙改变值的变量上设置数据改变断点: To set a breakpoint when a variable changes value From the Edit menu, click Breakpoints. Click the Data tab of the Breakpoints dialog box. In the Expression text box, type the name of the variable. Click OK to set the breakpoint.
freshmen2016 2016-12-23
  • 打赏
  • 举报
回复
可是我是循环赋值的,其他的都正常,就只有两个出错
freshmen2016 2016-12-22
  • 打赏
  • 举报
回复
谢谢,还真是这样!!!但是又出现一个新的问题,我明明定义那两个数字为0-100的,但是输出后却大于100
赵4老师 2016-12-21
  • 打赏
  • 举报
回复
判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
赵4老师 2016-12-21
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
freshmen2016 2016-12-20
  • 打赏
  • 举报
回复
那应该要怎么改
阿源是少年 2016-12-20
  • 打赏
  • 举报
回复
05异常,目测是数组越界

16,548

社区成员

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

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

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