c-理论和实践中未定义的行为

我很早以前就有别人写的大型C项目.它包含如下代码:

string CVersion::GetVersionStr() const
{
  string ret;
  char VersionStr[100];
  DWORD v1, v2, v3, Build;
  GetVersion(&v1, &v2, &v3, &Build);
  sprintf(VersionStr, "%d.%d.%d.%d", v1, v2, v3, Build);
  return string(VersionStr);
}

现在,我认为由于格式说明符(%d)错误,此代码具有未定义的行为.

我的PC上的DWORD被声明为

typedef unsigned long DWORD;

我的问题是:

>代码是否包含未定义的行为?
>是否有任何平台/环境不会出现不确定的行为?也许对于v1的某些值可以吗?
>该软件已经正常运行了很长时间,因此,尽管上述行为不确定,但在实践中该软件仍然可以正常工作吗?

PS.该软件是十年前使用Visual Studio编写的

最佳答案
是的,如果DWORD是无符号长整数,则该行为是不确定的.正确的格式说明符是%lu.

因为未定义的行为就是这样,所以您的第二个和第三个问题没有意义.

为什么不使用std :: stringstream之类的东西来利用<&lt ;?

转载注明原文:c-理论和实践中未定义的行为 - 代码日志