如何在C中动态分配矩阵?

我必须做这个练习:

在C中执行一个管理名为“M”的整数矩阵和一个名为“L”的整数列表的应用程序。 M是方形矩阵[nxn],其中n由用户动态选择。 然后执行此function:

  • 序列化:给定“M”矩阵,它返回具有n ^ 2个元素的列表L. 列表的元素是从第一个到第二个按行排序的M的元素。

第二个function:

  • 反序列化:给定具有n ^ 2个元素的列表L,它返回一个矩阵[nxn],其中L元素按列排序。

所以main()必须是:

  • 用户给出矩阵(n)的维度并用一些整数填充矩阵。
  • 然后调用serialize函数,打印序列化列表
  • 将值5添加到列表的每个值
  • 并调用反序列化函数
  • 并打印最后一个函数给出的矩阵。

所有分配必须是动态的。

我试过这个:

 #include  #include  int main(){ int n,i,j; printf("Give the dimension of matrix [nxn]: "); scanf("%d",&n); int **M; M = (int**)malloc(n*sizeof(int*)); for(i=0;i<n;i++){ M[i] = (int*)malloc(n*sizeof(int*)); } int *L = serialize(M,n); int size = n*n; for(i=0;i<size;i++){ printf("L[%d]= %d",i,L[i]); } for(i=0;i<size;i++){ L[i] = L[i]+5; } int **M2 = deserialize(L,n); for(i=0;i<n;i++){ printf("\n"); for(j=0;j<n;j++){ printf("%d",M2[i][j]); } } free(M); free(M2); free(L); } int serialize(int** M,int n){ int *L; int i,j; int size = n*n; L = (int*)malloc(size*sizeof(int)); for(i =0;i<size;i++) L[i]=M[i/size][(int)i%size]; return L; } int deserialize(int* L,int n){ int** M; int i,j; M = (int**)malloc(n*sizeof(int*)); for(i=0;i<n;i++){ M[i] = (int*)malloc(n*sizeof(int*)); } int size = n*n; for(i=0;i<size;i++) M[i/size][i%size]=L[i]; return **M; } 

编译器给我错误:

 Esercizio.c: In function 'main': Esercizio.c:22: warning: initialization makes pointer from integer without a cast Esercizio.c:31: warning: initialization makes pointer from integer without a cast Esercizio.c: At top level: Esercizio.c:43: error: conflicting types for 'serialize' Esercizio.c:22: error: previous implicit declaration of 'serialize' was here 

我能做什么?

在反序列化中,你应该返回M ,而不是**M

 int** deserialize(int* L,int n){ int** M; //.... return M; } 

此外,您需要在调用函数之前声明它们。 在main添加之前:

 int* serialize(int** M,int n); int** deserialize(int* L,int n); 

您在使用它们之前忘了声明它们的function。 加

 int serialize(int** M,int n); int deserialize(int* L,int n); 

在你打电话给main之前。

也,

 int **M2 = deserialize(L,n); 

M2是一个int** ,但deserialize返回一个int 。 你的意图是什么?