C++ sprintf_对win64和win32是否有特定的使用要求?

C++ sprintf_对win64和win32是否有特定的使用要求?,c++,winapi,win64,C++,Winapi,Win64,下面的代码片段是对正在运行的SW I am reverse engineering的提取和简化(我试图强调这个问题,但没有用所有的小细节来打扰您) 在win64计算机上生成以下代码会导致运行期间崩溃: #include "stdafx.h" #include <stdio.h> #include <string> #include <stdlib.h> using namespace std; struct vaArgLookAlikePtrs {

下面的代码片段是对正在运行的SW I am reverse engineering的提取和简化(我试图强调这个问题,但没有用所有的小细节来打扰您)

在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;
}
#包括“stdafx.h”
#包括
#包括
#包括
使用名称空间std;
结构vaArgLookAlikePtrs
{
char*pPtr[1000];
};
int _tmain(int argc,_TCHAR*argv[]
{
typedef std::basic_字符串BasicString;
静态字符缓冲区[132000];
基本字符串sFormatStr=“Var0=%s\nVar1=%.4f\nVar2=%d\n”;
结构vaArgLookAlikePtrs-oData;
void*pVoidPtr;
int j=0;
oData.pPtr[j]=“val0”;
j++;
双dVar1=1.265;
pVoidPtr=(void*)(&(oData.pPtr[j]);
double*pDoublePtr=(double*)pVoidPtr;
*pDoublePtr=dVar1;
j++;//将缓冲区计数器增加两次,因为double需要64位存储(这是它在32位机器上的工作方式)
j++;
int nVar2=2;
pVoidPtr=&(oData.pPtr[j]);
int*pIntPtr=(int*)pVoidPtr;
*pIntPtr=nVar2;

sprintf_s(缓冲区,sFormatStr.c_str(),oData);//原作者只是将C语句组合在一起,直到它对他起作用。真的,对于这段代码没有其他解释。

原作者只是将C语句组合在一起,直到它对他起作用。真的,对于这段代码没有其他解释。

你发布的代码毫无意义。你是EEM试图使用数组作为一种广告方式来为一个变量函数准备变量的参数序列?抱歉,它既不在C中也不在C++中工作。根本没有办法为变量函数“准备”一系列变量的变量。

如果你试图实现一种丑陋的黑客,那么就要继续执行<代码> Spastfss。也许你可以用它来工作。但是这与C++语言无关。而且它毫无意义。

< p>你所发布的代码毫无意义。你似乎试图用数组作为一种广告方式。为变量函数准备变量变量序列?抱歉,它既不在C中也不在C++中工作。根本没有办法为变量函数“准备”一系列变量的参数。< /P>

如果你试图实现一种丑陋的黑客,那么就要继续执行<代码> Spastfss。也许你可以用它来工作。但是这与C++语言无关。而且它毫无意义。

我不去做什么代码。只有一件事:<代码> sieZOF(空洞*)
==4在32位上,8在64位上。这意味着指针的大小是32位还是64位取决于平台。
sprintf_s(buffer,sFormatStr.c_str(),oData);
这毫无意义。幸运的是,它在32位也没有崩溃。我认为将错误数量的参数传递给变量函数是未定义的行为。lucky,不幸的是,观点不同。代码在任何情况下都是错误的。不要“修复”改写。现在甚至还没有接近正确的C++。@ MsAlter:你完全正确,这是我的计划,我想知道它是如何工作的,原因是什么……我不去做什么代码。只有一件事:<代码> sieOf(空洞*)==4在32位上,8在64位上。这意味着指针的大小是32位还是64位取决于平台。
sprintf_s(buffer,sFormatStr.c_str(),oData);
这毫无意义。幸运的是,它在32位也没有崩溃。我认为将错误数量的参数传递给变量函数是未定义的行为。lucky,不幸的是,观点不同。代码在任何情况下都是错误的。不要“修复”改写。现在甚至还没有接近正确的C++。@ MalSalt:你完全正确,这是我的计划,我想知道它是如何工作的,原因是什么……