我想通过填充随机数(双人(来初始化2D矩阵。
所以,此代码
#define N 1000
int main(void){
double A[N];
arc4random_buf(A,N*sizeof(double));
return 0;
}
运行并产生一个1D阵列,充满了预期的随机数。
但是,这个
#define N 1000
int main(void){
double A[N][N];
arc4random_buf(A,N*N*sizeof(double));
return 0;
}
产生分割故障。我已经尝试在上一行上初始化一个用零来初始化一个,但无济于事。
是在此处使用循环的唯一解决方案?
编辑:正如Eric指出的那样,堆栈大小可能是这里的问题:将n更改为600"修复"第二代码。谢谢!
(堆栈大小确实是我的系统上的8个MIB,所以这应该合适,但是实际代码中还有一个相同大小的第二个数组(
堆栈的大小有限。8 MIB 1 或更小的常见。
如果double
为八个字节,而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"代表Mebibyte,即2 20 = 1,048,576字节。