下面的代码片段是一个正在运行的 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 平台上将索引 ( ) 增加两次?- win32 平台如何知道“跳过”char* 点两次以获得双倍? - sprintf_s 怎么知道在 win32 上从 oData(一个组合容器)中选择正确的字段?但是在win64上它崩溃了?
我认为这在某种程度上与 32 位和 64 位之间的指针大小不同,但我正在寻求您的帮助来解释这种行为。