私は奇妙な問題に遭遇しています。簡単な 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
何か案は?よろしくお願いします!