void compute(int rows, int columns, double *data) {
double (*data2D)[columns] = (double (*)[columns]) data;
// do something with data2D
}
int main(void) {
double data[25] = {0};
compute(5, 5, data);
}
Иногда было бы очень удобно рассматривать параметр как многомерный массив, но он должен быть объявлен как указатель на плоский массив. Безопасно ли использовать указатель для обработки его как многомерного массива, как это делает compute
в приведенном выше примере? Я уверен, что макет памяти гарантированно работает правильно, но я не знаю, позволяет ли этот стандарт указывать указатели таким образом.
Разве это нарушает какие-либо строгие правила псевдонимов? Как насчет правил для арифметики указателя; поскольку данные "на самом деле" не являются double[5][5]
, разрешено ли выполнять арифметику указателей и индексирование на data2D
, или это нарушает требование, чтобы арифметика указателя не отклонялась от границ соответствующего массива? Является ли data2D
даже гарантированным указание на нужное место, или просто гарантировано, что мы можем отбросить его и восстановить data
? Стандартные котировки будут высоко оценены.