-2

私はこのコードを書きます:

実行時に、行でエラーが発生します

cout<<it2->first;

test3.exeの0x00411eddで未処理の例外:0xC0000005:アクセス違反の読み取り場所0x00000004。 "

Visual StudioExpress2008とBoost1_47_0を使用しています。

これは私の完全なコードです:

#include "stdafx.h"
#include <iostream>
#include <boost/unordered_map.hpp>

using namespace std;

typedef boost::unordered_map<int,int > MAP;
        MAP map2;
        boost::unordered_map<int,int>::iterator it2;

void gen_random(char *s  ,char *p,int*  r,const int len);
void inline insert2(int i_key,int i_value);
void print();
//-----------main------------------------------------
void main()
{   
    char* s_key=new char[8];
    char* s_value=new char[8];
    int i_value=0, size_random=8;
    for(int i=0;i<12;i++)
    {
        gen_random(s_key,s_value,&i_value,size_random);
         insert2(i_value,i_value);
    }

        print();
    int a;
    std::cin>>a;
}
//-------------end main--------------------------------

//--------my function ---------------------------
//-------random--------------
void gen_random(char* s,char* p,int *r, const int len) {


    static const char alphanum[] =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz";
     (*r)=rand();

    for (int i = 0; i < len; ++i) {
        s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
         p[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
    }

    s[len] = 0;
    p[len] = 0;
}
//-----end random------------

    void inline insert2(int i_key,int i_value)
    {
        map2.insert(MAP::value_type(i_key,i_value));        
    }
    void print()
    {

    for(it2=map2.begin();it2 != map2.end();++it2 );
     {


         cout<<it2->first; 

     }

    }
//--------end function---------------------------
4

2 に答える 2

5

s [len] = 0; p [len] = 0;

配列の境界外に値を割り当てようとしてs[8]います。p[8]それらはとして宣言されているため、からへのchar[8]インデックス付けのみが可能です。07

于 2011-11-10T20:43:21.600 に答える
2

この線:

for(it2=map2.begin();it2 != map2.end();++it2 );

セミコロンで終わらせないでください。ループは実行されますが、それに続くコードのブロックには入りません。ループが完了すると、it2はに等しくなりmap2.end()ます。これが、使用しようとしたときにアクセス違反が発生する理由です。

スコープが小さい変数を使用すれば、この問題を回避できたはずです。たとえば、これによりコンパイラエラーが発生します(it2グローバルではなくなったと仮定)。

for(boost::unordered_map<int,int>::iterator it2 = map2.begin(); it2 != map2.end(); ++it2);
{
    cout<<it2->first;
}
于 2011-11-10T22:10:27.823 に答える