微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我在这段代码中出现分段错误?

如何解决为什么我在这段代码中出现分段错误?

为什么我的第一个和第二个程序运行良好,但第三个程序出现分段错误?我不认为问题出在内存限制上,因为即使 long long dp[40][100000] 运行良好,但如果我尝试打印任何值,再次说 std::cout << dp[0][0]; 它会出错。我真的很困惑,我试过在 Jdoodle 和 GDB 在线编译器上编译这段代码。两者都给出了相同的错误

首先:

#include<iostream>
#include<vector>


int main(){
    std::vector<long long> price(20);
    std::vector<long long> pages(20);
   
    return 0;
}

第二:

#include<iostream>
#include<vector>


int main(){

    long long dp[20][100000];    
    return 0;
}

第三:

#include<iostream>
#include<vector>


int main(){
    std::vector<long long> price(20);
    std::vector<long long> pages(20);

    long long dp[20][100000];    
    return 0;
}

编辑:我想知道为什么第二个程序运行良好而第三个程序出现分段错误。我认为它们要么都运行,要么都不运行而不会出现任何错误

解决方法

这里有一些其他选项可以尝试:

int main()
{
    static long long dp[20][100000];
    std::cout << "Size of dp: " << sizeof(dp) << "\n";
    return 0;
}

在许多平台中,函数内声明为 static 的变量被放置在不同的区域中,该区域通常比局部变量具有更大的容量。

您可以动态分配:

long long * dp = new long long [20][100000];

动态内存,也就是堆,通常容量很大,肯定比局部变量区大。

您也可以在“全局”空间中分配:

static long long dp[20][100000];
int main()
{
     //...
     return 0;
}

在大多数系统中,全局区域比局部变量区域(又名堆栈)大很多。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。