c - 在 C 中的一行中用随机字节填充多维数组

标签 c multidimensional-array random

我想通过用随机数( double )填充二维矩阵来初始化它。

例如,这段代码

#define N 1000

int main(void){
  double A[N];

  arc4random_buf(A,N*sizeof(double));

  return 0;
}

运行并生成一个按预期填充随机数的一维数组。

但是,这个

#define N 1000

int main(void){
  double A[N][N];

  arc4random_buf(A,N*N*sizeof(double));

  return 0;
}

产生段错误。我尝试在上一行中用零初始化 A,但无济于事。

这里使用循环是唯一的解决方案吗?

编辑:正如 Eric 指出的,堆栈大小可能是这里的问题:将 N 更改为 600 也“修复”了第二个代码。谢谢!

(在我的系统上堆栈大小确实是 8 MiB,所以这应该合适,但实际代码中还有第二个相同大小的数组)

最佳答案

堆栈的大小有限。 8 MiB1 或更小是常见的。

如果 double 是 8 个字节且 N 是 1000,则 double A[N][N]; 请求 8 MiB。 C 实现中的堆栈不足以提供此功能,因此您的程序崩溃。

不要在函数中声明本地对象,而是使用 malloc 来请求内存。通过 malloc 可用的内存通常要大得多:

double (*A)[N] = malloc(N * sizeof *A);
if (!A) { /* Handle error. */ }
arc4random_buf(A, N * sizeof *A);

脚注

1 “MiB” stands for mebibyte, which is 220 = 1,048,576 bytes.

关于c - 在 C 中的一行中用随机字节填充多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57290516/

相关文章:

c++ - 如何使用 `static linking` 和 `Dynamic linking` 以及 gcc 和 Visual Studio 构建 C/C++ 程序?

c - 什么是 "stack thrash"?

matlab - 访问 3D 数组中多个页面的不同行

python - 连接 Numpy 数组而不复制

php - 带有种子的 array_rand

C# (sharp) 从 txt 文件中读取随机行

c - 一种确定两个字符串是否是彼此的变位词的可能算法?

c - linux中模块的调试

php - 按键值对php多维数组进行排序

python - (numpy)随机种子有范围吗?