C 在函数中更改矩阵并在主函数中使用

C 在函数中更改矩阵并在主函数中使用,c,pointers,dynamic-allocation,C,Pointers,Dynamic Allocation,我不熟悉c语言,我有一个任务,在函数中分配一个动态矩阵,将值放入其中,返回main,然后调用另一个打印该矩阵的函数。我知道如果我想改变函数中的矩阵值,我需要使用“&”。但当我返回main以打印矩阵时,我得到了“分段错误(堆芯转储)”。 有人能告诉我我的代码有什么问题吗 #include <stdio.h> #include <stdlib.h> int checkSize(int); //checking matrix size void printMatrix(in

我不熟悉c语言,我有一个任务,在函数中分配一个动态矩阵,将值放入其中,返回main,然后调用另一个打印该矩阵的函数。我知道如果我想改变函数中的矩阵值,我需要使用“&”。但当我返回main以打印矩阵时,我得到了“分段错误(堆芯转储)”。 有人能告诉我我的代码有什么问题吗

#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--;
    }
  }
}
#包括
#包括
整数检查大小(int)//检查矩阵大小
无效打印矩阵(int**,int)//打印矩阵
int-createMatrix(int***,int)//分配矩阵并从用户处输入值。
int main()
{
int c;int**p=NULL;
printf(“输入矩阵的大小\n”);
c=getchar();
如果(检查尺寸(c))
{
if((createMatrix(&p,c-'0'))!=0)
打印矩阵(p,c-'0');
}
返回0;
}
整数检查大小(整数c)
{

如果(c>'9'| | c一个问题是内存分配。您为错误的类型分配了空间,并且错误地保存了结果。这就是

p=(int***)malloc(m*sizeof(int**));
应该是

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

应该是

*p = 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;
}

<强>注< <强> >检查<代码> MalOC/省略返回值。< /P>三颗星星。这是错误的。不要成为三星程序员。如果要从函数返回矩阵,**把它放在<代码>返回< /COD>语句**。不在参数列表中。也考虑将索引的负担放在用户身上,呵呵。当然

matrix[i][j]
很不错,但是进行这种不规则的分配是非常昂贵的。与实际的2D紧凑型阵列相比,使用
matrix[i*width+j]
:一个
malloc()
,一级间接寻址更少。@unwind没有必要使用这种“损坏的”从C99开始的数组。请参阅上面发布的链接,了解如何在仍然使用
[i][j]
索引的情况下分配实际的2D数组。