1

我的代码编译并正确运行,除非我移动int res[2000+1][2000+1];内部 main 我得到分段错误为什么会发生这种奇怪的行为?为什么在本地定义变量会导致分段错误?

#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>
#define ll long long int
#define S(a) scanf("%d",&(a))
#define SL(a) scanf("%lld", &(a))
#define P(a) printf("%d",(a))
#define PL(a) printf("%lld",(a))
#define PTR(a) printf("%s",(a))
#define STR(a) scanf("%s",(a))
#define SP printf(" ")
#define pb push_back
#define mp make_pair
using namespace std;
bool sort_pred(const pair<int,int>& left, const pair<int,int>& right)
    {
    return left.first < right.first;
    }
int res[2000+1][2000+1];
int main()
{
   int s,n;

     S(s);S(n);
vector <int> v (n+1);
vector <int> w(n+1);
  for(int i=0;i<n;++i)
   {
       cin>>w[i];
       cin>>v[i];
   }
  for(int i=0;i<=n;++i)
   {
       for(int j=0;j<=s;++j)
       {
           if(i==0 ||j==0)
           res[i][j]=0;
           else if(w[i-1]<=j)
               {
                res[i][j]=max(res[i-1][j-w[i-1]]+v[i-1],res[i-1][j]);
               }
               else
               res[i][j]=res[i-1][j];
           }
       }

   std::cout<<res[n][s];
   return 0;
}
4

3 回答 3

3

如果将它移到 main 中,它会变成一个基于堆栈的变量,并且对于堆栈来说它相当大(16M?)。您可以使用 malloc、new 或 std::vector 动态分配它。在文件的顶层,它是一个全局变量,因此在进程启动时分配。

于 2013-10-05T22:33:06.827 回答
2

考虑 的大小int res[2000+1][2000+1]。堆栈上的对象通常没有足够的空间,如果它被声明为局部变量,它将出现在堆栈上。

于 2013-10-05T22:34:08.513 回答
-1

为了让事情变得更容易,只需声明

int res[2000];

它将被分配。所以唯一的 pblm 是大小分配已达到局部变量的饱和点。

于 2013-10-06T06:35:53.643 回答