2010-07-30 4 views
0

Можно выделить пространство памяти 1DУстные линейное пространство памяти как 1D, 2D, ..., ND эффективен в C

int *x=(int *)malloc(100*sizeof(int));

, а затем переделку возвращаемого указателя на 2D массив, например

int **y=(int **)x;

и доступ к нему, как если бы это был 2D массив, например, y[1][2] = 12;?

Моя цель - взять сегмент разделяемой памяти и вернуть 1D, 2D, ... ND-массив в зависимости от того, как пользователь хочет интерпретировать это линейное пространство с максимальной эффективностью (т. Е. Не объявлять новый N-мерный массив и копировать данные внутрь).

На второй ноте есть библиотека для C, которая обрабатывает N-мерные массивы, получая от них срезы и эффективно перенося их (например, преобразование строки-майора в col-major)?

спасибо, bliako

ответ

1

Я не совсем уверен, что ваш кастинг int * будет иметь эффект, который вы хотите.

После вашего первоначального заявления x указывает на вашу недавно выделенную память, поэтому хорошо делать что-то вроде x[1] = 8;. Память хранит ваши данные (т. Е. Значения вашего массива).

Однако после вашего второго заявления y считает, что он указывает на int *, эффективно превращая ваши прежние данные в набор указателей int. Все значения, которые вы сохранили ранее, теперь рассматриваются как адреса в других местах в памяти. Вы не просто переопределяете, как вы обращаетесь к ранее выделенной памяти; вы полностью перепрофилируете память.

Я не думаю, что невозможно сделать то, что вы предлагаете, но это не так просто, как метод, который вы предлагали.

Что касается библиотеки для обработки многомерных массивов, проверить это сообщение: How do I best handle dynamic multi-dimensional arrays in C/C++?

+0

Я признаю, что мой вопрос был полностью хромым. вы можете сказать, что массив содержит не только мои данные, но и указатели на каждую строку. – bliako

1

Это будет делать трюк, обратите внимание, что d2 не должен быть известно во время компиляции.

int *y[d2]; 
y=(int (*)[d2])x;