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

使用内置数组而非vector或new时为何出现段错误?

为什么C++中用内置数组初始化会出现段错误?

问题场景

在HackerRank的C++环境中,初始化大小为n的全零数组时,使用vector类或new动态分配内存的方式均可正常运行,但使用内置数组时会触发段错误。

错误代码片段

long long arr[n];
for(int a = 0;a < n;a++) {
    arr[n] = 0; // 存在数组越界问题,修正后仍会段错
}
// 部分测试用例会出现段错误

可正常运行的代码片段

long long* arr = new long long[n]; // 无错误
vector<long long> arr(n, 0); // 运行正常

完整测试代码

#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>

using namespace std;
typedef long long ll;

int main()
{
    ll n,m;
    ll biggest = 0;
    ll current = 0;
    cin >> n >> m;
    ll arr[n];
    for(int a = 0;a < n;a++) {
        arr[a] = 0;
    }

    for(int i = 0;i < m;i++) {
        ll a,b,k;
        cin >> a >> b >> k;
        arr[a - 1] += k;
        if(b < n) arr[b] -= k;
    }
    for(int j = 0;j < n; j++) {
        current += arr[j];
        biggest = max(current,biggest);
    }
    cout << biggest << endl;
    return 0;
}

问题根源

  1. 变长数组并非标准C++特性:代码里的ll arr[n];属于变长数组(VLA),这是C99标准引入的特性,C标准并未将其纳入规范。虽然部分编译器(如GCC)会提供扩展支持,但这种写法在标准C中不合法,不同环境下的行为可能存在差异。

  2. 栈空间不足导致溢出:内置数组(包括变长数组)是分配在栈内存上的,而栈的空间通常很小(一般仅几MB)。在HackerRank的测试用例中,n的取值可能很大(比如题目Crush的测试用例n可达到1e5甚至更大),如此大的数组直接占用栈空间会耗尽栈资源,触发栈溢出,也就是你遇到的段错误。

而new分配的内存位于堆上,vector内部同样使用堆内存,堆的可用空间远大于栈,因此能够容纳大尺寸数组,不会出现栈溢出问题。

另外,你最初的错误代码中还存在数组越界问题:arr[n] = 0;,数组下标范围是0到n-1,访问arr[n]属于越界访问,会导致未定义行为,但在完整代码中修正为arr[a] = 0后,核心问题仍是栈空间不足。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:45:38