gpt4 book ai didi

c++ - sprintf_s 对 win64 和 win32 有特定的使用要求吗?

转载 作者:行者123 更新时间:2023-11-27 23:22:54 25 4
gpt4 key购买 nike

下面的代码片段是我正在逆向工程的一个正在运行的 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 上它崩溃了?

我假设这是因为 32 位和 64 位之间的指针大小存在某种差异,但我正在寻求您的帮助来解释该行为。

最佳答案

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

关于c++ - sprintf_s 对 win64 和 win32 有特定的使用要求吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11556380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com