在C中分配矩阵

时间:2019-06-16 13:24:07

标签: c matrix malloc

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

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

int main(){

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

但是我不明白为什么与使用简单数组相比,这应该带来什么好处。

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

1 个答案:

答案 0 :(得分:3)

  

它有什么优势?

两者之间有很多区别,但是最大的区别之一是堆栈通常限制为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]之类的方法也可以。