我无法理解二维数组索引的语法。 (*图片)[宽度]
下面是 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课程和他们愿意分享。我只是自己无法找出正确答案。)
image
是指向数组(包含 width
个元素)的 指针。
为此指针分配
height
元素。这会为您提供一个 height
元素数组,其中每个元素都是 width
元素数组。
这是一种动态的创造方式
RGBTRIPLE image[height][width];
较大的图像尺寸需要这种动态分配,其中普通数组太大,无法容纳为局部变量分配的空间。