У меня странная проблема. Я написал простую программу на c (два исходных файла, соответствующие разделы показаны ниже). Когда я запускаю программу (у a.c есть основная функция), я получаю результат (поскольку количество раз, которое я вызываю "процесс" велико, я распечатываю последние несколько распечаток с вывода на экран):
ключ: 'Q'
ключ: 'A'
1
ключ: 'A'
ключ: 'A'
1
ключ: 'A'
ключ: «A»
1
ключ: «A»
ключ: «A»
ключ: «C»
Ошибка сегментации (дамп ядра)
a.c
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]);
}
}
b.c
int get_value (int * hash, char key) {
printf ("key: '% c' \ n", key);
return hash [get_index (key)];
}
< br>
void increment_value (int * hash, char key) {
int value = get_value (hash, key);
hash [get_index (key)] = ++ value;
}
У меня конкретный вопрос (конечная цель для меня - попытаться отладить, почему я получаю ошибку сегментации при большом количестве вызовов "процесса", а не на меньшем количестве вызовов), не должен ли я видеть распечатку вроде это:
ключ: 'Q'
1
ключ: 'A'
1
ключ: 'A'
1
ключ: 'A'
и т. д.
< br>
Почему я вижу напечатанные две буквы, прежде чем снова увижу 1? Это проблема переупорядочения буфера из-за того, что мои операторы выводятся на экран? Или это как-то моя программа c многопоточна за сценой?
Между прочим, эта же программа работает на моем ноутбуке с НАМНОГО БОЛЬШЕ набора входных данных:
Linux ubuntu 3.8.0-25-generic # 37-Ubuntu SMP чт, 6 июня 20:47:07 UTC 2013 x86_64 x86_64 x86_64 GNU / Linux
Но он прерывается с ошибкой сегментации, описанной выше, на гораздо меньшем вводе на другой машине:
Linux x.y.z 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
Любые идеи? Я ценю вашу помощь!
increment_value
вызываетget_value
, и вы вызываете каждый из них каждый раз в своем цикле, я бы не ожидал увидеть ожидаемые вами результаты. Я ожидал увидеть что-то более близкое к тому, что вы видите на самом деле.printf
ключа будет встречаться дважды для каждой итерации цикла, аprintf
1
только один раз. - person lurker   schedule 17.07.2013