0

下面的代码片段是一个正在运行的 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. 为什么我应该J++在 win32 平台上将索引 ( ) 增加两次?- win32 平台如何知道“跳过”char* 点两次以获得双倍?
  2. sprintf_s 怎么知道在 win32 上从 oData(一个组合容器)中选择正确的字段?但是在win64上它崩溃了?

我认为这在某种程度上与 32 位和 64 位之间的指针大小不同,但我正在寻求您的帮助来解释这种行为。

4

2 回答 2

3

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

于 2012-07-19T14:54:58.350 回答
1

您发布的代码毫无意义。您似乎正在尝试使用数组作为一种临时方式来为可变参数函数准备可变参数序列?抱歉,它在 C 和 C++ 中都不起作用。根本没有办法为可变参数函数“准备”一系列可变参数。

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

于 2012-07-19T15:10:55.770 回答