c - 通过 C 中的随机数定义二维数组维度

标签 c arrays multidimensional-array

我想使用随机维度创建一个二维数组。

这是我的随机数生成器方法:

int GetRandomNumber(int low, int high)
{
    srand((unsigned)time(NULL));
    int res = rand() % ((high + 1) - low) + low;

    return res;
}

现在主要代码如下:

void main()
{
    int dime = GetRandomNumber(3, 5), a = GetRandomNumber(3, 5), b = GetRandomNumber(3, 5);

    int matA[a][dime];
    int matB[dime][b];

    system("PAUSE");
}

问题是我得到一个expression must have a constant value 并且cannot allocate an array of constant size 0 错误。

我的问题是如何使用随机数作为维度制作二维数组。

最佳答案

从 C99 开始,您可以使用可变长度数组 在运行时定义数组的大小:

int x = some_value();
int y = some_other_value();

int arr[x][y];

由于它们的大小直到运行时才确定,因此对它们的使用有一些限制——它们不能有 static 存储持续时间(即,它们不能在文件范围内或使用static 关键字),并且不能在声明中使用初始化程序。如果 xy 很大,您还需要小心。

如果您没有可用的 C99 或更高版本的编译器,那么这将不起作用。您将不得不改用动态内存分配,并且必须将其分配为“锯齿状”数组:

int x = some_value();
int y = some_other_value();

int **arr = malloc( sizeof *arr * x );
if ( arr )
{
  for ( size_t i = 0; i < x; i++ )
  {
    arr[i] = malloc( sizeof *arr[i] * y );
  }
}

完成后,您将取消分配为

for (size_t i = 0; i < x; i++ )
  free( arr[i] );
free( arr );

在访问元素时,这将像任何其他二维数组一样工作:

arr[i][j] = some_value();

但请注意,行不会连续 - 从一行的末尾到下一行的开头会有间隙。如果这很重要,那么最后一个选项是声明一维数组并手动计算索引:

int *arr = malloc( sizeof *arr * x * y );
...
arr[i * x + j] some_value();

完成后,您可以将其释放

free( arr );

关于c - 通过 C 中的随机数定义二维数组维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53766445/

相关文章:

objective-c - 从 Swift 调用可变参数 Objective-C 函数

c - C 中函数的作用域

c - 使用 i++(或++i)真的是一个好习惯吗?

C - 字符 *' differs in levels of indirection from ' 字符 (*)[200]

c++ - 特定大小的数组在其初始化的函数之外使用

javascript - 不断出现 TypeError : Cannot read property 'map' of undefined when I click on checkbox, 不知道问题出在哪里

ios - 网络调用后如何将所有图像附加到该数组?

java - 使用来自字符串的输入填充二维数组的行

php - 为什么我的多维数组没有正确初始化和/或返回?

java - 如何读取文本文件并使用 JOptionPane 显示它。 (二维数组)