【问题标题】:Program outcome changes depending on printf usage程序结果根据 printf 的使用而变化
【发布时间】:2015-03-08 16:05:15
【问题描述】:

这是造成此问题的代码;

#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");
}

程序输出的变化取决于我是否注释掉第 18 行中的 printf 函数调用。

没有 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

我希望在这两种情况下,计算的哈希值(在单词之后打印,与 : 分隔的单词)将是相同的。

我想知道这个问题的原因是什么。

我正在使用带有 gcc 4.8.1 版本的 MinGW 的 WinXp。

【问题讨论】:

    标签: c hash uint32


    【解决方案1】:

    函数simple_hash() 使用未初始化的hashbuffer[3] 值——难怪程序的输出变化不可预测。

    另请注意,转换规范 %p 不适用于 uint32_t 参数 - 正确的是 e。 g.

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

    【讨论】:

      猜你喜欢
      • 2015-10-03
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      相关资源
      最近更新 更多