首页 > 解决方案 > 在字符串分配中出现分段错误

问题描述

这是位掩码问题的部分代码。我有 n 组彩球,每组有 10 种球。对于每个集合,存在的球类型由位掩码字符串给出,例如“0000000001”表示仅存在一个类型的球。我正在为每个可能的“集合”组合创建 2^n 大小的数组,并将字符串分配给这些组合。在给定的代码段中,我为 2^n 数组中的每个单独的集合分配了相应的字符串/球分布。

此代码段使用 2^n 大小的字符串数组,并在 4 次分配后给出 seg-fault。我也尝试过使用 2^n 大小的整数数组,它在 10 次分配后给出 seg-fault。我也尝试过向量而不是数组。

该代码非常适合像 5、10 这样的小 n。但是,我收到 n=100 的错误。

#include <bits/stdc++.h>

using namespace std;

int main(){
    int n; cin>>n;
    int p[n]; string b[n];
    int maxNum=0, minCost=INT_MAX;

    for(int i=0; i<n; i++)  cin>>p[i]>>b[i];
    string arr[1<<n];
    for(int i=0; i<(1<<n); i++) arr[i]= "0000000000";

    for(int k=0; k<n; k++){  
        cout<<k<<" "<<b[k]<<endl;;
        arr[(1<<k)]= b[k];
    }

    cout<<minCost<<" "<<maxNum;

    return 0;
}

备用代码:

int main(){
    int n; cin>>n;
    int p[n]; int b[n];
    int maxNum=0, minCost=INT_MAX;

    int arr[1<<n]= {0};
    string st;
    for(int i=0; i<n; i++){ 
        cin>>p[i]>>st;
        bitset<32> bits(st);
        b[i]= bits.to_ulong();
    }
    
    for(int k=0; k<n; k++){  
        cout<<k<<" "<<b[k]<<endl;
        arr[(1<<k)]= b[k];
    }

    cout<<minCost<<" "<<maxNum;

    return 0;
}

测试输入:

100
825559123 1101000000
723927316 1100000000
630882051 0100000000
970018301 0000110000
802701997 0001000000
368727086 1000000000
941759437 0000000000
863301206 1000000000
158330925 1100100000
952862749 0000000000
102106508 0000000000
642189578 1010000000
416170041 0100000000
503483274 0000000000
926633515 0010000000
233734818 1000000000
169465305 0010000000
925756481 0001010000
380740929 0000000000
923546464 1000000000
352640896 1100000000
538094174 0000001001
884232717 1110000000
881618727 0000000100
341770070 1000000000
370990187 1000101000
818894502 0000000000
756416297 0000000000
750141952 1010000000
156721241 0000100000
352780300 1001000100
158047482 1000000000
277595007 1000010000
557738195 1001001000
577045284 0110010000
378282174 1001000000
171102340 0100000000
808446042 1000000000
492238964 0100110000
871761380 1001000000
106063154 0000000000
929340033 0000000000
826793542 1110000000
882429992 1110000000
353710255 1101000000
989939310 0100100010
932975557 1010000100
860332788 0100000000
138524161 0100000000
715186358 0110000000
105450969 1101000000
722369284 1011000000
285470513 0000100000
116472373 1100000000
114558691 1000000000
639736702 1001000000
494962263 1100000000
542209831 0000000000
177483931 1000000000
182207145 0000000000
846803150 0000000000
735034366 0100000000
266040888 0000000000
907666010 0000000000
977358840 1000000000
112286012 0000000000
622971034 0000100000
443656670 0000000000
607470566 0000000000
115391310 0010010100
565221300 1000000010
762620672 0001000000
604911457 1001100000
577865036 1100000000
825870042 0000000000
287371290 1010000000
127073701 1000000000
993638645 1000000000
590442752 1101000000
315610523 1000000000
129874582 0100000000
330774796 0000000000
180125061 1011000000
742953948 1100000000
254364525 1000010000
215720197 1010100000
187594300 1011000000
327723812 1100000000
562306542 0100100001
875275760 0000000000
559574213 0001000000
458791850 0000000000
266378640 0111000000
944284996 1000000000
169188494 0011000010
917209852 1001100000
905699840 0110000000
519566989 1000000000
237060575 0000000000
647909317 0010000000

标签: c++segmentation-fault

解决方案


1<<100 = 1267650600228229401496703205376. 您将无法创建这么大的数组。

如评论中所述,如果您要动态分配内存,则应使用new.

此外,使用#include <bits/stdc++.h>.


推荐阅读