【问题标题】:CS50 filter: reflect a bmp image along the horizontal axis using a reflect filterCS50 滤镜:使用反射滤镜沿水平轴反射 bmp 图像
【发布时间】:2020-03-04 11:08:52
【问题描述】:

在这个作业中,我必须编辑过滤图像的代码。其余代码已经提供并且是正确的。我的代码可以编译,但图像没有改变,我不知道为什么。

我仍然对内存分配感到困惑。我不太了解 malloc 和 calloc 之间的区别,也不知道这里哪个更可取。我已经包含了一个注释掉的代码行,以表明我已经尝试了两种方法并获得了相同的结果。如果有人可以在这种情况下解释 malloc 和 calloc 及其用途,我将不胜感激!

// Reflect image horizontally
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
    RGBTRIPLE(*tmp)[width] = malloc(height * width * sizeof(RGBTRIPLE));
    // RGBTRIPLE(*tmp)[width] = calloc(height, width * sizeof(RGBTRIPLE));
    if (tmp == NULL)
    {
        return;
    }
    for (int i = 0; i < height; i++)
    {
        // Copy integers from old image into new image
        for (int j = 0; j < width; j++)
        {
            tmp[i][j].rgbtRed = image[i][width - (j + 1)].rgbtRed;
            tmp[i][j].rgbtGreen = image[i][width - (j + 1)].rgbtGreen;
            tmp[i][j].rgbtBlue = image[i][width - (j + 1)].rgbtBlue;
        }
    }
    image = tmp;
    free(tmp);
    return;
}

【问题讨论】:

  • 除了一些程序员老兄对您的错误的解释之外,我建议尝试一种完全不同的方法。您可以尝试仅使用 1 个临时三元组来完成任务:RGBTRIPLE tmp; 而不是数组。您可以简单地交换三元组,而不是为结果创建副本并复制回初始数组。

标签: c cs50 reflect


【解决方案1】:

malloc 函数只分配内存。

calloc 函数分配内存“清除”内存(将所有字节设置为零)。

简而言之,calloc 等价于malloc,然后调用memset

说实话,几乎任何体面的书籍、教程或课程都应该包含这些信息。


关于你显示的代码,你不需要使用calloc,因为无论如何你都会覆盖所有的内存。

但是您的代码还有其他问题...

第一个是你忘记了在 C 中所有参数都是按值传递的,这意味着你在调用函数时使用的值是复制的,而在函数内部你所拥有的只是副本跟...共事。因此,例如,当您分配给image 时,您只分配给变量的本地副本。您在调用reflect 函数时使用的原始指针不会被赋值修改。要解决这个问题,您需要将内存从tmp复制image

另一个问题是你在分配给image 之后在tmp 上调用free。如果分配按您想要的方式工作(它没有,请参见上文),那么 both imagetmp 指针将在调用 free 时变为无效(因为两者指针是相同的并且指向相同的内存)。幸运的是,一旦你解决了复制问题,这个问题就没有实际意义了,你可以 free 指针 tmp 没有问题。

【讨论】:

  • @mich-ish 如果某个答案解决了您的问题,您可能会考虑接受和/或支持它。
猜你喜欢
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 2019-06-30
  • 2015-03-10
相关资源
最近更新 更多