HI!我创建了一个函数来获取图像的灰度版本,但是我在尝试通过引用传递此函数生成的位的目标时遇到问题:
void grayscale (const unsigned char *source, unsigned char **dest, int data_size) {
for (int i=0; i < data_size; i= i+4) {
int gray = (source[i] + source[i+1] + source[i+2]) / 3;
gray = 255 - (int)cos(source[i])*255;
*dest[i] = (char)gray;
*dest[i + 1] = (char)gray;
*dest[i + 2] = (char)gray; //HERE AN ERROR
*dest[i + 3] = (char)255;
}
}
我用以下方法调用此函数:
grayscale(source, &destination, width*height*4 );
指针有问题吗? (我正在研究目标C并获得EXC_BAD_ACCESS)。
谢谢
答案 0 :(得分:5)
目前尚不清楚为什么要为dest
使用额外的间接级别,因为*dest
未被修改,但很可能需要执行以下操作 - 更改:
*dest[i] = (char)source[i];
*dest[i + 1] = (char)gray;
*dest[i + 2] = (char)gray;
*dest[i + 3] = (char)255;
为:
(*dest)[i] = (char)source[i];
(*dest)[i + 1] = (char)gray;
(*dest)[i + 2] = (char)gray;
(*dest)[i + 3] = (char)255;
原因是运算符优先级/关联性。
在没有看到调用代码的情况下也很难分辨,但我猜你可能需要改变:
(*dest)[i] = (char)source[i];
为:
(*dest)[i] = (char)source[i / 4];
如果您正在尝试将单个平面图像转换为RGBA。
答案 1 :(得分:3)
您的通话没问题,您有非法的内存访问权限。调试索引并检查传入的数组的大小,同时检查它是否仍在范围内。最有可能的是i + 2超出范围。