2017-12-07 7 views
0

私はC言語が新しく、関数内にダイナミック行列を割り当て、その中に値を入れてmainに戻り、次に出力する別の関数マトリックス。関数内で行列の値を変更したい場合、私は '&'を使う必要があることを知っています。しかし、私がマトリックスに印刷するためにメインに戻ると、 "セグメンテーションフォルト(コアダンプされた)"が表示されます。 はSomoneの私のコードで間違って何を教えてもらえます:関数内の行列を変更してメインで使用する

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


int checkSize(int); //checking matrix size 
void printMatrix(int **, int); //print matrix 
int createMatrix(int ***, int); //allocate matrix and puts values from user. 

int main() 
{ 
    int c; int **p=NULL; 
    printf("enter size of a matrix\n"); 
    c=getchar(); 
    if (checkSize(c)) 
    { 
    if((createMatrix(&p, c-'0'))!=0) 
     printMatrix(p, c-'0'); 
    } 
    return 0; 
} 

int checkSize(int c) 
{ 
    if (c>'9'||c<'0') 
    return 0; 
    return 1; 
} 

int createMatrix(int ***p, int n) 
{ 
    int m=n; 
    int k; 
    p=(int***)malloc(m*sizeof(int**)); 
    for (k=0; k<m; k++) 
    p[k]=(int**)malloc(m*sizeof(int*)); 
    printf("enter numbers\n"); 
    int *l; 
    int i; 
    int c; 
    for (i=0; i<m; i++) 
    { 
    k=n; 
    for (l=(int*)(p)+i;k>0;l++) 
    { 
     c=getchar(); 
     if (c==EOF) 
     { 
     printf("error EOF"); 
     return 0; 
     } 
     if (c>'9'||c<'0') 
     { 
     printf("error"); 
     return 0; 
     } 
     *l=c-'0'; 
     k--; 
    } 
    } 
    return 1; 
} 

void printMatrix(int **p, int n) 
{ 
    int k=n; 
    int* l; 
    int i; 
    int m=n; 
    for (i=0; i<k; i++) 
    { 
    m=n; 
    printf("\n"); 
    for (l=(int*)(p)+i;m>0;l++) 
    { 
     printf("%d ", *l); 
     m--; 
    } 
    } 
} 
+2

3つ星それは間違っている。 3人のプログラマーにならないでください。関数から行列を返すには、 'return'ステートメント**を記述します。引数リストにはありません。 –

+3

[多次元配列を正しく割り当てる](https://stackoverflow.com/questions/42094465/correctly-allocating-multi-dimensional-arrays) – Lundin

+1

また、ユーザーに索引付けの負担をかけることを検討してください。確かに 'matrix [i] [j]'は素晴らしいですが、その不揃いな割り当てを続けるのはかなりコストがかかります。 'matrix [i * width + j]':実際の2Dコンパクト配列と比較すると、1つの 'malloc()'、間接参照のレベルが1つ小さくなります。 – unwind

答えて

1

1つの問題は、あなたのメモリ割り当てです。間違った型の領域を割り当て、結果を正しく保存しません。それは

*p = malloc(m * sizeof(int*)); 

p[k]=(int**)malloc(m*sizeof(int*)); 

でなければなりません

p=(int***)malloc(m*sizeof(int**)); 

であることはここで

(*p)[k] = malloc(m * sizeof(int)); 

あるべき入力引数を直接操作しない別のアプローチであります:

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

int create(int ***m, int n) 
{ 
    int i, j; 

    // Create the matrix 
    int** p = malloc(n * sizeof *p); // ToDo: Check return value 
    for (i=0; i < n; ++i) 
    { 
     p[i] = malloc(n * sizeof **p); // ToDo: Check return value 
    } 

    for (i=0; i < n; ++i) 
    { 
     for (j=0; j < n; ++j) 
     { 
      *(p[i] + j) = 10 * i + j; 
     } 
    } 

    // Assign the matrix to the passed pointer 
    *m = p; 

    return 0; 
} 

void pm(int **m, int n) 
{ 
    int i, j; 
    for (i=0; i < n; ++i) 
    { 
     for (j=0; j < n; ++j) 
     { 
      printf("%d ", *(m[i] + j)); 
     } 
     printf("\n"); 
    } 
} 
int main(void) { 
    int** m; 
    create(&m, 5); 
    pm(m, 5); 

    // ToDo: Add code to free memory 

    return 0; 
} 

出力:malloc戻り値の明瞭度チェックのため

0 1 2 3 4 
10 11 12 13 14 
20 21 22 23 24 
30 31 32 33 34 
40 41 42 43 44 

ノートが省略されています。

関連する問題