1

私は奇妙な問題に遭遇しています。簡単な C プログラムを作成しました (2 つのソース ファイル、関連するセクションを以下に示します)。プログラムを実行すると (ac にはmain機能があります)、出力が得られます (呼び出す回数が多いため、process出力から最後のいくつかの出力を画面に出力しています)。

key: 'Q'
key: 'A'
1
key: 'A'
key: 'A'
1
key: 'A'
key: 'A'
1
key: 'A'
key: 'A'
key: 'C'
Segmentation fault (core dumped)

交流

void process(int* hash, char* input, int number_of_ac) {
    int value, i = 0;
    for(; i < number_of_ac; i++) {
        value = get_value(hash, input[i]);
        printf("1\n");
        increment_value(hash, input[i]);
    }
}

紀元前

int get_value(int* hash, char key) {
    printf("key: '%c'\n", key);
    return hash[get_index(key)];
}

void increment_value(int* hash, char key) {
    int value = get_value(hash, key);
    hash[get_index(key)] = ++value;
}

私の質問は具体的には (最終的な目標は、少数のprocess呼び出しではなく多数の呼び出しでセグメンテーション違反が発生する理由をデバッグしようとすることです)、次のような出力が表示されないはずです:

key: 'Q'
1
key: 'A'
1
key: 'A'
1
key: 'A'
etc.

再び 1 が表示される前に、2 つの文字が表示されるのはなぜですか? これは、ステートメントが画面に出力されるバッファの並べ替えの問題ですか? それとも、何らかの形で私の C プログラムが舞台裏でマルチスレッド化されているのでしょうか?

ちなみに、これとまったく同じプログラムが私のラップトップで実行され、はるかに大きな入力セットがあります。

Linux Ubuntu 3.8.0-25-generic #37-Ubuntu SMP Thu Jun 6 20:47:07 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

ただし、別のマシンのはるかに小さい入力で上記のセグメンテーション違反で壊れます。

Linux xyz 2.6.32-279.19.1.el6.cny6.7068.x86_64 #1 SMP Mon Mar 11 08:59:43 CDT 2013 x86_64 x86_64 x86_64 GNU/Linux

何か案は?よろしくお願いします!

4

1 に答える 1