c - 新手求教,这段代码为什么能通过编译但一运行就崩溃?

查看:129
本文介绍了c - 新手求教,这段代码为什么能通过编译但一运行就崩溃?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

#include <stdio.h>

 #define NUM 100 

 int max(int grade[], int n);
 int min(int grade[], int n);
 int main(void)
 {
    int i;
    int j;
    int n, x, y;
    char c;
    char code[n][NUM];
    char name[n][NUM];
    int grade[i];
    scanf("%d", &n);
    for (i = 0; i != n; i++) {
        for (j = 0; ((int)(c = getchar())) != 32; j++) {
            name[i][j] = c;
        }
        for (j = 0; ((int)(c = getchar())) != 32; j++) {
            code[i][j] = c;
        }

        scanf("%d", &grade[i]);
    }
    x = max(grade, n);
    y = min(grade, n);
    printf("%s %s\n%s %s\n", name[x], code[x],name[y], code[y]);
    return 0;
 }

 int max(int *grade, int const n)
 {
    int tmp;
    tmp = grade[0];
    int i = 1;
    int j = 1;
    while (i < n) {
        if (grade[i]  > tmp){
            tmp = grade[j];
            i ++;
            j ++;
        }
        else {
        i ++;
        j ++;
        }
    }
    return j;
 }

 int min(int *grade, int const n)
 {
    int tmp;
    tmp = grade[0];
    int i = 1;
    int j = 1;
    while (i < n) {
        if (grade[i]  < tmp){
            tmp = grade[j];
            i++;
            j++;
    }
        else {
        i ++;
        j ++;
    }
    }
    return j;
 }

解决方案

能编译不代表运行就没问题,ok?
目测有

  1. 第13行grade[i] 的i是多大?如果你compile-time 不能确定array size那最好用malloc/free。

  2. max/min返回的int一定比grade数组的size大,然后printf会做成非法内存访问,依执行环境不同,可能崩溃或打印垃圾

这篇关于c - 新手求教,这段代码为什么能通过编译但一运行就崩溃?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆