尝试声明大数组时出现分段错误和核心转储[重复]

Posted

技术标签:

【中文标题】尝试声明大数组时出现分段错误和核心转储[重复]【英文标题】:Segmentation fault and core dumped when trying to declare a big array [duplicate] 【发布时间】:2013-11-15 17:18:10 【问题描述】:

在我的 C 程序中,当我尝试分配这个数组值时:

double sample[200000][2];

我收到分段错误错误。但是当我使用时:

double sample[20000][2]

有效!!这些索引值有限制吗?

【问题讨论】:

【参考方案1】:

您似乎尝试为 200,000 x 2 = 400,000 双精度值保留空间,每个 double 为 8 个字节,因此您尝试保留大约 3.2 兆字节

即使您的机器可能有几个 Gigs 的内存,每个进程和每个线程的堆栈空间都是有限的,并且很可能被限制为 1 或 2 兆字节。所以你不能分配 3 兆,你崩溃了。

要解决此问题,您需要更改为动态内存,使用 malloc。 这将使您可以从比堆栈空间更丰富的堆空间进行分配。

使用 malloc:

double (*sample) [200000];
s = malloc(sizeof(*sample) * 2); 
sample[0][0] = 0.0;
sample[1][199999] = 9.9;

【讨论】:

@ZanLynx:你说的有一部分是对的,我忘记了间接级别(*)。现已修复。 我必须同意@ZanLynx 我不明白你的分配代码是如何工作的。 我用我尝试过的代码示例编辑了您的代码示例。 @ZanLynx 仍然是错误的,所以 200000 double * 将自动存储,并且更小的第二维将是动态的,这绝对不是初衷. @ShafikYaghmour:自动存储?不。在上面的代码中,sample 是一个指向 200,000 个双精度数组的指针。 malloc(sizeof(*sample)*2) 请求动态分配其中两个数组,总共 400,000 个双精度数。【参考方案2】:

您可能会溢出堆栈,因为在大多数现代实现中这是一个自动变量,它们将分配在大小有限的堆栈上。

例如visual studio 中的堆栈大小默认为1MB,但可以修改。有一个更完整的典型堆栈大小列表here:

SunOS/Solaris   8172K bytes
Linux           8172K bytes
Windows         1024K bytes
cygwin          2048K bytes

如果您有大量数据,则在堆栈上分配的另一种方法是通过malloc 使用动态分配C FAQ在How can I dynamically allocate a multidimensional array?上有很好的参考,将他们的二维示例修改为double

#include <stdlib.h>

double **array1 = malloc(nrows * sizeof(double *));
for(i = 0; i < nrows; i++)
   array1[i] = malloc(ncolumns * sizeof(double));

【讨论】:

只是更多的堆栈 cmets:一些系统具有“无限”堆栈大小,因为它会按需增长。但是,当添加线程时,堆栈突然具有固定大小,因为每个堆栈都需要一个唯一的位置,并且会很快遇到相邻的内存分配。 如何修改堆栈大小?我在这里使用 gcc 编译器。 @james 什么操作系统? Linux 堆栈信息:***.com/questions/2656722/… @DanielKamilKozar:我认为标准没有定义最小尺寸。例如,一台 16 位计算机将被限制为 64KB 对象。然而,这曾经是一个常见的 C 编程环境。

以上是关于尝试声明大数组时出现分段错误和核心转储[重复]的主要内容,如果未能解决你的问题,请参考以下文章

尝试执行茎文件时出现分段错误(核心转储)

运行我的代码时出现分段错误(核心转储)问题

在opencv c ++中查找图像卷积时出现分段错误(核心转储)错误

使用 pthread_create 时出现“分段错误(核心转储)”

当我在 ubundu12.04 中运行“phantomjs”命令时出现分段错误(核心转储)

分配时出现分段错误[重复]