【问题标题】:C: Resolving segmentation fault due to possibly insufficient memory [duplicate]C:解决由于内存可能不足导致的分段错误[重复]
【发布时间】:2017-09-06 01:47:38
【问题描述】:

我遇到了我的代码中的分段错误,我只能通过可用内存不足来解释。发生的事情是我正在尝试创建一个NxN 矩阵,其中N 是一个很大的数字。对于N=8,程序运行良好,但对于N>=16³=5000,我会自动遇到分段错误。这是 ew 有什么简单的方法可以解决这个问题吗?如果可能的话,我实际上想模拟N=64³ 范围的大小,所以这对我来说是一个非常重要的问题。

我的代码结构如下。

const int N=16**3;
int main(int argc, const char * argv[]) {
double rnorm[N][N];
...
}

void Diluisci(..., double rnorm[N][N]{
...
AdjMatOnestep(rnorm);
}

void AdjMatOnestep(double rnorm[][N]){
...}

所以main() 调用Diluisci(),后者调用AdjMatOnestep(),一旦我调用最后一个函数,就会出现分段错误。我什至没有进入它的第一行。 DDD 说“错误读取变量:无法访问地址...的内存”。

有什么想法吗?

【问题讨论】:

  • 大多数 CPU 架构对堆栈帧大小的限制非常小,因此您无法分配巨大的本地数组。
  • const int N=16**3; ??
  • C 中没有** 运算符。

标签: c


【解决方案1】:

您正在尝试在堆栈上分配 rnorm,但 4096 * 4096 元素中的每个元素占用 8 个字节,大约为 128 MB。堆栈上可能没有足够的空间来存储这么多的存储空间。

您应该改用malloc() 在堆上创建此数组。

【讨论】:

  • 您介意解释一下堆和栈的区别吗?
  • Stackoverflow 是为了提供问题的解决方案,而不是为了教育你可以很容易地自行查找的基本问题。
猜你喜欢
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 2022-11-23
  • 2022-06-12
  • 2018-11-10
  • 1970-01-01
  • 2016-03-30
相关资源
最近更新 更多