【问题标题】:How to dynamically allocate a matrix in C?如何在C中动态分配矩阵?
【发布时间】:2012-03-11 15:46:03
【问题描述】:

我必须做这个练习:

用 C 语言做一个应用程序,它管理一个名为“M”的整数矩阵和一个名为“L”的整数列表。 M 是一个方阵 [nxn],其中 n 由用户动态选择。然后做这个功能:

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

第二个功能:

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

所以main() 必须是:

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

(所有分配都必须是动态的。)

我试过这个:

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

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

我能做什么?

【问题讨论】:

    标签: c dynamic matrix allocation


    【解决方案1】:

    在反序列化中,你应该返回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);
    

    【讨论】:

    • int 序列化(int** M,int n);不需要 int* 吗?
    • 好的,但结果是:给出矩阵[nxn]的维数:2 L[0]= 0L[1]= 1L[2]= 0L[3]= 0 5 6 0 0 为什么L总是0?
    【解决方案2】:

    您忘记在使用函数之前声明它们。添加

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

    在您致电main之前。

    还有,

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

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

    【讨论】:

    • 这两个函数需要*和**靠近int
    猜你喜欢
    • 2023-03-03
    • 2010-11-27
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2018-04-24
    • 2021-05-24
    • 2016-09-12
    相关资源
    最近更新 更多