C 当输出正确时,如何找出代码的错误?

C 当输出正确时,如何找出代码的错误?,c,runtime-error,C,Runtime Error,我是编程新手,我正在尝试在UVA online judge上解决929数字迷宫,我写了这段代码,它在代码块中运行良好,但当我在UVA online judge上提交这段代码时,它显示了运行时错误,我无法找出我做错了什么 #include <stdio.h> #include <stdlib.h> int min(int x, int y); int minCost(int **cost, int m, int n) { int i, j; int tc

我是编程新手,我正在尝试在UVA online judge上解决929数字迷宫,我写了这段代码,它在代码块中运行良好,但当我在UVA online judge上提交这段代码时,它显示了运行时错误,我无法找出我做错了什么

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

int min(int x, int y);

int minCost(int **cost, int m, int n) {
    int i, j;
    int tc[m][n];

    tc[0][0] = cost[0][0];

    for (i = 1; i < m; i++) {
        tc[i][0] = tc[i - 1][0] + cost[i][0];
    }
    for (j = 1; j < n; j++) {
        tc[0][j] = tc[0][j - 1] + cost[0][j];
    }
    for (i = 1; i < m; i++) {
        for (j = 1; j < n; j++) {
            tc[i][j] = min(tc[i - 1][j], tc[i][j - 1]) + cost[i][j];
        }
    }
    return tc[m - 1][n - 1];
}

int min(int x, int y) {
    if (x < y)
        return x;
    else
        return y;
}

int main() {
    int t, a, b, M, N, k;
    scanf("%d", &t);
    while (t--) {
        scanf("%d", &M);
        scanf("%d", &N);
        int **c = (int **)malloc(sizeof(int*) * M);
        for (k = 0; k < N; k++)
            *(c + k) = (int *)malloc(sizeof(int) * M);

        for (a = 0; a < M; a++) {
            for (b = 0; b < N; b++) {
                scanf("%d", &c[a][b]);
            }
        }
        int res = minCost(c, M, N);
        printf("%d", res);
    }
    return 0;
}
输出: 这应该是
N

这应该是一个问题

*(c+k) = (int*)malloc(sizeof(int)*M);
应该是

*(c+k) = malloc(sizeof(int)*N);  //N instead of M
一个问题是

*(c+k) = (int*)malloc(sizeof(int)*M);
应该是

*(c+k) = malloc(sizeof(int)*N);  //N instead of M

欢迎来到精彩的编程世界

仔细检查代码会发现此错误:

在循环测试和
malloc
参数中,初始化循环都不正确,应为:

    for (k = 0; k < M; k++) {
        c[k] = malloc(sizeof(int) * N);
    }
(k=0;k{ c[k]=malloc(sizeof(int)*N); }
如前所述,您的程序调用未定义的行为。它可能偶然产生预期的结果(在您的系统上观察到),但当您访问超出分配大小的阵列时(在uva online judge网站上观察到),它也可能产生运行时错误。

欢迎来到精彩的编程世界

仔细检查代码会发现此错误:

在循环测试和
malloc
参数中,初始化循环都不正确,应为:

    for (k = 0; k < M; k++) {
        c[k] = malloc(sizeof(int) * N);
    }
(k=0;k{ c[k]=malloc(sizeof(int)*N); }
如前所述,您的程序调用未定义的行为。它可能偶然产生预期的结果(在您的系统上观察到),但当您访问超出分配大小的阵列时(在uva online judge网站上观察到),它也可能产生运行时错误。

向我们显示问题参数我会担心所有调用
malloc()
而不调用
free()
在视野中。您的输出也不会被换行符分隔。当你修复了内存问题时,这将导致问题。@4386427:在线评委给出格式正确的输入;你可以略过错误处理,并摆脱它。告诉我们问题参数我会担心所有调用
malloc()
,而不调用
free()
。你的输出也不会被换行符分隔。当你修复了内存问题时,这将导致问题。@4386427:在线评委给出格式正确的输入;您可以略过错误处理,并摆脱它。感谢没有更多的运行时错误,但这次它说的是错误的答案。这段代码在代码块和ideone中仍然运行良好。它通过了给定的测试用例。@Mank99999:代码的输出都在一行中,答案之间没有空格,但应该在多行中,每行一个答案。@Mank99999:此初始化循环中还有一个错误。请看我的答案。谢谢没有更多的运行时错误,但这次它说的是错误的答案。这段代码在代码块和ideone中仍然运行良好。它通过了给定的测试用例。@Mank99999:代码的输出都在一行中,答案之间没有空格,但应该在多行中,每行一个答案。@Mank99999:此初始化循环中还有一个错误。看看我的答案。