Моя программа c по умолчанию многопоточна или stdout меняет порядок моих операторов печати?

У меня странная проблема. Я написал простую программу на 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

Любые идеи? Я ценю вашу помощь!


person user2589308    schedule 16.07.2013    source источник
comment
Компилятор не будет тайно выполнять многопоточность вашего кода. Ошибка сегментации - явный индикатор того, что у вас где-то есть неопределенное поведение. Вы, вероятно, где-то переполняете буфер, но здесь недостаточно информации; Я предлагаю создать минимальный тестовый пример.   -  person Oliver Charlesworth    schedule 17.07.2013
comment
Поскольку increment_value вызывает get_value, и вы вызываете каждый из них каждый раз в своем цикле, я бы не ожидал увидеть ожидаемые вами результаты. Я ожидал увидеть что-то более близкое к тому, что вы видите на самом деле. printf ключа будет встречаться дважды для каждой итерации цикла, а printf 1 только один раз.   -  person lurker    schedule 17.07.2013


Ответы (1)


Посмотрите, как вы называете значение приращения:

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

поэтому вы печатаете здесь символ и снова вызываете get_value в функции процесса. Вот почему вы получаете несколько отпечатков символов перед '1'

person Amadeus    schedule 16.07.2013
comment
Это моя ошибка. Я должен был увидеть этот звонок. Я потратил большую часть своего времени на извлечение соответствующего кода и размышления об ошибке seg: я не заметил, как моя собственная функция дважды вызывала get_value перед выводом 1. - person user2589308; 17.07.2013