关于C中的多维数组,我已经看过几十个关于"我的代码有什么问题"的问题.出于某种原因,人们似乎无法理解这里发生的事情,所以我决定回答这个问题作为对其他人的参考:
如何在C中正确设置,访问和释放多维数组?
如果其他人有有用的建议,请随时发布!
当性能对应用程序至关重要时,应该考虑是否在堆栈上声明一个数组而不是堆?请允许我概述为什么会出现这个问题.
由于C/C++中的数组不是对象并且衰减为指针,因此编译器使用提供的索引来执行指针算法来访问元素.我的理解是,当经过第一个维度时,此过程与静态声明的数组不同,是动态声明的数组.
如果我要在堆栈上声明一个数组,如下所示;
int array[2][3] = { 0, 1, 2, 3, 4, 5 }
//In memory { row1 } { row2 }
Run Code Online (Sandbox Code Playgroud)
该数组将以行主格式存储在内存中,因为它存储在连续的内存块中.这意味着当我尝试访问数组中的元素时,编译器必须执行一些加法和乘法才能确定正确的位置.
所以如果我要做以下事情
int x = array[1][2]; // x = 5
Run Code Online (Sandbox Code Playgroud)
然后编译器将使用以下公式:
i =行索引j =列索引n =单行的大小(此处n = 2)
array =指向第一个元素的指针
*(array + (i*n) + j)
*(array + (1*2) + 2)
Run Code Online (Sandbox Code Playgroud)
这意味着如果我循环遍历此数组以访问其每个元素,则通过索引对每个访问执行额外的乘法步骤.
现在,在堆上声明的数组中,范例是不同的,需要一个多阶段解决方案.注意:我也可以在这里使用C++ new运算符,但我相信数据的表示方式没有区别.
int ** array;
int rowSize = 2;
// Create a 2 by 3 2d array on the heap
array = malloc(2 * …Run Code Online (Sandbox Code Playgroud) 在这两种情况下,访问数组或内存分配会产生什么影响:
1.
int **arr;
arr = malloc( sizeof(int) * row * column );
Run Code Online (Sandbox Code Playgroud)
2.
int **arr;
arr = malloc( sizeof(*arr) * row);
for(i=0; i<row; i++)
arr[i] = malloc( sizeof( **arr) * column));
Run Code Online (Sandbox Code Playgroud) 这是我的老师向我们展示的示例代码"如何在C中动态分配数组?".但我不完全理解这一点.这是代码:
int k;
int** test;
printf("Enter a value for k: ");
scanf("%d", &k);
test = (int **)malloc(k * sizeof(int*));
for (i = 0; i < k; i++) {
test[i] = (int*)malloc(k * sizeof(int)); //Initialize all the values
}
Run Code Online (Sandbox Code Playgroud)
我想在C中,定义一个你必须把它放在[]名字后面的数组,那究竟是什么int** test; 它不仅仅是一个指针指针吗?这malloc()条线也让我很困惑.....