Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建多维数组,其维度基于C中的变量?_C_Arrays_Multidimensional Array_Dynamic - Fatal编程技术网

如何创建多维数组,其维度基于C中的变量?

如何创建多维数组,其维度基于C中的变量?,c,arrays,multidimensional-array,dynamic,C,Arrays,Multidimensional Array,Dynamic,基本上,我希望能够在终端中键入维度n,并创建相应的n-D数组 现在我只能创建一个具有相应n-D数组大小的一维数组。你不能,数组的维数是类型的一部分,因此需要在编译时知道。你可以做一些简单的数学运算,把你想要的映射到一个一维数组 例如: 设尺寸=3 w:4 h:8 d:16 代码: 一般实现可能如下所示 int numDimensions; printf("Enter number of dimensions:"); scanf("%d", &numDimensions); int*

基本上,我希望能够在终端中键入维度n,并创建相应的n-D数组


现在我只能创建一个具有相应n-D数组大小的一维数组。

你不能,数组的维数是类型的一部分,因此需要在编译时知道。你可以做一些简单的数学运算,把你想要的映射到一个一维数组

例如:

设尺寸=3

  • w:4
  • h:8
  • d:16
代码:

一般实现可能如下所示

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;
}
int numDimensions;
printf(“输入尺寸编号:”);
scanf(“%d”和numDimensions);
int*尺寸=(int*)malloc(sizeof(int)*numDimensions);
//读取每个维度的大小
整数元素=1;
对于(int i=0;i
不能,数组的维数是类型的一部分,因此需要在编译时知道。你可以做一些简单的数学运算,把你想要的映射到一个一维数组

例如:

设尺寸=3

  • w:4
  • h:8
  • d:16
代码:

一般实现可能如下所示

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;
}
int numDimensions;
printf(“输入尺寸编号:”);
scanf(“%d”和numDimensions);
int*尺寸=(int*)malloc(sizeof(int)*numDimensions);
//读取每个维度的大小
整数元素=1;
对于(int i=0;i
使用指向指针的指针/双指针(
**
)。对于n-D数组,在循环中重复动态分配(
malloc
n次,并使用指向新分配数组的指针引用每个数组。唯一的问题是最后一个数组不使用双指针,因此运行时代码必须知道何时在最后一个维度使用值而不是双指针。使用此功能,您仍然可以通过常规语法进行设置/获取,如
M[1][2][3][1]=5(请注意,0是第一个元素!)

还要确保初始化您的值

关于双数组指针的一个很好的例子和论述,请查阅Kerningham/Richie提供的“C编程语言”,该语言可以在线获得


注意:对于这个问题,还有其他优雅和不那么优雅的解决方案。例如,使用宏/元编程在编译时编写分配代码,并传递
定义
选项(
-DDIMS=4
)或表示树等数组的可嵌套数据结构(查看多维数组的经典数据结构文献)。

使用指向指针/双指针的指针
**
)。对于n-D数组,重复动态分配过程(
malloc
n在循环中执行多次,并使用指向新分配数组的指针引用每个数组。唯一的问题是最后一个数组不使用双指针,因此运行时代码必须知道何时使用值而不是最后一个维度的双指针。使用此方法,您仍然可以通过常规语法(如
M[1][2][3][1]=5;
(注意0是第一个元素!)

还要确保初始化您的值

关于双数组指针的一个很好的例子和论述,请查阅Kerningham/Richie提供的“C编程语言”,该语言可以在线获得


注意:对于这一点,还有其他优雅而不那么优雅的解决方案。例如,使用宏/元编程在编译时编写分配代码,并传递
定义
选项(
-DDIMS=4
)或表示树等数组的可嵌套数据结构(请查阅经典数据结构文献了解多维数组)

您可以在运行时使用VLA.Variable length设置数组的大小 数组是C99的一部分。因此这只适用于C99或更高版本。尽管C11有VLA作为选项,但所有主要编译器都支持它

假设您希望用户从t输入2D数组的大小
#include <stdio.h>

int main(void)
{
   unsigned int row1, col1;

   printf("%s", "Enter number of rows and columns in a 2-D array: ");
   int row1, col1; // number of rows and columns in a 2-D array
   scanf("%u %u", &row1, &col1);

   int array2D[row1][col1]; // declare 2-D variable-length array

}