Код: Выделить всё
ushort *LibRaw::ljpeg_row(int jrow, struct jhead *jh)
{
ushort mark = 0, *row[3];
// Irrelevant code here...
FORC3 row[c] = jh->row + jh->wide * jh->clrs * ((jrow + c) & 1);
// Irrelevant code here...
return row[2];
}
void LibRaw::canon_sraw_load_raw()
{
short *rp = 0, (*ip)[4];
// Irrelevant code here...
rp = (short *)ljpeg_row(jrow++, &jh);
// Few lines of code with no assignment to any variable...
FORC(jh.clrs - 2)
{
ip[col + (c >> 1) * width + (c & 1)][0] = rp[jcol + c];
ip[col + (c >> 1) * width + (c & 1)][1] =
ip[col + (c >> 1) * width + (c & 1)][2] = 8192;
}
// Irrelevant code here...
}
Код: Выделить всё
rpКод: Выделить всё
FORC3Макросы Теперь мои вопросы:
- Разве это не должно быть выделено с помощью alloc/malloc внутри вызываемого объекта или объявлено/инициализировано как массив в вызывающей функции, чтобы это не вызывало ошибок сегментации? Нет никакой гарантии (кроме того, что между этими строками нет другого присваивания), что в rp[jcol + c] не будет мусора.
- Насколько я понимаю у программиста буквально нет возможности контролировать, где расположен массив строк, не только для того, чтобы попытаться прикоснуться к нему, но и для того, чтобы попытаться прочитать оттуда полезные данные?! Итак,
- Как это правильный стиль программирования? Это какой-то быстрый хак, который просто работает?
Я скомпилировал и запустил код. Работает без проблем.
Я выполнил отладку с помощью резиновой утки, но ничего не могу понять!
Я искал похожие вопросы, например:
https:// stackoverflow.com/questions/12416459/can-i-use-a-void-pointer-in-c-as-an-array
https://stackoverflow.com/questions/ 59184633/c-declaring-a-pointer-and-then-use-it-as-an-array-memory-allocation
https://stackoverflow.com/questions/43724654/ как-эта-переменная-используется-как-целое-и-как-массив-в-cpp
только для дальнейшего подтверждения моих вопросов.
Это ссылка на исходный файл (если вы хотите проверить код, который я удалил):
https://github.com/LibRaw/LibRaw/blob/m ... /decoders/ decoders_dcraw.cpp
Подробнее здесь: https://stackoverflow.com/questions/790 ... ion-yet-it