0

好的,如果我不需要,我将保持这个简单并且不包括所有代码(还)。我的内在感觉告诉我,这可能有一个简单的答案,而我像往常一样忽略了它。更有经验的人可能会说编译器是问题所在,但我从来不知道在 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
4

1 回答 1

0

我后来通过将这些字符串从 TCHAR* 更改为 const TCHAR* 解决了这个问题,当使用只读字符串时,使用字符串文字编写字符串数组被认为是未定义的行为。我不确定是不是因为文档本身被存储为 unicode,或者这是否有作用,但我学会了不这样分配的艰难方法。如果我需要写入这些位置,我应该使用单独的常量字符串,并在我需要它在读/写缓冲区中时使用 strcpy 复制它的内容。显然不这样做会导致代码中出现安全漏洞和其他陷阱,即使它很简单。

(以下是我对部分代码的推理——如果有兴趣,请鼠标悬停)

至于代码示例不完整,这是一个非常大的项目,包含成千上万行代码,我几乎没想到这里有人会花这么多时间来完成所有工作。毕竟,这里的任何人都没有报酬这样做,我真的只需要找出是我还是这是否是常见的事情,如果是常见的事情,如何解决它。当我们在这里提出问题时,我们不仅是在提出问题,而且还在就我们期望答案的范围提供指导,而且我们绝不会期望任何人像某些人那样清楚建议。如果您不想回答问题或者没有足够的信息让您这样做,那么就不要那么简单(这是因为我们没有一开始就要求的所有信息) .

于 2013-05-24T14:47:32.037 回答