【问题标题】:CS50 filter RGBTRIPLE notationCS50 过滤器 RGBTRIPLE 表示法
【发布时间】:2020-08-27 16:02:04
【问题描述】:

问题更新:

在CS50的filter.c图像中定义为RGBTRIPLE(*image)[width] = calloc(height, width * sizeof(RGBTRIPLE));

这个符号在讲座中没有涉及,它令人困惑。我知道 calloc 正在为图像中的所有像素分配内存,但为什么使用 () 以及为什么不将其定义为 RGBTRIPLE image[height][width];

【问题讨论】:

  • 那为什么不 image[][] = calloc... 或 image =calloc... 或者你只能为指针分配内存?
  • image[] = calloc... 有效吗?索引管理和我可以访问的一样 image[i][[j]

标签: c pointers cs50


【解决方案1】:

image[height][width] 是一个固定变量,你不能给它分配内存。所以你需要一个指针,你可以分配内存。这就是“图像是指向'宽度' RGB 三元组数组的指针。”

calloc 调用分配了这些东西的高度数组,因此您可以使用 image[1] 获取下一行,使用 image[1][0] 获取第二行的第一个像素。

您问是否可以使用image =calloc(..RGBTRIPLE *image; 进行操作,是的,您可以这样做。但是不,您不能这样做 image[1][0] 因为编译器不知道行大小。这就是我的意思是您现在必须自己进行所有索引:image[1*width + 0] 是第二行的第一个像素。

【讨论】:

  • 不是 image[1][0] 也是第二行的第一个像素吗?所以真的没有额外的索引管理..啊,但你说你不能这样做,因为编译器不知道行大小。啊,现在我差不多明白了
  • 如果图像定义为RGBTRIPLE *image;,则不能使用image[1][0],因为编译器不知道行大小,但定义RGBTRIPLE(*image)[width]编译器确实 知道行大小。理解你吗?
  • 但是等等,为什么不直接定义 RGBTRIPLE image[height][width];那时根本不需要做calloc
  • @DCR,是的,很好,只是你可能会用完堆栈空间。甚至“可能”用于大图像。
  • "我可以通过&image吗?"使用image[height][width],它已成为驻留在堆栈上的 local 变量。你可以将它传递给你调用的另一个函数,但你不能返回它,因为一旦函数返回它就不再存在了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多