繁体   English   中英

在字符串分配中出现分段错误

[英]Getting Segmentation fault in string assignment

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

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

该代码适用于像 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

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

正如评论中提到的,如果您动态分配内存,则应该使用new在堆上分配它。

此外,使用#include <bits/stdc++.h>不好的做法

1 << 100 == 0 ,因此您的arr将为空。 访问空数组会导致分段错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM