好的,我将保持这个简单,如果我不需要,还不包括所有代码。我内心的感觉告诉我,这可能是一个简单的答案,我像往常一样忽略了它。更缺乏经验的人可能会说编译器是问题,但是我从来都不知道99.999%的情况下,在某种程度上它一直是我的错误所以......这是一个问题。 我有一个程序,这个程序应该输出两个字符串,没什么花哨的
TCHAR* firststring = _T("FirstValue");
TCHAR* secondstring = _T("SecondValue");
_tprintf(_T("%s\n"),firststring);
_tprintf(_T("%s\n"),secondstring);
输出..
firststring
在我的代码的特定部分,这不起作用(它在其他地方工作)除非我正在调试......然后它很好......
firststring
secondstring
我甚至尝试将操作合并为一个:
_tprintf(_T("%s\n[%s]\n"),firststring,secondstring);
我的结果是,第一个字符串和大括号是试图指出该字符串正在尝试打印出来,如果它是空的,等等。我得到这个输出:
firststring
]
而且就是这样..再次,除了步调调试,然后一切都很好和花花公子:
firststring
[secondstring]
有没有人听说过像这样的问题?我最后一次遇到这样奇怪的问题是在ASM时代回到了段对齐但是我怀疑这是不是这样,虽然我不确定_tprintf的内部工作方式......如果没有人我会再试一次知道,我会假设它是因为早先的代码引起的错误。主要的问题是,这是否由于任何简单的原因而发生,或者这只是指向程序早期的问题,就是这样。谢谢你的回复。
PS:我意识到我没有提供足够的代码来完全解决问题,但问题是调试器中是否存在这种行为的已知简单原因(运行与步进) 。断点设置在函数级别,我使用的是Visual Studio 2008.编译器版本如下:Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 80x86
Microsoft (R) Macro Assembler Version 9.00.21022.08
Microsoft (R) Incremental Linker Version 9.00.21022.08
Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
Microsoft Browse Information Maintenance Utility Version 9.00.21022
Microsoft (R) Manifest Tool version 5.2.3790.2075
答案 0 :(得分:0)
我后来通过将这些字符串从TCHAR *更改为const TCHAR *解决了这个问题 当使用只读字符串时,它应该是未定义的行为,用字符串文字写一个字符串数组。我不确定是不是因为文档本身被存储为unicode 或者如果它甚至有一部分可以玩,但我学会了很难不分配这样的东西。如果我需要写入那些位置,我应该使用一个单独的常量字符串,并在读取/写入缓冲区中需要时使用strcpy复制它的内容。显然不这样做会导致安全漏洞和其他陷阱出现在代码中,即使它很简单。
(以下是我对部分代码的推理 - 如有兴趣请将鼠标移过来)
至于代码示例不完整,它是一个非常大的项目,有成千上万行代码,我几乎不希望这里的任何人花费太多时间来完成所有这些。毕竟,它不像这里的任何人都有报酬这样做,我真的只需要知道是否是我,或者这是否是一个常见的事情,如果它是一个常见的事情,如何解决它。当我们在这里提出问题时,我们不仅会问一个问题,而且我们也会就我们期望得到答案的范围有多广泛的指导,而且我们绝不期望任何人都会像某些人一样建议。如果你不想回答一个问题,或者没有足够的信息让你这么做,那就不要那么简单了(因为我们没有首先得到的所有信息)