如何在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
。 你的意图是什么?