DWORD disk_serialINT[MAX_PATH + 1];
GetVolumeInformationA(NULL, NULL, NULL, disk_serialINT, NULL, NULL, NULL, NULL);
char* disk_serialANSI;
sprintf(disk_serialANSI, "%d", disk_serialINT);
std::string HDDserial = disk_serialANSI;

这是我获取硬盘序列号的一段代码,但问题是每次程序执行时的值都不一样。有人可以解释一下吗?

解决了:
DWORD disk_serialINT;
GetVolumeInformationA(NULL, NULL, NULL, &disk_serialINT, NULL, NULL, NULL, NULL);
std::string HDDserial = std::to_string(disk_serialINT);

谢谢。

最佳答案

这两行会给你 undefined behavior :

char* disk_serialANSI;
sprintf(disk_serialANSI, "%d", disk_serialINT);

您声明了一个指针变量,但实际上并没有让它指向任何地方。未初始化的局部变量具有不确定的值(实际上它看起来是随机的),并且通过使用未初始化的指针,您不知道 sprintf 调用将写入何处。

由于您使用 C++ 进行编程,因此有几种解决方案。
  • 老式的做法是让 disk_serialANSI 成为一个字符数组,大到足以容纳数字(包括字符串终止符)。另一种方法是手动为指针分配内存,然后在完成后再次释放该内存。
  • 使用 std::ostringstream 格式化数据并获得 std::string
  • 使用 std::to_string 直接转换为字符串。
  • 使用 Boost Lexical cast
  • 关于c++ - GetVolumeInformation() 导致不同的磁盘序列号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28193644/

    10-11 16:30