Winapi获取文件名,放入函数时出现怪异行为

时间:2018-11-19 16:43:59

标签: c++ function

注意:标题可能与问题无关,因为我不明白问题的出处。

问题:我有一段代码从目录获取文件名并将其附加到vector < char* >。 它可以正常工作,但是如果我将其包装在函数中,则会产生奇怪的行为,结果矢量元素将在控制台中打印单个随机字符,而不是文件名。 我已经检查并重新检查了所有内容,但看不到为什么发生。

下面是完整的可运行代码,我在Windows上使用cl.exe对其进行了编译 即cl.exe "a.cpp" /EHsc。 x64本机环境和目标。

我将这两部分放在一起,以便于测试。

#include <windows.h>
#include <iostream>
#include <vector>

using namespace  std;

void  getimglist ( const char*  mask,  vector < char* > & flist )
{
WIN32_FIND_DATA         data;
HANDLE              hFind;

hFind = FindFirstFile ( mask, & data );
cout << "-fname: " << data.cFileName << "\n";
flist.push_back ( data.cFileName ); 
FindClose ( hFind );
}

int main  (int argc,  char* argv[]) 
{
vector < char* >    L ;
vector < char* >    L2 ;
const char*     mask = ".\\input-cam0\\*.jpg";
const char*     mask2 = ".\\input-cam0\\*.jpg";

//  this code works 
WIN32_FIND_DATA         data;
HANDLE              hFind;

hFind = FindFirstFile ( mask, & data );
cout << " first file: " << data.cFileName << "\n";
L.push_back ( data.cFileName ); 
FindClose (hFind);
// ***

cout << " size:" << L.size() << "\n";
cout << " first file L:" << L[0] << "\n";


// this works weird, output is different and wrong
cout << " ** function call **\n";
getimglist ( mask2, L2 );
cout << " size:" << L2.size() << "\n";
cout << " first file: " << L2[0] << "\n";

return 0;

} // end main

输出:

 first file: 000-001.jpg
 size:1
 first file L:000-001.jpg
 ** function call **
-fname: 000-001.jpg
 size:1
 first file: R 

请参阅最后一行^,这里是R,如果我多次运行exe文件,它将显示单个随机字符。来自main块的结果给出了正确的结果。问题出在哪里?

1 个答案:

答案 0 :(得分:1)

WIN32_FIND_DATA data在堆栈上分配,当变量超出范围时(在这种情况下,在函数末尾),堆栈内存被破坏。这意味着您存储在向量中的指针不再指向有效地址。当您打印它时,应用程序会愉快地打印指定内存段中的所有内容。

简单的解决方法是将字符串复制到新变量中,首选的方式是将向量更改为vector<std::string>。您仍然可以调用flist.push_back ( data.cFileName ),编译器将为您复制字符数组到std::string中。