本帖最后由 mxwawaawxm 于 2022-7-7 08:24 编辑
[C] 纯文本查看 复制代码 #include <windows.h>
#include <stdio.h>
#include <stdlib.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
// 获取驱动器根路径字符串的长度
DWORD nBufferLength = GetLogicalDriveStrings(0, NULL);
printf("%lu\n", nBufferLength);
if (nBufferLength!=0) {
// 分配内存,用以存储驱动器的根路径
PTSTR lpBuffer = (PTSTR)malloc(sizeof(TCHAR)*nBufferLength);
GetLogicalDriveStrings(nBufferLength, lpBuffer);
// 依次打印驱动器的根路径
for (int i=0; i<nBufferLength; i+=4) {
if (*(lpBuffer+i)!='\0') {
printf("%s\n", lpBuffer+i);
} else {
break;
}
}
free(lpBuffer);
}
return 0;
}
以上的代码,主要是调用了GetLogicalDriveStrings函数,把驱动器根路径存储到lpBuffer的内存空间。从结果看出,我本机主要是有3个盘,存储至lpBuffer的内存空间共需要13个字节
但我查看https://docs.microsoft.com/en-us ... ogicaldrivestringsw的函数说明
发现其中对返回值有这样的一串说明,
If the function succeeds, the return value is the length, in characters, of the strings copied to the buffer, not including the terminating null character.
当函数成功执行,返回的是不包含结尾空字符的长度。那这样返回的nBufferLength长度应该是12,但为什么这里返回的是13?
[C] 纯文本查看 复制代码 DWORD nBufferLength = GetLogicalDriveStrings(0, NULL);
另外,这里的说明写着
nBufferLength,The maximum size of the buffer pointed to by lpBuffer, in TCHARs. This size does not include the terminating null character. If this parameter is zero, lpBuffer is not used.
第1个参数nBufferLength指明的大小不包含结尾的'\0'字符。那为什么GetLogicalDriveStrings(nBufferLength, lpBuffer);这一行代码,我写成[C] 纯文本查看 复制代码 GetLogicalDriveStrings(nBufferLength-1, lpBuffer);
最后的打印结果反而出错。无法打印出E:\盘。
所以,请问大佬们GetLogicalDriveStrings的参数nBufferLength到底有没有包含最后的'\0'字符,这个函数的返回值的长度,有没有包含最后的'\0'字符。
|