首页 > 解决方案 > 在 C 中分配矩阵

问题描述

我目前正在尝试学习和理解 C,但我一直在理解指针。

对于分配,我们必须按如下方式分配矩阵:

int main(){

    int *mat = (int *)malloc(rows * cols * sizeof(int));
}

但是我不明白为什么这会比使用简单数组带来任何好处。

我将如何处理这个矩阵?它有什么优势?

标签: cmatrixmalloc

解决方案


它有什么优势?

这些之间有很多区别,但最大的区别之一是堆栈通常限制为 1MB 或 8MB。因此,如果您尝试声明该大小的数组,程序可能会崩溃。使用动态内存,分配数百 MB 或更多并不奇怪。

另一个很大的区别是您可以返回指向动态分配内存的指针。这不适用于数组。

// Dummy init function
void init(int * arr, size_t size) 
{
    for(int i=0; i<size; i++) arr[i] = i;
}

// Will compile, but the program will behave strange. Accessing a variable
// after it has gone out of scope causes undefined behavior.
int * returnArray() 
{
    int arr[10];
    init(arr, 10);
    return arr;
}

// Works perfectly;
int * returnMallocatedArray()
{
    int * arr = malloc(10*sizeof(*arr));
    init(arr, 10);
    return arr;
}    

我将如何处理这个矩阵?

就像一个常规数组一样。您可以使用类似mat[x+y*rows]或最适合您需要的任何内容访问元素 (x,y)。不过请记住,就编译器和运行时环境而言,唯一的就是mat指向一块内存的指针。由你来做映射。mat[x*cols+y]只要你不混合它们,做类似的事情也可以。


推荐阅读