通过引用传递unsigned char *

时间:2011-03-18 18:36:50

标签: objective-c c

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)。

谢谢

2 个答案:

答案 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超出范围。

相关问题