0

このコードを実行すると、セグメンテーション違反が発生しますが、変更resultするblahと問題なく動作します。私は、signed/unsigned、sscanf/atoi、initializing/not、int/char のすべての順列を試し、引数としてではなくポインターを直接使用することさえ試みました。

char* が null でないことはわかっています。唯一の変更点は、変数の名前です。

誰がこれを引き起こすのか知っていますか? 単純に怪しい…

編集: このファイルのスコープには他の変数はありません。

編集: に関連しているようreturnです。使用した値を返すと、エラーが発生しますが、クラッシュする前に制御が関数を離れることはありません。

unsigned int getHashValue(char* key, char** table, unsigned int tableCount) 
{
    int i = 0;
    //unsigned int length = strnlen(key,1024);
    unsigned int length = 1024;
    printf("Hashing...\n");
    unsigned int blah;
    int result;

    for (i=0;i<tableCount;i+=2) 
    {
        printf("i: %i\n",i);
        if (strncmp(key,table[i],length)==0) 
        {
            printf("found %s\n", table[i+1]);
            /*sscanf()*/
            result = (unsigned int) atoi(table[i+1]);
            //blah = atoi(table[i+1]);
            //sscanf(table[i+1],"%i",&result);
            return result;
        }
    }

    printf("..done\n");

    return 0;
}
4

1 に答える 1

0

if (strncmp(key,table[i],length)==0)ループは続くので、i < tableCounti が table の境界内にあるという保証はありtable[i]ますが、 strncmp が期待する文字列へのポインタであるという保証はありません。if (table[i] != NULL && strncmp(key, table[i], length) == 0) ...この未定義の動作を解決するために提案します。

プログラムが未定義の動作を使用すると、非常に奇妙な方法で失敗する可能性があります。

i+1が指す配列の範囲内にあるという保証はありませんtable。未定義の動作を解決するには、適切な境界チェックを実装してください。

さらに、それが文字列を指しているという保証はないようです。が の境界内にあるがNULLのprintf("found %s\n", table[i+1]);場合にどうなるかを考えてみましょう。アトイも同様です。i+1tabletable[i+1]

于 2013-02-19T00:30:27.937 に答える