我需要用0填充二维数组。 但编译后的程序会出现此错误。 怎么了?

int main()
{
    int vert[1001][1001];
    int hor[1001][1001];
    int dudiag[1416][1416];
    int uddiag[1416][1416];
    int n, k, m;
    int row, col;
    int i, j;
    int answer = 0;

    for(i = 0; i <= 1000; i++){
        for(j = 0; j <= 1000; j++){
            vert[i][j] = 0;
            hor[i][j] = 0;
        }
    }
...
}

当循环被注释掉时,它可以正常工作。

===============>>#1 票数:8 已采纳

问题是你试图在自动存储中分配太多内存(堆栈中的AKA)。 当您注释掉循环时,编译器会优化分配以及现在未使用的变量,因此您不会崩溃。

您需要将分配更改为静态或动态内存(AKA“堆”)以解决此问题。 由于问题在main内部,因此使数组static将是一个合适的选择。

int main()
{
    static int vert[1001][1001];
    static int hor[1001][1001];
    static int dudiag[1416][1416];
    static int uddiag[1416][1416];
    ...
}

main之外的函数中,您可以使这些数组动态化,使用malloc / calloc分配它们,然后在程序使用完毕后free它们。

===============>>#2 票数:1

怎么了?

您试图在堆栈上保留几个4MB阵列。 在许多Linux发行版中,默认堆栈大小为8MB(您可以使用ulimit -s unlimited更改此值)。

即使拥有无限堆栈,Linux内核也不会将堆栈扩展超过一些常量,因此ulimit -s unlimited可能无助于避免崩溃。

正如dasblinkenlight的回答所说,如果您需要大型数组,请动态分配它们。

最后,显式for循环是将数组清零的低效方法。 使用memset可能会更高效,并且需要更少的代码。

  ask by sooobus translate from so

未解决问题?本站智能推荐:

1回复

C中函数调用的分段错误

我正在解决使用MaxHeap在数组中找到第k个最小元素的问题。 我的C代码如下: 当我运行程序时,出现了段错误。 我尝试调试,但是找不到原因。 这是我的gdb输出: 这是我的valgrind输出 当我的extract_max函数调用max_heapify函数时,
3回复

在C中创建数组的分段错误

我最近迁移到了新笔记本电脑-HP dv6119tx(Intel Core i5,4 GB RAM)。 它安装了Windows 7 Home Premium 64位。 我正在尝试在C ++(Dev C ++)中创建一个长度为10 ^ 6的int类型的数组,我曾经在我的最后一台笔记本电脑(3
3回复

声明大指针数组时C中的分段错误

我遇到了程序问题,但不确定如何解决。 我正在处理文件,因此我用ftell获取大小并将其存储在M_size中。 之后,我用N声明了一个无符号char指针数组。该数组随后在两个函数a()和b()中使用。 函数a()实际上在for循环中初始化ptr_M的每个元素: 然后,函数b()
1回复

是什么导致该程序中的分段错误?

请通过在程序中调用以下函数来帮助我解决这个SIGSEGV错误: 对于较小的输入(例如5个镇),程序运行没有问题,所以我首先怀疑它是stackoverflow的原因,因为程序始终运行一段时间(直到所有运行的i的相似值( i=20 )),然后停止运行并给出错误(在GDB中): 程序
2回复

Malloc分段错误

以下是发生分段错误的代码段(不会调用perror): 更确切地说,gdb说segfault发生在__int_malloc调用中,这是malloc发出的子例程调用。 由于malloc函数与其他线程并行调用,最初我认为它可能是问题所在。 我使用的是glibc 2.19版。 数据
2回复

递归分段错误和StackGuard

让我们说我有一个功能,它所做的就是在没有任何终止的情况下调用自己。 如果我运行一个包含这个函数的程序,我最终会得到一个分段错误。 为什么会这样? 耗尽堆栈空间? 此外,StackGuard可以防止此故障吗? 为什么或者为什么不?
2回复

执行main之前的分段错误

出于某种原因,我在main()函数中实际执行任何代码之前遇到了分段错误。 我尝试通过放入printfs来执行执行,但实际上没有执行任何操作。 我的程序中没有看到任何会导致堆栈溢出的内容,因为我几乎不使用内存。 如果有人的眼睛比我好,并且可以发现这个错误,那将非常感激! 主要:
1回复

漏洞:SIGSEGV,分段错误

对于我的硬件任务,我试图利用溢出的C文件。 我无法编辑原始文件,也无法重新编译它。 我已经尽力返回我的预定地址。 但是在执行代码一段时间后,我得到了: 它从0xfffcc30-> 0xffffcc3a执行正常,但突然停止在0xffffcc3b。 我能知道为什么会这样吗?
1回复

将malloc与双指针一起使用时出现分段错误

这段代码不起作用,我也不知道为什么,我完全按照教授告诉我们的方式使用了所有东西,我认为它应该起作用,为什么编译器会抛出Segmentation Fault(核心转储)异常。 我究竟做错了什么? 这只是程序的一部分,但是当我仅运行此代码时,编译器将引发异常。 它甚至不扫描n号,它仅扫描
4回复

分段错误和堆栈溢出之间有什么区别?

例如,当我们调用一个递归函数时,后续调用将存储在堆栈中。 但是,由于错误(如果无限进行),该错误是“分段错误”(如GCC所示)。 难道不是“堆栈溢出”吗? 两者之间的基本区别是什么? 顺便说一句,一种解释将比维基百科链接更有用(通过该链接,但对特定查询没有答案)。