我目前正在尝试学习和理解C,但我一直坚持了解指针。
对于分配,我们必须分配如下矩阵:
int main(){
int *mat = (int *)malloc(rows * cols * sizeof(int));
}
但是我不明白为什么与使用简单数组相比,这应该带来什么好处。
我将如何处理此矩阵?它有什么优势?
答案 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]
之类的方法也可以。