我需要帮助理解这行代码动态创建一个数组?

时间:2015-11-16 05:23:46

标签: c pointers multidimensional-array malloc dynamic-memory-allocation

我开始使用malloc进行更多练习,尽管它正确执行的代码没有任何问题。

int *arr = (int *)malloc(x * y * sizeof(int));
int i, j, r;

for(i=0; i<x; i++){
    for(j=0; j<y; j++){
        r = 0 + rand() % 7;
        *(arr + i*y + j) = r; 
   //I dont understand the left hand portion of the above line.

//x and y are both 5000

我在网上找到它,在找到它之前,我曾尝试做同样的事情,但我猜我的语法错了。无论如何,我需要帮助理解旁边有评论的行

3 个答案:

答案 0 :(得分:6)

*(arr + i*y + j)正在尝试将值存储在由array[i][j]表示的数组元素中。

您从上一行中的r获得的值正被馈送到数组的数组[i] [j] th 元素。

arr找到数组的基本元素,将i*y个位置添加到数组的第(i + 1)行(索引计数从C开始为0),并在其中添加j会生成array[i][j]所在的确切列(第j + 1列)。

答案 1 :(得分:4)

第一行中分配的内存块用作二维矩阵。有关更多信息,请阅读:EXPOSE'd

这是一个图表:

row/column-major order

该图可能应该根据表达式中y的使用进行转置,但概念是相同的。每个框中的数字是线性偏移。如您所见,线性内存块的偏移量等于行索引乘以宽度加上列索引,或i*y + j

答案 2 :(得分:0)

通常你所做的是声明一个二维数组int arr[5000][5000];或等效的malloc代码。

在这种情况下所做的是声明一维数组,但将其用作二维数组。这种方式也是可行的,但它涉及不断检查位置的额外开销。