sprintf_s 和访问冲突

pub*_*ess -2 c windows visual-c++

我一直在使用 C/C++ 程序在 Windows 上的 Visual Studio 中收到“0xC0000005:访问冲突读取位置错误”,并试图简化以说明我的问题。下面的代码运行得很好:

char tmp[1000];
ULONG64 val1 = 1;
sprintf_s(tmp, 1000, "%lu, %s, %s", val1, "true", "false");
Run Code Online (Sandbox Code Playgroud)

但是,当我向格式中添加额外的 unsigned long 时,会出现访问冲突,如下面的代码所示:

char tmp[1000];
ULONG64 val1 = 1;
ULONG64 val2 = 2;
sprintf_s(tmp, 1000, "%lu, %lu, %s, %s", val1, val2, "true", "false");
Run Code Online (Sandbox Code Playgroud)

Wea*_*ane 7

MSVC 上的格式说明符%luunsigned long32 位而不是 64 位。

所以堆叠的参数是错误的,MSVC 应该对此发出警告。

您可以对冲,%llu但最好使用正确的格式来保证与固定宽度变量的匹配。

如果类型是uint64_t然后例如在使用时printf你应该有

printf("%" PRIu64 "\n", val1);
Run Code Online (Sandbox Code Playgroud)

例如。