gpt4 book ai didi

c - 程序结果根据 printf 使用情况而变化

转载 作者:行者123 更新时间:2023-11-30 15:23:02 26 4
gpt4 key购买 nike

这是我的代码,导致了这个问题;

#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

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

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

我正在使用 WinXp 和 MinGW 以及 gcc 4.8.1 版本。

最佳答案

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

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

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

关于c - 程序结果根据 printf 使用情况而变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28928621/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com