[英]Creating a global 2D array of unknown size in C
我正在尝试在C中创建一个整数的全局2D数组,但是我不确定如何执行此操作。 对于一维数组,您可以简单地将
int numbers[];
但显然您不能像这样将两个括号留空
int numbers[][];
那我该怎么办呢? 我不确定一个简单的方法。
谢谢!
为了构造2D数组,我们的想法是创建一个扁平的2D数组 (因此是1D数组) 。 实际上,这意味着所有列将水平放置,一个接一个。 您将需要计算索引才能访问元素。
假设您的数组将具有N
行和M
列。 您不能将其声明为:
int numbers[N][M];
您可以做的是将其声明为:
int numbers[N*M];
因此您的元素将在[0,N * M-1]范围内。 然后,您可以使用index访问数组的任何元素:
i*M + j;
其中0 <= i <= N-1
和0 <= j <= M-1
。
但是,鉴于大小未知,我建议您使用动态内存分配而不是2D数组。 您可以按照以下步骤进行操作。 首先,声明一个指向pointer的指针 ,该指针实际上将是2D数组第一个元素的指针:
int **numbers;
然后,为2D结构分配内存:
int i;
numbers = malloc( N*sizeof(int *) ); // N is the number of the rows
if (numbers == NULL)
return;
for (i = 0 ; i < N ; i++)
{
numbers[i] = malloc( M*sizeof(int) ); // M is the number of the columns
if (numbers[i] == NULL)
return;
}
您可以在此处阅读有关2D数组动态内存分配的更多信息,以了解内存中发生的情况。
最后,根据您的问题,让我注意到您无法声明:
int numbers[];
因为编译器需要一个指示来知道大小。
为此,您将需要一个指向int的指针。 C没有普通的2D数组,但是您有解决此问题的方法。 您在这里有两个选择:
您可以模拟第二维; 我建议为此目的使用一个辅助函数,例如:
int getTwoDimensionArray(int ** array, int rowSize, int x, int y)
{
return (*array)[x + y*rowSize];
}
void setTwoDimensionArray(int ** array, int rowSize, int x, int y, int value)
{
(*array)[x + y*rowSize] = value;
}
假设您要动态分配5x7数组,可以使用如下函数:
首先分配一维数组 :
int * myArray = (int*) malloc(5*7);
之后,您将像 setTwoDimensionArray(&myArray,5,2,2,10); 那样在位置x = 2,y = 2处设置值为 10。
然后,如果您想取回值: int value = getTwoDimensionArray(&myArray,5,2,2);
int getTwoDimensionArray(int ** array, int rowSize, int x, int y)
{
return (*array)[x][y];
}
void setTwoDimensionArray(int ** array, int rowSize, int x, int y, int value)
{
(*array)[x][y] = value;
}
分配数组的数组:
int ** myArray = (int**) malloc(5);
for ( int i=0; i<5; ++i )
{
myArray[i] = (int*) malloc(7);
}
您将以与选项#1相同的方式使用辅助功能。
setTwoDimensionArray(&myArray, 5, 2, 2, 10);
int value = getTwoDimensionArray(&myArray, 5, 2, 2);
当然,如果可以使用C ++,则有更多选择,请参阅C ++中的多维容器
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.