Вы не можете, число измерений массива является частью типа, поэтому его нужно знать во время компиляции.Вы можете сделать простую математику, чтобы отобразить то, что вы хотите, в массив 1d.
Пример:
Пусть размеры = 3
Код:
int* data = (int*)malloc(sizeof(int) * w * h * d);
int x = access(1,2,3); //it will map to location: 1 + 2 * (4) + 3 * (4 * 8)
free(data);
int access(int x, int y, int z){
return data[x + y * (w) + z * (h * w)];
}
Общая реализация может выглядеть следующим образом
int numDimensions;
printf("Enter number of dimensions:");
scanf("%d", &numDimensions);
int* dimensionSizes = (int*)malloc(sizeof(int) * numDimensions);
//Read each dimension's size
int totalElements = 1;
for(int i = 0; i < numDimensions; ++i){
printf("Enter size for dimension %d:", i);
scanf("%d", &dimensionSizes[i]);
totalElements *= dimensionSizes[i];
}
//allocate 1d array
int* data = (int*) malloc(sizeof(int) * totalElements);
//Read the coordinates you want to store data to
int* position = (int*)malloc(sizeof(int) * numDimensions);
for(int i = 0; i < numDimensions; ++i){
printf("Enter location in dimension %d:", i);
scanf("%d", &position[i]);
}
//Read the value you want to store
int value;
printf("Enter value for that position:");
scanf("%d", &value);
//Write the data to the calculated 1d location
data[to1d(position, dimensionSizes, numDimensions)] = value;
int to1d(int* position, int* dimensionSizes, int numDimensions){
int multiplier = 1;
int position1d = 0;
for (int i = 0; i < numDimensions; ++i){
position1d = position1d + position[i] * multiplier;
multiplier = multiplier * dimensionSizes[i];
}
return position1d;
}