sprintf_s是否具有win64与win32的特定使用要求?

时间:2012-07-19 08:01:29

标签: c++ winapi win64

以下代码片段是对正在运行的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;
}

我几乎没有问题:

  1. 为什么我要在win32平台上增加索引(J++)两次? - win32平台如何知道“跳过”两次char *点两次?
  2. sprintf_s如何知道从win32上的oData(合成容器)中选择正确的字段?但在win64上崩溃了吗?
  3. 我认为这是指针大小在32位和64位之间的差异,但我正在寻求你的帮助来解释这种行为。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

您发布的代码毫无意义。您似乎试图使用数组作为ad-hock方式为可变参数函数准备可变参数序列?对不起,它在C和C ++中都不起作用。对于可变参数函数,根本没有办法“准备”一系列可变参数。

如果您正在尝试实施某种丑陋的黑客攻击,那么请继续攻击sprintf_s的实现。也许你会以某种方式让它工作。但这与C ++语言无关。而且充其量也毫无意义。