如何为结构成员分配其他函数返回的值?

时间:2012-12-12 18:15:51

标签: c++ multithreading struct

我正在尝试制作一个多线程程序 我可以成功编译它,但我的程序总是崩溃。

这是我的代码段:

// in global declaration
typedef struct MyData {
    int nSumber;
    char *szFileName;
} MYDATA, *PMYDATA;

PMYDATA pData[MAX_THREAD];

// in my OpenDialog function
OPENFILENAME ofn;
char szFile[MAX_PATH];
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
if(GetOpenFileName(&ofn))
    // I think this line that makes my program crash
    pData[0]->szFileName = ofn.lpstrFile;

我做错了吗?

提前致谢!

3 个答案:

答案 0 :(得分:2)

pData数组包含指向有效内存的MYDATA指针,因为您尚未分配任何内存。

if(GetOpenFileName(&ofn)) {
  pData[0] = new MYDATA();
  pData[0]->szFileName = ofn.lpstrFile;
}

现在你需要在每个分配的delete元素上调用pData来释放内存。

因此,请使用std::vector<MYDATA>

,而不是遇到所有麻烦
std::vector<MYDATA> dataVec;

// ...

if(GetOpenFileName(&ofn)) {
  MYDATA data;
  data.szFileName = ofn.lpstrFile;
  data.nSumber = something; // you probably want to init this also
  dataVec.push_back(data);
}

我不确定szFileNamechar *,只是将其指向ofn.lpstrFile。您可能需要分配内存并将文件名存储在struct中。如果是这种情况,请将szFileName更改为std::string而不是char *

答案 1 :(得分:0)

你的问题遗漏了很多细节,但如果char szFile[MAX_PATH]是函数的本地函数,它就在堆栈中。您无法将其保存在全局变量中并期望在其他地方使用它,因为只要szFile超出范围(在下一个}或结束时),就会重复使用堆栈空间功能)。

要快速测试,请尝试ofn.lpstrFile = new char[MAX_PATH]并查看您的崩溃是否消失。

答案 2 :(得分:0)

这只分配一个指向数据的指针数组:

PMYDATA pData[MAX_THREAD];

您需要在MYDATA实际分配一个pData[0]才能生效。