Я предполагаю, что если вы хотите получить доступ к вашему «2D-массиву» как одну D-матрицу, вы ожидаете, что при увеличении индекса на 1 вы получите доступ к следующему элементу массива (и автоматически перейдете к следующему когда вы сбегаете с края). Правильный способ сделать это - изменить способ выделения массива. Я попытаюсь показать, как это делается - это просто C, а не C++. Это, вероятно, более уместно, так как вы все равно использовали malloc
. Я также думаю, что у вас есть довольно серьезные ошибки в коде, в том, что вы создаете char *
указатель p
, но ожидать, чтобы использовать его в
p[x][y];
, для которого потребуется char **
, очевидно. Давайте попробуем сделать код, который будет делать то, что вы хотите:
int sizes[100];
//init sizes
unsigned char *p[100]; // without the == sign we create an array of 100 pointers
unsigned char *bigP; // the master pointer
int totalLength = 0;
int ii;
for(ii=0; ii<100; ii++) totalLength += sizes[ii];
bigP = malloc(sizeof(char) * totalLength);
int offset = 0;
// make pointers p point to places along this big memory block:
for(ii = 0; ii < 100; ii++) {
p[ii] = bigP + offset;
offset += sizes[ii];
}
Теперь вы можете обратиться ваш массив с
p[x][y];
или
bigP[z];
где z
может пойти от 0 до максимальное количество элементов. Конечно, в процессе, о котором вы не знаете (когда вы используете парадигму «1D») в какой строке/столбце массива jagged вы - вы не можете знать, что если вы действительно в одном измерении.
Ключ здесь в том, что память выделяется как единый непрерывный блок, а указатели p
указывают на места в этом блоке. Это означает, что вы НЕ ДОЛЖНЫ БЕСПЛАТНО p
. Вы должны только освобождать bigP
.
Надеюсь, это имеет смысл.
в моем массиве не все имеют одинаковый размер – Blazer
Если у вас есть «зубчатый массив» (разные длины), то не рекомендуется пытаться сделать его одним массивом D. Как вы его создали? – Floris
У меня нет других вариантов, длины должны быть разными, что быстрее для этой работы, кроме 2-го массива? – Blazer