我想通过用随机数( 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/