- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面的代码片段是我正在逆向工程的一个正在运行的 SW 的提取和简化(我试图强调这个问题而不用所有的小细节来打扰你)。
在win64机器上构建以下代码导致运行时崩溃:
#include "stdafx.h"
#include <stdio.h>
#include <string>
#include <stdlib.h>
using namespace std;
struct vaArgLookAlikePtrs
{
char* pPtr[1000];
};
int _tmain(int argc, _TCHAR* argv[])
{
typedef std::basic_string<char> BasicString;
static char buffer[132000];
BasicString sFormatStr = "Var0=%s\nVar1=%.4f\nVar2=%d\n";
struct vaArgLookAlikePtrs oData;
void* pVoidPtr;
int j=0;
oData.pPtr[j] = "val0";
j++;
double dVar1 = 1.265;
pVoidPtr = (void*)(&(oData.pPtr[j]));
double* pDoublePtr = (double*)pVoidPtr;
*pDoublePtr = dVar1;
j++;// increment the buffer counter twice because doubles require 64 bits for storage (This is how it works on the 32 bit machine)
j++;
int nVar2 = 2;
pVoidPtr = &(oData.pPtr[j]);
int* pIntPtr = (int*)pVoidPtr;
*pIntPtr = nVar2;
sprintf_s(buffer,sFormatStr.c_str(),oData); // <-----
cout << buffer << "\n";
return 0;
}
我有几个问题:
J++
) 两次? - win32 平台如何知道两次“跳过”一个 char* 点以获得双倍数?我假设这是因为 32 位和 64 位之间的指针大小存在某种差异,但我正在寻求您的帮助来解释该行为。
最佳答案
原作者只是将 C 语句组合在一起,直到它对他有用为止。真的,对于这段代码没有其他解释。
关于c++ - sprintf_s 对 win64 和 win32 有特定的使用要求吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11556380/
我想写入数据到一个字符缓冲区。因此,我有一个格式化我的数据的功能。例如,我只是像这样将一个 int 值传递给函数: using namespace std; #include char* write
Visual Studio 提示我将 sprintf 替换为 sprintf_s,而不是 snprintf。 sprintf_s 不需要长度参数,它如何避免缓冲区溢出问题? 最佳答案 有两个版本。一种
我在使用 C/C++ 程序的 Windows 上的 Visual Studio 中收到“0xC0000005:访问冲突读取位置错误”,并尝试简化以说明我的问题。下面的代码运行得很好: char tmp
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我有一个使用 sprintf_s 的 C 程序。它在 Windows 中工作正常,但是当我在 Linux 中编译代码时,出现以下错误: sprintf_s was not declared in th
我在 sprintf_s 中偶尔执行以下代码时发生崩溃。这段代码工作了很多年,没有任何问题。当我按照下面的语句在 strcat_s 和 sprintf_s 中给出大小时,不会出现崩溃。这可能是什么原因
我遇到了问题。示例: try { char strMes[6]; sprintf_s(strMes, sizeof(strMes), "%s", "012345678"); p
我在使用这个函数时遇到了一个有趣的问题。我使用它如下: int nSeq = 1; char cBuf[8]; int j = sprintf_s(cBuf, sizeof(cBuf), "%08d"
包含 banned.h(微软安全工具之一)后,编译器警告我 sprintf() 函数不安全,MSDN 中心给了我使用 的建议sprintf_s,因为我的项目是跨平台的,所以我写了一个sprintf函数
以下代码会导致错误并终止我的应用程序。这是有道理的,因为缓冲区只有 10 个字节长,而文本有 22 个字节长(缓冲区溢出)。 char buffer[10]; int length = spri
我有一个使用 sprintf_s 的 C 程序。它在 Windows 中运行良好,但是当我在 Linux 中编译我的代码时出现此错误: sprintf_s was not declared in th
对于新项目,我应该更喜欢哪个功能?来自 strsafe.h 或 sprintf_s 的 StringCchVPrintf 最佳答案 我建议使用 snprintf如果您使用 C 编写代码(因为 snpr
我正在尝试创建一个类,比如说 MyClass,在以下条件下工作: MyClass name = "everyone"; // Assigns "everyone" into a local str
这是我从 int 到 char* 的转换: char* str = malloc(sizeof("0000")); int int_ = 10; sprintf_s(str, sizeof("0000
我有一个 C++ 应用程序,其中客户报告了一个崩溃。但是崩溃不容易重现。在分析了一些日志之后,我发现崩溃可能发生在以下代码部分之间。请告诉我,如果我在其中包含这些代码语句,应用程序是否有可能崩溃?
在 C++ 中,使用 VS2012,我想获取 Mac 地址并将其转换为汽车格式。我使用 sprintf_s function() 以便在汽车模式下进行转换。在 Debug模式下,一切正常,但在 Rel
我正在使用来自 C# 的 C++ dll(不是我的)。我使用 Console.SetOut 和 Console.SetError 成功地将 C# 控制台输出重定向到一个文件。 有什么办法可以从“外部”
我正在尝试使用 WCHAR 中的 sprintf_s 创建一个新字符串。我的代码如下所示: #include #include void main(int argc, char ** argv)
这是工作的原始代码: // ... unsigned __int64 num = 57; sprintf_s(buffer, sizeof(buffer), "%llu", num); 但是,当我尝试
我写了一个跨平台代码,给出了当前日期 (mm/dd/yy) 和时间 (hh/mm/ss) 和完整日期 (yyyymmdd),此代码适用于 windows(MSVS2015) 但不适用于Linux(GC
我是一名优秀的程序员,十分优秀!