【问题标题】:Using Win32 ReadFile and malloc使用 Win32 ReadFile 和 malloc
【发布时间】:2011-07-29 01:50:54
【问题描述】:

我的动态分配变量用 SecureZeroMemory 修整,然后 ReadFile 用一个短的 5char 字符串和一堆剩余的方块填充它。问题是字符串末尾的垃圾字符:

“电机驱动器”

ReadFile 的 lpNumberOfBytesRead 参数显示字符串是 10 个字符,可能是因为它是 Unicode?​​p>

有人可以帮我看看如何删除这些尾随的垃圾字符吗?有没有像 ZeroMemory 这样的函数来清除它们?

TCHAR *sIncoming;
sIncoming = (TCHAR *) malloc(sizeof(TCHAR) * 4096 +  sizeof(TCHAR));
RtlZeroMemory(sIncoming ,sizeof(sIncoming));

// (a string array with no characters in it: "")

bSuccess = ReadFile(hPipe,sIncoming ,BUFSIZE*sizeof(TCHAR),&dwBytesRead,NULL);

// Now the string array has the incoming string plus extra characters in it: 
//    "motor췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍"

free(sIncoming);

谢谢!

【问题讨论】:

  • 在对 malloc 的调用中也使用 BUFSIZE,而不仅仅是在对 ReadFile 的调用中。

标签: malloc readfile


【解决方案1】:

零终止(当然是在成功调用ReadFile之后):

sIncoming[dwBytesRead/sizeof(TCHAR)] = 0;

注意:注意缓冲区限制。

完全拼接到你的代码中:

#define BUFSIZE 4096
TCHAR *sIncoming;
sIncoming = (TCHAR *) malloc(sizeof(TCHAR)*BUFSIZE+sizeof(TCHAR));
bSuccess = ReadFile(hPipe,sIncoming ,BUFSIZE*sizeof(TCHAR),&dwBytesRead,NULL);
if(bSuccess)
  sIncoming[dwBytesRead/sizeof(TCHAR)] = 0;
free(sIncoming);

编辑:删除了 RtlZeroMemory 调用,因为它不是绝对必要的。只需确保以零结尾接收到的 C 字符串即可。

【讨论】:

  • 好的!谢谢!或者删除 RtlZeroMemory 并根据 Erik 放入 calloc?
  • @JeffR:是的,不需要 RtlZeroMemory。无论是 malloc 还是 calloc 都只是口味问题 - 它是化妆品。重要的是 C 字符串是以零结尾的。你收到的显然不是。因此,您必须注意这一点。
  • @JeffR:我从我的回答中删除了RtlZeroMemory 电话。
  • 如果传入的字符串以空字符结尾怎么办?将做 sIncoming[dwBytesRead/sizeof(TCHAR)] = 0;有什么问题吗?
【解决方案2】:

sizeof(sIncoming) 是指针的大小。你想要 sizeof(TCHAR) * 4097。或者只使用 calloc。

【讨论】:

  • sizeof(TCHAR) * 4096 + sizeof(TCHAR) == sizeof(TCHAR)*4097
  • 其实sizeof(TCHAR) * BUFSIZE ...如果分配多一个字符来保存终止零。代码中的想法是,我们在缓冲区中为一个字符分配的空间比我们从管道中请求的要多。
  • 没有使用 BUFSIZE,因为它在 OP 帖子中未显示为正确。但是是的,正确的常量会更好
  • 所以:TCHAR sIncoming; sIncoming= (TCHAR *) calloc(sizeof(TCHAR) * BUFSIZE + sizeof(TCHAR)); ReadFile(hPipe,sProdID,BUFSIZEsizeof(TCHAR),&dwBytesRead,NULL); sProdID[dwBytesRead/sizeof(TCHAR)] = 0; ?
  • 然后使用 (BUFSIZE + 1)*sizeof(TCHAR),或者像 STATUS 建议的那样使用零终止
猜你喜欢
  • 2014-09-25
  • 2012-09-21
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 2021-01-30
  • 2013-05-07
相关资源
最近更新 更多