2015-03-08 2 views
0

Вот мой код, который создает эту проблему;Изменения результатов программы в зависимости от использования printf

#include <stdint.h> 

#define HASHPRINT(STRING) printf(STRING ": %p\n", simple_hash(STRING)) 

uint32_t simple_hash(const char *string) { 
    uint32_t hash; 

    char buffer[4]; /* 4 bytes = 32 bits */ 
    const char *c; 
    int i = 0; 

    for(c=string; *c!=0; c++) { 
     buffer[i] = *c; 
     i++; 
     if (i == 3) { 
      i=0; 
      printf("\nAdding %u to hash\n", *((uint32_t *)buffer)); 
      hash += *((uint32_t *)buffer); 
      hash = hash^*((uint32_t *)buffer); 
     } 
    } 

    if (i > 0) { 
     hash += *((uint32_t *)buffer); 
     hash = hash^*((uint32_t *)buffer); 
    } 

    return hash; 
} 

void main() { 
    HASHPRINT("yasar"); 
    HASHPRINT("rasay"); 
    HASHPRINT("arsay"); 
    HASHPRINT("yasra"); 
    HASHPRINT("osman"); 
    HASHPRINT("ali"); 
    HASHPRINT("veli"); 
} 

выход программы изменяется в зависимости от того, если я закомментировать или нет вызова функции Printf в строке 18.

Без Printf, моя программа выводит следующее:

yasar: 7D90F834 
rasay: 00000005 
arsay: 00000003 
yasra: 00000001 
osman: 00000003 
ali: 00000001 
veli: 00000005 

Если я включаю Printf функция, я получаю этот вывод вместо этого;

Adding 2004050297 to hash 
yasar: 0F2400A0 

Adding 7561586 to hash 
rasay: 78C921B4 

Adding 7565921 to hash 
arsay: 78C94C94 

Adding 7561593 to hash 
yasra: 78C92194 

Adding 7172975 to hash 
osman: 78DD7FAC 

Adding 6909025 to hash 
ali: 7842A494 

Adding 7103862 to hash 
veli: 78C3698C 

Я хотел бы ожидать, что в обоих случаях расчетные значения хеш-функции (которые печатаются после слова, разделенным от слова с :) будет то же самое.

Я задавался вопросом, что послужило бы причиной этой проблемы.

Я использую WinXp с MinGW с версией gcc 4.8.1.

ответ

1

Функция simple_hash() использует неинициализированные значения hash и buffer[3] - неудивительно, что выход программы изменяется непредсказуемо.

Отметьте также, что спецификация преобразования %p не подходит для uint32_t аргументов - правильно было бы e. г.

#include <inttypes.h> 
#define HASHPRINT(STRING) printf(STRING": %08"PRIx32"\n", simple_hash(STRING))