Согласно документации это возвращает массив C из пяти символьных указателей. Но как это может сделать это? поскольку тип аргумента unsigned char **
, он может возвращать только массив символов, но не массив указателей на символы.
Неправильно. unsigned char **
- это указатель на хотя бы один указатель на хотя бы один unsigned char
.
Итак, вы должны передать указатель на массив указателей, то есть указатель на массив массивов. Примерно так:
unsigned char *buffers[5];
[bitmapImageRep getBitmapDataPlanes:buffers];
Если изображение является плоским, то каждый элемент buffers
будет указателем на плоскость компонента; для RGB buffers[0]
- красная плоскость, buffers[1]
- зеленая плоскость, buffers[2]
- синяя плоскость, buffers[3]
- альфа-плоскость. Конечно, каждая плоскость - это буфер, содержащий значения для этого канала (как unsigned char
с).
Если изображение не является плоским, то вы получите только один элемент - данные RGBA.
Особо следует отметить это предложение из документации, на которую вы ссылались:
Если самолетов меньше пяти, остальные указатели будут установлены на NULL
.
Это означает, что код, который вы показываете, содержит переполнение буфера: вы передаете указатель на хранилище для одного указателя, но представитель изображения ожидает хранилища не менее пяти, и это даст вам пять указателей и / или NULL
с, так что он будет записывать за пределы того места, которое вы ему дали. Это разобьет ваш стек, приведет к сбою приложения или к обоим.