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--;
}
}
}
3つ星それは間違っている。 3人のプログラマーにならないでください。関数から行列を返すには、 'return'ステートメント**を記述します。引数リストにはありません。 –
[多次元配列を正しく割り当てる](https://stackoverflow.com/questions/42094465/correctly-allocating-multi-dimensional-arrays) – Lundin
また、ユーザーに索引付けの負担をかけることを検討してください。確かに 'matrix [i] [j]'は素晴らしいですが、その不揃いな割り当てを続けるのはかなりコストがかかります。 'matrix [i * width + j]':実際の2Dコンパクト配列と比較すると、1つの 'malloc()'、間接参照のレベルが1つ小さくなります。 – unwind