传递给函数的数组上的scanf之后的分段错误

时间:2013-11-03 02:42:55

标签: c

我正在尝试完成一个研讨会,但是在if语句中调用inputVector函数后,我遇到了分段错误。我不知道为什么它会给我一个错误。编译时没有警告,对传递的数组的测试实际显示记录的内容。我正在运行OSX Maverick,但我也在linux系统上测试无济于事。如果有人可以对此发光,我会非常感激。

#include <stdio.h>
#include "matrix.h"

int main() {

    int row = 0 , col = 0, option = 0;
    int vector[9], result[9];
    int matrix[9][9];

    do{
        printf("Number of rows (0 to exit) ? ");
        scanf("%d", &row);
        if(row != 0) {
            printf("Number of columns          ? ");
            scanf("%d", &col);

            inputMatrix(row, col, matrix);

            printf("Pre (0) or Post (1) Multiply ? ");
            scanf("%d", &option);

            if(option == 0){
                inputVector(row, vector);
                printf("TESTING 1");
                preMulti(row, col, matrix, vector, result);
                printf("TESTING 2");
                display(col, result);
            }
            else if(option == 1){ 
                inputVector(col, vector);
                postMulti(row, col, matrix, vector, result);
                display(row, result);
            }

            return 0;       
        }// END IF
    } while( row != 0 );// End While

} // End Main

matrix.cpp

#include "matrix.h"
#include <stdio.h>

void inputMatrix(int row , int col, int matrix[][MAXCOL]) {
    for ( int i = 0; i < row; i++) {
        printf("Row %d ? ", i + 1);
        for ( int k = 0; k < col; k++)
            scanf("%d", &matrix[i][k]);
    }
}
void inputVector(int size, int vector[]) {
    printf("Vector? ");
    for(int i = 0; i < size; i++){
        scanf("%d" , &vector[i]);
        printf(" Recorded %d \n", vector[i]);
    }
    printf("TESTING 3");
}

void preMulti(int row, int col, int matrix[][MAXCOL], int vector[], int result[]) {
    for(int i = 0; i < col; i++ ) {
        result[i] = 0;
        for( int k = 0; k < row; i++) 
            result[i] += vector[k] * matrix[k][i];
    }
}
void postMulti(int row, int col, int matrix[][MAXCOL], int vector[], int result[]) {
    for( int i = 0; i < row; i++ ) {
        result[i] = 0;
        for( int k = 0; k < col; i++) 
            result[i] += vector[k] * matrix[i][k];
    }
}

void display(int size, int vector[]) {
    printf("Result: ");
    for ( int i = 0; i < size; i++)
        printf("%d ", vector[i]);
}

3 个答案:

答案 0 :(得分:1)

一些建议:

  • 将数组参数更改为指针。而不是int vec[],请使用int *vec。而不是int matrix[][MAXCOL],请使用int **matrix。这将更多的工作重新放在编译器上以管理内存布局。如果您碰巧更改了矩阵的大小,则无需更新所有原型中的固定边界。

  • 同样,在主例程中使用MAXCOLmatrix被声明为[9][9],但MAXCOL实际上等于9?

  • 使主例程和matrix.cpp在其参数中保持一致。使用inputVectorrow数字作为参数调用col,但它期望的参数是 向量中元素的数量。

答案 1 :(得分:1)

这是你的问题(导致你的段错误的问题,至少),这发生在几个地方,preMulti()postMulti()

for( int k = 0; k < row; i++) 

最后应为k++,而不是i++

答案 2 :(得分:1)

我确实使用过调试器,但我发现问题不在你的inputVector函数中,而是在这里(当模拟inputMatrix不会时,inputVector还有什么工作?):

void preMulti(int row, int col, int matrix[][MAXCOL], int vector[],int result[]){
        for(int i = 0; i < col; i++ ) {
            result[i] = 0;
            for( int k = 0; k < row; i++)              // i++ will cause SIGSEGV 
                result[i] += vector[k] * matrix[k][i]; // probably k++ ?
        }
    }