【问题标题】:Dynamic matrix with function c [closed]具有函数 c 的动态矩阵
【发布时间】:2013-01-06 22:48:25
【问题描述】:

我必须使用 C 中的函数制作一个动态矩阵。我做了这个:

#include <stdio.h>
#include <malloc.h>
int r=3;
int c=3;
int i;
void matrix(int *** m)
{
    m=(int***)malloc(r*sizeof(int*));
    for(i=0; i<c;i++)
    {
       m[i]=(int**)malloc(c*sizeof(int));
    }
};
int main()
{
    int **mat;
    matrix(&mat);
    mat[0][0]=1;
    mat[0][1]=2;
    printf("%d %d", mat[0][0], mat[0][1]);
    system("pause");
}

但它会崩溃说有问题。在哪里? :(

【问题讨论】:

  • 问题出在代码中...
  • 你不能在 C 中转换 malloc 的结果。
  • 您应该始终在启用警告的情况下编译并注意所有警告。
  • 必须链接到Three Star Programmer
  • 欢迎使用 Stack Overflow。请注意此处的其他 cmets 并阅读 FAQ 以了解有关好问题的更多信息。请注意,matrix() 函数后面的分号是不需要的。你不应该使用&lt;malloc.h&gt;;标准标题是&lt;stdlib.h&gt;。您不应该使用单字母全局变量;全局变量需要有意义的名称。您不应该使用全局变量i 作为循环控制变量。您应该将数组大小传递给matrix() 函数。您可能应该从函数中返回分配的矩阵,而不是传入要设置的指针。

标签: c function dynamic matrix malloc


【解决方案1】:

当您将&amp;mat 传递给matrix 时,***m 表示m 拥有mat 的位置。即mat = *m。考虑到这一点,您必须按以下方式更改 malloc。

void matrix(int *** m)
{
    //m=(int***)malloc(r*sizeof(int*));
    *m = (int **)malloc(r*sizeof(int*));
    for(i=0; i<c;i++)
    {
       //m[i]=(int**)malloc(c*sizeof(int));
       (*m)[i]=(int*)malloc(c*sizeof(int)); // it was *m[i]=..
    }
}

EDIT修正了一个错误

编辑正如 Johnathan 在 cmets 中提到的,实现此功能的更好方法如下。

int **matrix(int rows, int cols)
{
    int i, j;
    int **mat = (int **)malloc(rows * sizeof(int *));
    for (i = 0; i < rows; i++) {
       mat[i] = (int *)malloc(cols * sizeof(int));
       // If you prefer to initialize values, uncomment the following line
       // for(j = 0; j < cols; j++) mat[i][j] = 0;
    }
    return mat;
}

【讨论】:

  • (*m)[i], *m[i]*(m[i])
  • 或者,更好的(两星)设计使用:int **matrix(int rows, int cols) { int **m = ...; return m; }。减少一级间接,减少两个全局变量。更好的设计使用结构来保存矩阵,包括维度。这允许错误检查原始int ** 没有。
  • @JonathanLeffler 我会做这样的事情。但我试图尽可能接近他的代码。这可能是他正在处理的家庭作业。
  • 与问题保持密切联系很好......但在可用时指出更好的替代方案也是一个好主意。你已经得到了我的支持。
  • @JonathanLeffler 感谢您的反馈。更新了两星功能。
猜你喜欢
  • 2019-05-22
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
  • 2018-01-27
  • 2023-03-03
  • 2014-12-04
相关资源
最近更新 更多