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

发布于 2022-09-04 00:45:32 字数 1283 浏览 18 评论 0

#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;
 }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

殊姿 2022-09-11 00:45:32

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

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

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

流心雨 2022-09-11 00:45:32

main函数中数组name,code,grade定义有问题吧。c中定义数组必须是常量表达式(有些编译器扩展了,可以用变量),但是你的i和n都没有初始化。另外,max和min函数,你要先判断grade是否是NULL。

怪我闹别瞎闹 2022-09-11 00:45:32

数据大小如果要自己输入的话,是需要自己用malloc开辟空间的,不能这么直接定义

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文