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



我试图在C中创建一个全局二维整数数组,但我不确定如何去做。对于1D数组,您可以简单地输入

int numbers[];

但是显然不能像

那样留下两个空括号
int numbers[][];

那么我该怎么做呢?我不确定是否有简单的方法。

谢谢!

为了构造一个2D数组,思路是创建一个扁平的2D数组(因此,一个1D数组)。这实际上意味着所有的列都是水平放置的,一个接一个。为了访问这些元素,你需要计算一个索引。

假设您的数组将有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;
}

你可以在这里阅读更多关于二维数组的动态内存分配,以了解内存中发生了什么。


最后,根据你的问题让我注意你不能声明:

int numbers[]; 

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

为此需要一个指向int的指针。C语言没有内置的二维数组,但你有办法解决这个问题。这里有两个选项:

通过辅助函数模拟二维数组

你要么模拟第二次元;为此,我建议使用辅助函数,类似于:

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处设置value为10,如下setTwoDimensionArray(&myArray, 5,2,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++ h1> 然,如果你可以使用c++,你有更多的选择,参见c++中的多维容器

相关内容

  • 没有找到相关文章

最新更新