0

以下に、指定された文字列 (str) の置換文字列を構築するメソッドを示します。理由はよくわかりませんが、デバッグ中に次の例外が発生することがあります。

Unhandled exception at 0x01282665 in test.exe: 0xC0000005: Access violation 
writing     location 0x00000000.

ret_str (ret_str[l]=elem[0]) のインデックス 0 に ('u') を代入しようとしたとき

unsigned char* getPermStr(long length,unsigned char* strt,unsigned char* elem){
    unsigned char* ret_str;
    long l = 0;
    ret_str = (unsigned char*) calloc(length,sizeof(unsigned char));
    while(l < length){
        if(elem < (strt+length-1)){
            ret_str[l]=elem[0];  // ACCESS VIOLATION HERE
            elem+=1;
        }else{
            ret_str[l]=elem[0];
            elem = strt;
        }
        l+=1; 
    }
    return ret_str;
}

アクセス違反が発生する理由がわかりません... ret_str の範囲内にいるのに、何が問題なのですか? ところで: 文字列 ret_str は、関数呼び出しの後に解放されます。

更新: elem に問題はありませんでした。その理由は、動的割り当て用のヒープにメモリが残っていないときにメモリを割り当てたため (大量のメモリ リークのため)、calloc が NULL ポインターを返したためです。そのため、エラーが発生しました。

4

2 に答える 2

1

elem が null かどうかを確認する必要があります。null の場合、関数はエラー コードを返す必要があります。

于 2012-10-19T12:25:09.807 に答える
0

ret_str = (unsigned char*) calloc(length,sizeof(unsigned char)); この行を次のように変更します

ret_str = malloc(length * sizeof(unsigned char));
if(ret_str == NULL){ return "" ;}
//--whatever
while(l < length){
        if(elem < (strt+length-1)){
            ret_str[l]=elem[0];  // ACCESS VIOLATION HERE
            elem+=1;
        }else{
            ret_str[l]=elem[0];
            elem = strt;
        }
        l+=1; 
    }

また、elem にアクセスできることも確認してください。おそらく elem は初期化されていません。

于 2012-10-19T12:06:51.147 に答える