C:CS50x - 第 4 周 - 筛选更多:2D 数组大小语法

问题描述 投票:0回答:1

我无法理解二维数组索引的语法。 (*图片)[宽度]

下面是 ProblemSet Filter-more, Week 3, cs50x 的部分分发 C 代码。代码不是我写的,是cs50写的。我正在通过cs50自学并尝试阅读和理解脚本。

这是我理解这段代码的方式:第二段定义了一个名为 image 的 RGBTRIPLE 二维数组,大小为 [width]。每个图像[i]代表图片的一条垂直线。

但是在接下来的几段中,这个数组的迭代条件是[i]< [height]。在给定的注释中,每个图像 [i] 作为水平行。

我无法理解这部分。我相信如果 [height] 是一个大于 [width] 的数字(上下文中没有说明),则会导致分段错误。例如:如果高度 = 7,宽度 = 4。代码定义了 image[4],那么下面的行可能会迭代到 image[5]、image[6]…

这是他们代码中的错误吗?还是我没有正确理解语法或上下文?

    // Get image's dimensions
    int height = abs(bi.biHeight);
    int width = bi.biWidth;

    // Allocate memory for image
    RGBTRIPLE(*image)[width] = calloc(height, width * sizeof(RGBTRIPLE));
    if (image == NULL)
    {
        printf("Not enough memory to store image.\n");
        fclose(outptr);
        fclose(inptr);
        return 7;
    }

    // Determine padding for scanlines
    int padding = (4 - (width * sizeof(RGBTRIPLE)) % 4) % 4;

    // Iterate over infile's scanlines
    for (int i = 0; i < height; i++)
    {
        // Read row into pixel array
        fread(image[i], sizeof(RGBTRIPLE), width, inptr);

        // Skip over padding
        fseek(inptr, padding, SEEK_CUR);
    }

我问了cs50的辅助ai ddb,他回答说这段代码如我所料可能会出错。但我仍然在努力确定并期待加入社区讨论。 (我并不是想吹毛求疵。我是代码学习的新手,非常感谢cs50课程和他们愿意分享。我只是自己无法找出正确答案。)

arrays c cs50
1个回答
0
投票

image
是指向数组(包含 width 个元素)的
指针

为此指针分配

height
元素。这会为您提供一个
height
元素数组,其中每个元素都是
width
元素数组。

这是一种动态的创造方式

RGBTRIPLE image[height][width];

较大的图像尺寸需要这种动态分配,其中普通数组太大,无法容纳为局部变量分配的空间。

© www.soinside.com 2019 - 2024. All rights reserved.