You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在int main()内外声明数组的差异及段错误原因解析

数组在main函数内外声明的差异分析

先看两段解决HackerRank数组操作问题的代码:

CASE 1:在main内部声明数组(运行出现段错误)

#include <stdio.h>

int main()
{
    int n;
    int m;
    long long arr[10000005];
    scanf("%d %d", &n, &m);
    int index1, index2, summand;
    for (int i = 0; i < n; i++)
    {
        arr[i] = 0;
    }
    while (m--)
    {
        scanf("%d %d %d", &index1, &index2, &summand);

        arr[index1-1] += summand;
        arr[index2] -= summand;
    }

    long long max = 0, temp = 0;
    for (int i = 0; i < n; i++)
    {
        temp += arr[i];
        if (temp >= max)
        {
            max = temp;
        }
    }
    printf("%lld", max);
}

CASE 2:在main外部声明数组(正常通过所有测试用例)

#include <stdio.h>

long long arr[10000005];

int main()
{
    int n;
    int m;

    scanf("%d %d", &n, &m);
    int index1, index2, summand;
    for (int i = 0; i < n; i++)
    {
        arr[i] = 0;
    }
    while (m--)
    {
        scanf("%d %d %d", &index1, &index2, &summand);

        arr[index1-1] += summand;
        arr[index2] -= summand;
    }

    long long max = 0, temp = 0;
    for (int i = 0; i < n; i++)
    {
        temp += arr[i];
        if (temp >= max)
        {
            max = temp;
        }
    }
    printf("%lld", max);
}

核心差异说明

两段代码唯一的区别是数组arr的声明位置,导致运行结果不同的核心原因是内存分配区域的差异:

  • main内部声明的数组属于局部变量,会被分配到**栈(Stack)**内存中。栈的空间通常很小(一般为几MB级别,具体大小由操作系统和编译环境决定)。你的数组long long arr[10000005]占用内存约76MB,远超过栈的可用空间,直接触发栈溢出,导致segmentation fault(段错误)。
  • main外部声明的数组属于全局变量,会被分配到静态存储区(Static Storage Area)。这个区域的内存空间远大于栈,通常可以容纳几百MB甚至更大的数据,因此大数组放在这里不会出现内存不足的问题,能正常运行。

额外补充:全局变量在程序启动时会被自动初始化为0,因此CASE2中的for (int i = 0; i < n; i++) arr[i] = 0;代码可以省略,不影响程序功能。

内容的提问来源于stack exchange,提问作者BiscuitBreaker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 01:09:18