Это беспокоило меня некоторое время. Много раз я нахожу, что делаю большой буфер для хранения "максимального" количества данных. Это помогает мне избежать динамического выделения и освобождения буфера каждый раз, когда изменяется размер следующего набора данных.
Например, у меня есть массив, который слишком велик для его фактического полезного размера, но я знаю длину полезных данных.
int amountOfData = 9;
char data1D[100] = some data that is only 9 bytes long stored in a 100 byte array
Позволяет сказать, что у меня есть алгоритм, который я хочу запустить в этом наборе данных, который использует индексацию 2D-массива. Поэтому я хочу иметь доступ к данным следующим образом:
cout << "I am accessing this data as a 2D array: " << data1D[0][1] << endl;
Скажем, для этого алгоритма я знаю, что длина x и длина двумерного массива будут:
int xlength = 3;
int ylength = 3;
для этой итерации, потому что amountOfData = 9
. Однако длины для другой итерации могут быть разными. То есть. они могут быть xlength = 4
и ylength = 4
заданы amountOfData = 16
.
Я хочу сделать какое-то литье, которое позволяет мне использовать 1D-массив, используя двумерную индексацию. Я знаю, как долго моя начальная 1D-длина, что говорит мне, как долго мои 2D xlength
и ylength
, поэтому это должно быть легко обойтись без использования new
или malloc
, пока начальные 100 байтов достаточно долго, чтобы хранить полезные данные для меня.
Я понимаю, что:
char** data2d = (char**) data1D;
не будет работать, потому что компилятор не знает размер второго измерения. Но я буду знать, что это такое во время выполнения!
В чем причина этого, так оно и есть? Есть ли обходные пути? Я что-то пропустил?