怎么解决无效内存引用 C语言

经常出现无效内存引用,不知道什么原因(注,学校改题的编译器可能是很旧的版本),想请高手说一下一般是出了什么问题
高手帮我看下下面这个题目,怎么解决无效内存引用的问题
大家参加了期末考试,成绩出来后老师要对 n 个学生进行成绩汇总和排序。要求程序按成绩降序进行排序。在排序过程中对于成绩相同的学生,要按照输入数据的顺序进行排列。例如:有5名学生的成绩:
zhang1,90
zhang2,91
zhang3,99
zhang4,91
zhang5,98
则排序结果应该为:
zhang3,99
zhang5,98
zhang2,91
zhang4,91
zhang1,90
请注意例题中“zhang2”和“zhang4”的排列顺序。
输入:
第一行为将要输入的学生数量n
从第二行起后面连续 n 行数据,每行为一名学生的姓名(长度不超过20个字符,不包括空格),考试成绩(int)
输出:
排序后的结果。每行为一名学生的姓名和成绩。

以下是我程序
main()
{
char name[10][20],t[20];
int mark[10],i,j,n,k,h,a[10],max;
scanf ("%d",&n);
for (i = 0;i < n;i++)
{
for (j = 0;;j++)
{
scanf ("%c",&name[i][j]);
if (name[i][j] == ',') break;
}
a[i] = j;
scanf ("%d",&mark[i]);
}
for (i = 0;i < n -1;i++)
{
max = 0;
k = 0;
for (j = i ;j < n;j++)
{
if (mark[j] > max)
{
max = mark[j];
k=j;
}
}
if (k!=i)
{
strcpy (t,name[k]);
h = mark[k];
for (j = k;j>i;j--)
{
strcpy (name[j],name[j-1]);
mark[j] = mark[j-1];
}
strcpy (name[i],t);
mark[i] = h;
}
}
for (i = 0;i < n;i++)
{
for (j = 1;j <= a[i];j++)
{
printf ("%c",name[i][j]);
}
printf ("%d\n",mark[i]);
}
getch();
}
谢谢了!
分可能不够,你需要我追加多少可以说话哈!

    无效内存引用是程序运行时的错误(runtime error),一般都和内存访问和操作有关系。

    要解决这个错误,就需要仔细检查程序是否出现了错误的内存访问或者操作,需要一步一步仔细debug程序,错误的原因往往是一字之差。

    常见无效内存引用错误的原因:

    1、数组越界
    2、内存未分配成功,却使用
    3、内存分配成功,但未初始化
    4、使用已经释放了的内存
    5、操作空指针,野指针


温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-05-18
#include "stdio.h"
#include "string.h"

void main()
{
char name[10][20];
int mark[10],i,j,n,a[10];
printf("输入学生人数:");
scanf ("%d",&n);
for (i = 0;i < n;i++)
{
printf("输入第%d个学生的姓名和成绩:",i+1);
getchar();
for (j = 0;;j++)
{
scanf ("%c",&name[i][j]);
if (name[i][j] == ',')
{//这里稍微改一下,保存成字符串,就不会出现内存问题了
//出内存问题是因为后面的strcpy()函数需要的参数是字符串。
name[i][j] = '\0';
break;
}
}
//a[i] = j;//改成字符串,这里就不惜要保存姓名长度了
scanf ("%d",&mark[i]);
}
//下面的排序过程,我做了些变动
for(i=0;i<n;i++)//初始化,用来保存下标
a[i]=i;

for (i = 0;i < n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
int temp;

if(mark[j]<mark[j+1])
{//交换成绩
temp=mark[j];
mark[j]=mark[j+1];
mark[j+1]=temp;
//交换名字的下标
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}

for (i=0; i<n; i++)
{//这里输出%s就可以了
//名字的下标值用a[i]的值
printf ("%s ",name[a[i]]);
printf ("%d\n",mark[i]);
}
getchar();
}本回答被提问者采纳
相似回答