在赋值3.exe中的0x77ea15de处的未处理异常:0xC0000005:访问冲突读取位置0x33772c58

时间:2012-08-05 15:34:34

标签: c visual-studio-2010 geany

我不明白这个错误告诉我的是什么。当我运行程序时,它应该连续循环,直到用户输入N(不再为/退出)。我不明白发生了什么。在第一组输入之后,在提示用户“您想要处理新学生”之前,该程序会抛出该异常。

我使用Geany运行它(它没有给我任何错误定义它只是崩溃)和Visual Studio 2010。

有人可以帮忙吗?

void draw_bar_chart(int student_id[], int percentage[], int size)
{
    FILE *report;
    int i, j=0, min = 1000000, max = 0, min_pos, max_pos, l;
    char s[20];

    report = fopen("report2.txt", "a");
    fprintf(report, "\n******* BAR CHART (YEARLY TOTAL EXPENSES: YEARLY TOTAL INCOME) *******\n\n");      

    for (i = 0; i < size; i++)
    {
        fprintf(report, "%d%c", student_id[i], ' ');
        if (percentage[i] > 0){
            l = percentage[i]/10; //the lenght of the bar
            if ((percentage[i]%10) > 0)
                l++;
            for (j = 0; j < l; j++)
                s[j] = 'x';
            s[l+1] = '\0';
        } else {
            s[0] = '!';
            s[1] = '\0';
        }

        fprintf(report, "%-20s%6c%d%c\n", s, ' ', percentage[j], '%');

        if (percentage[j] >= 0)
        {
            if (percentage[j] < min)        
            {
                min = percentage[j];        
                min_pos = j;                
            }
            if (percentage[j] > max)    
            {
                max = percentage[j];        
                max_pos = j;                
            }
        }
    }


    fprintf(report, "***lowest percentage:  %d%c (student ID: %d)\n", min, '%', student_id[min_pos]);
    fprintf(report, "***highest percentage: %d%c (student ID: %d)\n", max, '%', student_id[max_pos]);

    fclose(report);

    }

1 个答案:

答案 0 :(得分:2)

我可以看到以下错误:

  1. 应该是s [l] ='\ 0',而不是s [l + 1] ='\ 0'。
  2. 在s中写入条形图后,j的所有出现都必须用i替换。
  3. min_pos和max_pos可能未初始化。
  4. 真正的问题是2号。你可以通过养成将变量放在尽可能小的范围内来避免这种错误。你刚写过这篇文章:

            ...
            fprintf(report, "%d%c", student_id[i], ' ');
    
            /* display percentage */
            {
              char s[20];
    
              if (percentage[i] > 0) {
                int l, j;
    
                l = percentage[i] / 10; // the length of the bar
                if ((percentage[i]%10) > 0)
                    l++;
                for (j = 0; j < l; j++)
                    s[j] = 'x';
                s[l] = '\0';
              }
              else {
                s[0] = '!';
                s[1] = '\0';
              }
    
              fprintf(report, "%-20s%6c%d%c\n", s, ' ', percentage[i], '%');
            }
    
            /* update min, max */
            if (percentage[i] >= 0) {
            ...
    

    然后代码会更容易理解,如果在/ * update ... * /之后错误地使用了j而不是i,编译器会给你一个错误。更好的方法是将百分比显示位置于一个单独的函数中。

    顺便说一下,格式字符串中不需要这些%c,只需直接输入字符即可。 %可以使用%%进行转义。