数组指针的向量c ++

时间:2016-01-20 10:29:02

标签: c++ visual-c++

我是c ++的新手,我正在检查扫描仪的项目,我正在使用随扫描仪提供的API。这是我的代码:

.h文件:

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

using namespace std;
class Excella
{
public:
    vector<char*> getDevicesName();
};

.cpp文件:

    vector<char*> Excella::getDevicesName()
    {
        DWORD dwResult;
        vector<char*> listeDevices;
        char pcDevName[128]="";
        int i = 6;

// the device's name is stored in the variable 'pcDevName'
        while ((dwResult = MTMICRGetDevice(i, (char*)pcDevName)) != MICR_ST_DEVICE_NOT_FOUND) {
            dwResult = MTMICRGetDevice(i, (char*)pcDevName);
            i++;
            listeDevices.push_back((char*) pcDevName);
        }
        return listeDevices;
    }

的main.cpp

vector<char*> liste = excella.getDevicesName();
        if (liste.empty()!= true)
        {
            for (vector<char*>::iterator IterateurListe = liste.begin(); IterateurListe != liste.end(); ++IterateurListe)
            {   string str(*IterateurListe);
                auto managed = gcnew String(str.c_str());
                devices->Items->Add(managed);
            }
        }
        else {
            MessageBox::Show("The vector is empty");
        }

问题是我可以获得正确的设备编号..我只是有一些奇怪的角色。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

这并不奇怪。

char pcDevName[128]="";将超出函数vector<char*> Excella::getDevicesName()末尾的范围。因此,您推送到向量的任何指针将不再有效。从形式上讲,程序的行为是 undefined

使用std::vector<std::string>代替它简单得多。值得注意的是,这是您必须做出的唯一更改:push_back((char*) pcDevName)将获取pcDevName的值副本(这就是std::string构造函数的工作方式)。删除不必要的(char*)强制转换。

答案 1 :(得分:1)

下面:

String table = "beaconTable";
String whereClause = "_id" + "=?";
String[] whereArgs = new String[] { String.valueOf(row) };
db.delete(table, whereClause, whereArgs);

你正在向listeDevices推送一个指向堆栈数组的指针。这有两个问题 - 第一个问题是,一旦你的getDevicesName函数结束,那些指针是无效的,使用它们是未定义的,另一个是在你的循环的每次迭代中你覆盖pcDevName以及你存储的指针内容。

你应该做的是使listeDevices存储std :: string,即。 listeDevices.push_back((char*) pcDevName); ,然后您可以使用std::vector<std::string>将您的名字安全地存储在矢量中。