在此作业中,我必须编辑过滤图像的代码段。其余代码已经提供并且是正确的。我的代码可以编译,但是图像没有变化,我不知道为什么。
我仍然对内存分配感到困惑。我不太了解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;
}
答案 0 :(得分:0)
malloc
函数仅分配内存。
calloc
函数分配内存 并“清除”内存(将所有字节设置为零)。
简而言之,calloc
等效于malloc
,然后调用memset
。
说实话,几乎任何体面的书籍,教程或课程都应该包含此信息。
关于显示的代码,您无需使用calloc
,因为无论如何您将覆盖所有内存。
但是您的代码还有其他问题...
第一个是您忘了C语言中的所有参数都是按值传递的,这意味着调用该函数时使用的值是 copyed ,而在函数内部您所拥有的就是该副本跟...共事。因此,例如,当您分配给image
时,则仅分配给变量的本地副本。您在调用reflect
函数时使用的原始指针将不会被分配修改。要解决此问题,您需要将内存从tmp
复制到image
。
另一个问题是分配给free
后,您在tmp
上调用image
。如果赋值按您希望的方式工作(不起作用,请参见上文),则两者 image
和tmp
指针在调用{{ 1}}(因为两个指针相同并指向相同的内存)。幸运的是,一旦解决了复制问题,这个问题就不存在了,可以free
指针free
来解决问题。