【发布时间】:2021-02-25 13:13:58
【问题描述】:
我正在用 C 语言创建一个函数,该函数使用一个 for 循环检查重复字符,该循环更新一个数组以说明以前是否见过一个字符。
int duplicate(string key, int key_length)
{
int seen[256];
for (int i = 0; i < key_length; i++)
{
seen[(int)key[i]] += 1;
}
for (int i = 0; i < 256; i++)
{
printf("%i ", seen[i]);
}
return 1;
}
当我使用测试字符串(例如 fhfkkdkdjrbrhrjrotorrjekwl)运行代码时,程序的输出是:
-268375615 32516 1286666352 32765 1286666368 32765 -268328471 32516 4 0 -268415848 32516 9 0 0 0 1 0 -268187160 32516 1286666436 32765 -268415848 32516 -268187160 32516 -268184328 32516 0 0 1287397800 32765 -268225857 32516 1 0 -1 0 1286666436 32765 -274155632 32516 -268419360 32516 1286666928 32765 1286666416 32765 1286666672 32765 -268309317 32516 -268191943 32516 -268301364 32516 -268191934 32516 -268374096 32516 1286666768 32765 7 0 7 8 -268376704 32516 -268187160 32516 -268321004 32516 9 0 -268318823 32516 1286666592 32765 -274072912 32516 -268419360 32516 0 0 1286666720 32765 0 0 0 0 0 0 -268376080 32516 -268184328 32516 1286666720 32765 -268378111 32516 -268375530 32517 -268376894 32516 -268189622 32516 3 4 2 0 -274155632 32518 -268375296 32516 1230 0 43 0 0 1 0 0 0 0 0 0 0 0 -274197488 32516 899256888 1615131 0 0 -268185200 32516 -8 -1 -268271904 32516 1286667280 32765 -268359765 32516 0 0 0 0 0 0 0 0 0 0 1 0 -268183808 32516 -274195584 32516 -268185248 32516 1286666753 32765 -268187160 32516 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32 0 0 0 0 0 0 1 0 61765110 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 576 832 896 896 960 1472 2496 2496 2496 2496 2496 2496 2496 2496 2496 2496 2496 2496 2496 2496 2496 2496 2496 2496 2496 2496 2496 2496 2496 2496 0 0 256 64 0 64 512 1024 0 0 0 0 0 0 0 0 0 0 0 0
但是,当我在调试器中单步执行该函数时,它会输出:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 2 1 2 0 2 0 3 4 1 0 0 2 0 0 6 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
这是我期望它做的。
我在这里做错了什么,为什么它在调试器中可以正常工作,但在代码正常运行时却不行?
【问题讨论】:
-
启用所有警告,您会立即看到问题
-
如果没有有关您正在使用的软件和您用于构建的开关的信息,就无法确定性地回答为什么代码在调试器中表现不同的问题。如果您为调试而构建程序的方式不同,那么所涉及的编译器开关可能会改变一些程序数据布局......
-
… 一些调试器在被调试程序“外部”运行,使用操作系统特性来控制目标程序。对于那些调试器,是否使用调试器不应该影响程序行为,除了时序。但是有些调试器可能会在被调试的程序“内部”执行,它们更容易影响程序的行为。不过,我希望现在在现代通用操作系统中这种情况会越来越少。
-
@EricPostpischil:也有可能调试 build 恰好为此阵列使用了之前未触及的新堆栈空间,但优化的构建使用了之前被弄脏的空间. (MSVC 会在调试版本中使用
memset(buf, 0xCC, size)“毒化”未初始化的内存,但其他编译器不会。)