srand()触发访问未映射区域错误

4
我正在Linux上开发一个操作矩阵的程序。我在生成矩阵随机值的代码段中遇到了问题(它会导致段错误)。以下是触发问题的代码段:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define INFINITO 10
#define MAX 11
#define MR 100
#define MC 100
#define MEMBER 1
#define NONMEMBER 0

double shortpath(double MatQuad[][MR+MC], int, int ,int precede[]);


int main(){

int d;
int c1, c2, i, j, p , h, l, k, x, mrr, rf, cf;
double X[MR][MC], F1k[MR+1][MC];
double MatQuad[MR+MC][MR+MC];
double P[MC][MC][MC];
int precede[MR+MC];
double best_Delta, Delta;
int best_i, best_j, best_h, best_l;

srand(8);
   for(j=0; j<MR; ++j){
     for(h=0; h<MC; ++h)
       X[j][h]=(rand()% MAX)*0.1;
   }

使用Valgrind,在该行处我得到以下结果:
srand(8);

错误信息:

访问地址0x7FE7EA0B8不在映射区域内 [PID:2484]

您认为这是语义上出了问题还是其他原因呢?我想给srand一个由系统时钟取得的数值,但我的尝试一直没有成功。

在OSX和Linux上,堆栈大小通常为8-10 MB。你可以使用ulimit shell内置命令将其扩大一倍:$ ulimit -s 20000或者将其扩大三倍:$ ulimit -s 30000 - DigitalRoss
1个回答

7
double X[MR][MC], F1k[MR+1][MC];     // 80KB + 80.8KB
double MatQuad[MR+MC][MR+MC];        // 320KB
double P[MC][MC][MC];                // 8MB
int precede[MR+MC];                  // 800B 

我怀疑你的堆栈上有过多的数据。堆栈空间是有限的。确切的大小取决于平台和编译器;如果你在几百KB的范围内,那么你就会面临灾难。像这样的大数组最好作为静态数据或堆上的数据。尝试为每个数组添加static限定符,或使用malloc()进行分配。


谢谢,我通过将静态添加到您提到的四个实体中暂时解决了这个问题。 - user2191429

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接