Getting a SIGSEGV error in my C program

时间:2015-06-22 11:07:02

标签: c segmentation-fault dynamic-programming

This is my code for the problem添加nofollow属性。

我使用了动态编程方法,我的回答是正确的。但我得到一个SIGSEGV的运行时错误,可能是因为数组索引,我无法弄清楚如何以及在哪里?

如果你能弄清问题是什么,在哪里,请告诉我。

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

int dynp(int i, int j);

int v[] = {-1, 0, 1, 0};
int h[] = {0, 1, 0, -1};
int ROW, COL;

#define INF 1000000

int minOfTwo(int one, int two){
    if (one<two) {
        return one;
    }else{
        return two;
    }
}

int matrix[190][190];
int dp[190][190];

int main(int argc, const char * argv[]) {

    int t;

    scanf("%d", &t);

    int i,j;
    char s[190];
    while (t--) {

        scanf("%d %d", &ROW, &COL);

        for (i = 0; i<ROW; i++) {
            scanf("%s", s);
            for (j = 0; j<COL; j++) {
                matrix[i][j] = s[j] - 48;
                dp[i][j] = INF;
            }
        }


        for (i = 0; i<ROW; i++) {
            for (j = 0; j<COL; j++) {
                if (dp[i][j] == INF) {
                    if (matrix[i][j] == 1) {
                        dp[i][j] = 0;
                    }
                    else{
                        dp[i][j] = dynp(i, j);
                    }
                }
            }
        }

        for (i = 0; i<ROW; i++) {
            for (j = 0; j<COL; j++) {
                printf("%d ", dp[i][j]);
            }
            printf("\n");
        }
    }

    return 0;
}

int dynp(int i, int j)
{
    if (dp[i][j] != INF) {
        return dp[i][j];
    }
    else{
        if (matrix[i][j] == 1) {

            dp[i][j] = 0;
            return dp[i][j];
        }
        else{
            int k;
            for (k = 0; k<4; k++) {

                int newi = i + v[k], newj = j + h[k];

                if (newi < ROW && newj < COL && newi>=0 && newj>=0) {
                    dp[i][j] = minOfTwo(dp[i][j], 1 + dynp(newi, newj));
                }
            }
            return dp[i][j];
        }
    }
}

1 个答案:

答案 0 :(得分:1)

初看,在你的代码中,

    scanf("%s", s);
            for (j = 0; j<COL; j++) {
                matrix[i][j] = s[j] - 48;

看起来有问题。 s的长度小于COLs的值是未明确初始化的自动局部变量,您将访问已分配但未初始化的内存位置。

您应该将循环条件更改为

    scanf("%189s", s);                       //to avoid overflow
    int len = strlen(s);
            for (j = 0; (j<COL) && (j < len); j++, len--) {
                matrix[i][j] = s[j] - 48;