输入矩阵时出现分段错误

时间:2018-12-27 09:53:55

标签: c

因此,我必须创建一个程序,当用户插入表格时,该程序只发送表格边界即可。我使用了一个矩阵作为输入,但是当用户结束输入时,程序停止运行并且出现了分段错误。

#include <stdio.h>
#define VAL 50

void inputMatrice(int m[VAL][VAL], int *ncol, int *nrig);
void bordi(int m[][VAL], int ncol, int nrig, int v[], int *nv);
void outputVettore(int v[], int nv);

int main(){
    int m[VAL][VAL], v[VAL], *ncol, *nrig, nc, nr, nv;
    ncol = &nc;
    nrig = &nr;
    inputMatrice(m, ncol, nrig);
    nv=0;
    printf("ciao");
    bordi(m, nc, nr, v, &nv);
    outputVettore(v, nv);

}
/*Funzione per input matrici*/

void inputMatrice(int m[VAL][VAL], int *ncol, int *nrig){

    int i=0, j=0;
    printf("Inserisci il numero di righe: ");
    scanf("%d", nrig);
    printf("Inserisci il numero di colonne: ");
    scanf("%d", ncol);
    for(i=0;i<*nrig;i++){
        for(j=0;j<*ncol;j++){
            printf("Inserisci i valori della tabella nella posizione %d,%d: ", i+1, j+1);
            scanf("%d", &m[i][j]);
        }
    }
}

void bordi(int m[][VAL], int ncol, int nrig, int v[], int *nv){
    int i=0, j=0, k=0;
    for(j=1; j<ncol; j++){
        v[k]=m[i][j];
        *nv++;
    }
    for(i=1;i<nrig;i++){
        v[k] = m[i][j];
        *nv++;
    }
    for(j=(ncol-1); j>0; j++){
        v[k]=m[i][j];
        *nv++;
    }
    for(i=(nrig-1); j>0; i++){
        v[k]=m[i][j];
        *nv++;
    }
}
void outputVettore(int v[], int nv){
    int i=0;
    for(i=0;i<nv;i++){
        printf("|%d|", v[i]);
    }

}

抱歉,意大利语的输出和英语不好。

3 个答案:

答案 0 :(得分:0)

程序*nv++;中的行会增加指针,这在逻辑上是完全错误的,请尝试增加value。 也就是说,尝试:- (*nv)++;

答案 1 :(得分:0)

错误发生在 void bordi(int m[][VAL], int ncol, int nrig, int v[], int *nv)功能。

修复第3和第4 for个循环条件。您在第一个循环中将j递增了,但没有递减或将其设置为0,因此您会遇到无限循环。

答案 2 :(得分:0)

问题出在功能bordi()中。看一下这个for循环:

for(j=(ncol-1); j>0; j++){
    v[k]=m[i][j];
    *nv++;
}

循环控制变量jncol-1初始化并检查条件j>0。执行循环语句后,j将增加1j++)。因此循环条件j>0将始终true [直到j溢出] ,经过几次迭代,您的程序开始访问数组m的无效值(m[i][j])导致分段错误。

要解决此问题,请在循环中将j++替换为j--

下一个for循环中也存在相同的问题,但方式略有不同:

for(i=(nrig-1); j>0; i++){
    v[k]=m[i][j];
    *nv++;
}

在这里,在循环条件下,您正在使用变量j
您需要在此for循环中进行两次更改。

for(i=(nrig-1); i>0; i--){
                ^^   ^^