关于zeromemory函数 与ascii unicode的bug与困惑

来源:互联网 发布:unity3d deltatime 编辑:程序博客网 时间:2024/06/06 09:36

//程序选择的编码方式unicode 但是由于程序的一些函数需要调用ascii函数 只能共同调用


#include <windows.h>

#include <iostream>



using namespace std;


//查找文件辅助结构
struct fileName  
{  
    char Fname[512];  
    fileName *pNext;  
}; 


int main()
{
char *source = new char[512];
char *str = "weisong\\";
strcpy(source, str);
char *dest = new char[512];
fileName *pHead = dedaowenjianliebiao(source);
while(pHead->pNext)
{
strcpy(dest, source);
strcat(dest, pHead->Fname);


cout << dest << endl;


cout << pHead->Fname << endl;
pHead = pHead->pNext;
}


return 0;
}


fileName *dedaowenjianliebiao(char *path)
{
fileName *pHead = NULL;
WIN32_FIND_DATAA FD;  
ZeroMemory(&FD,sizeof(WIN32_FIND_DATA)); //程序导致崩溃的地点 单步调试发现执行完此步path == null
HANDLE           Hand;  
char             FilePath[512];  
ZeroMemory(FilePath, 512);  
fileName  *p = new fileName;  
ZeroMemory(p, sizeof(fileName));  
fileName  *pTemp = pHead = p;  
 
strcpy(FilePath, path); //将路径复制给FilePath  


if (FilePath[strlen(FilePath)-1] != '//') //判断最后是不是"/"  
{  
strcat(FilePath,"//*");  //要加/*才能浏览本文件夹,注意双引号与单引号  
}  
  
Hand = FindFirstFileA(FilePath, &FD);
  
if (Hand == INVALID_HANDLE_VALUE)  
{  
return NULL;  //按照路径打开失败,则结束  
}  
else 
{
while(true)  
{  
        
if (FindNextFileA(Hand, &FD))  
{  
//创建链表保存文件名  
strcpy(p->Fname,FD.cFileName);  
p = new fileName;  
ZeroMemory(p,sizeof(fileName));  
pTemp->pNext = p;  
pTemp = p;  
}  
else 
{
break;  
}
}
}
  
FindClose(Hand);  


return pHead;

}



以上问题让人很困惑 后来发现问题出现在以下地方

WIN32_FIND_DATAA FD;  
ZeroMemory(&FD,sizeof(WIN32_FIND_DATA));

WIN32_FIND_DATAA的大小是WIN32_FIND_DATA它的一半 所以在清空的时候将path一起清空

导致复制的过程都失败了  程序崩溃了  

原创粉丝点击