繁体   English   中英

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

[英]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-10 <= 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数组,但是您有解决此问题的方法。 您在这里有两个选择:

通过辅助函数模拟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);

有一个数组数组,以便模拟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 ++,则有更多选择,请参阅C ++中的多维容器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM