【问题标题】:I need help understanding this line of code dynamically creating an array?我需要帮助理解这行代码动态创建数组吗?
【发布时间】:2016-02-17 04:11:27
【问题描述】:

我开始对 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

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

【问题讨论】:

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


    【解决方案1】:

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

    您在上一行中从 r 收到的值被馈送到数组的 array[i][j]th 元素。

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

    【讨论】:

    • 您好,感谢您的回复。我猜这就是它所做的,但我被抛弃了,因为 y = 5000 所以如果我循环到 200,200*y 是 1M,我不明白代码是否就是这样获取索引的。能不能详细解释一下
    • @Chibuikem - x 和 y 是数组维度。将其视为被声明为 array[5000][5000] 的数组,其中 x 和 y 都指 5000。所以,现在 i 乘以 5000 指的是第 i 个行位置。由于乘以 5000(y),休息 (i-1) 位置已被跳过。并且,将 j 添加到它,将其移动到 ijth 索引。
    【解决方案2】:

    第一行中分配的内存块被用作二维矩阵。欲了解更多信息,请阅读:row/column-major order

    这是一个图表:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-08
        • 1970-01-01
        • 1970-01-01
        • 2011-03-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多