在C中创建未知大小的全局2D数组

时间:2016-06-30 20:07:39

标签: c arrays global-variables global

我正在尝试在C中创建一个全局的2D整数数组,但我不确定如何去做。对于1D阵列,您只需输入

即可
int numbers[];

但显然你不能把两个括号留空,如

int numbers[][];

那我怎么能这样做?我不确定一个简单的方法。

谢谢!

2 个答案:

答案 0 :(得分:0)

为了构建一个二维数组,我们的想法是创建一个 展平的二维数组 (因此,一维数组) 即可。这实际上意味着所有列将水平放置,一个接一个。您需要计算索引才能访问元素。

假设您的数组将包含N行和M列。您不能将其声明为:

int numbers[N][M];

您可以做的是将其声明为:

int numbers[N*M];

所以你的元素将在[0,N * M-1]的范围内。然后,您可以使用索引访问数组的任何元素:

i*M + j;       

其中0 <= i <= N-10 <= j <= M-1

但是,鉴于大小未知,我建议您使用动态内存分配而不是2D数组。您可以执行以下操作。首先,声明指向的指针,它实际上是指向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数组here的动态内存分配的更多信息,以了解内存中发生的情况。

最后,根据您的问题,请注意您不能声明:

int numbers[]; 

因为编译器需要一个指示来知道大小。

答案 1 :(得分:-2)

为此目的,您需要一个指向int的指针。 C没有bultin 2D数组,但你有办法解决这个问题。你有两个选择:

通过辅助函数

模拟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数组,您可以使用以下函数:

首先分配1D阵列

int * myArray = (int*) malloc(5*7);

之后,您将在位置x = 2,y = 2时将值设置为10     setTwoDimensionArray(&amp; myArray,5,2,2,10);

以后,如果你想取回价值:     int value = getTwoDimensionArray(&amp; myArray,5,2,2);

有一个数组数组,以便模拟一个2D数组

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 ++,你有更多选择,请参阅Multidimensional Containers in C++