2016-05-16 7 views
-4

私はCの新機能ですが、なぜこのエラーが出るのかわかりません。私はセグメンテーションフォールトが私の範囲外に行くことが原因であることを知っていますが、私はどこにいるのかわかりません。 私のコードでセグメンテーションフォールト

#include <stdlib.h> 
#include <stdio.h> 
int** totalMatrix(int numRows, int numCols){ 

    int** firstMatrix; 
    int** secondMatrix; 
    int** sumMatrix; 
    int row, col; 

    printf("Enter Matrix A\n"); 

    firstMatrix = (int**)malloc(numRows * sizeof(int*)); 
    for(row = 0; row < numRows; row++){ 
     firstMatrix[row] = (int*)malloc(numCols * sizeof(int)); 
    } 

    for(row = 0; row < numRows; row++){ 
     for(col = 0; col < numCols; col++){ 
      scanf("%d", &firstMatrix[row][col]); 
     } 
    } 
    printf("Enter Matrix B\n"); 

    secondMatrix = (int**)malloc(numRows * sizeof(int*)); 
    for(row = 0; row < numRows; row++){ 
     secondMatrix[row] = (int*)malloc(numCols * sizeof(int)); 
    } 

    for(row = 0; row < numRows; row++){ 
     for(col = 0; col < numCols; col++){ 
      scanf("%d", &secondMatrix[row][col]); 
     } 
    } 
    printf("A + B =\n"); 

    sumMatrix = (int**)malloc(numRows * sizeof(int*)); 
    for(row = 0; row < numRows; ++row){ 
     for(col = 0; col < numCols; ++col){ 
      sumMatrix[row][col] = firstMatrix[row][col] + secondMatrix[row][col]; 
      printf("%d ", sumMatrix[row][col]); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 


void delete_matrix(int numRows, int** matrix){ 
    int row; 
    for(row = 0 ; row < numRows; ++row){ 
     free(matrix[row]); 
    } 
    free(matrix); 
} 

int main(){ 

    int numRows, numCols; 

    int** matrix; 

    printf("Please Enter the number of rows: "); 
    scanf("%d", &numRows); 

    printf("Please Enter the number of cols: "); 
    scanf("%d", &numCols); 

    matrix = totalMatrix(numRows, numCols); 

    delete_matrix(numRows, matrix); 
    return 0; 
} 

It works but crashes

事前に感謝

This is my code

+1

ようこそStackOverflow!関連するコードを質問に貼り付ける必要があります。また、今は無駄に思えるかもしれませんが、実際にはデバッガの使い方を学ぶのに最適なタイミングです。 – AndyG

+2

また、関連性のない言語にタグを付けないでください。 –

+0

ペーストビンのリンクです。 – Motosuwa

答えて

0

firstMatrixsecondMatrixの場合、正しくはmallocの外寸がループ内にあり、内寸がすべてmallocです。

何らかの理由により、sumMatrixの場合は、外寸がmallocになります。それが格納しているポインタはすべて初期化されていませんが、逆参照しています。

私が「正しく」言うとき、私はゆるやかな用語を使用します:これはロット不必要な動的割り当てです! 1つの大きな割り当てを推奨します。 1つのメモリブロックに2Dインデックスをマップできます。それもこのバグを回避しています。

さらに、関数は常に0を返します。それはヌルポインタです。したがって、mainでそれを使用して、それをdelete_matrixに渡すと、意味がありません。私は戻り値を完全に取り除き、totalMatrix(実際にそれを行う必要があるので、totalMatrixの下部に電話を移動させます)3つの回—を各行に1回ずつ表示します。

+0

ああ、私は完全にそれを逃した。私はただそれを修正した。しかし、それはまだ持続する。私はあなたができることを知りませんでした、私は感謝を調べなければならないでしょう! – Motosuwa

+0

@モトスワ:別のバグを見つけました。 –

+0

ええ、私はそれが私が投稿する前に動作していない理由を把握しようとしていた。私は名前が矛盾している理由のいくつかのコードをつかんだ。私は今修正しようとします。ありがとう! – Motosuwa

関連する問題