无法检索静态char *数组

时间:2014-10-10 06:09:43

标签: c++

我有以下代码片段,意图是获取某些项目列表并打印。它编译正常,但在运行时,输出不是预期的。我添加了注释,结果是意外的。请告诉我这里我做错了什么。

#include <iostream>

using namespace std;

class cSample
{
private:
    static const char *list1[];
    static const char *list2[];

public:
    cSample();
    const char **GetList(int);
};

cSample::cSample()
{
}

const char *cSample::list1[] = {"Item1" , "Item2" , "Item3"};
const char *cSample::list2[] = {"Item4" ,"Item5" ,"Item6"};

const char **cSample::GetList(int i)
{
    switch(i)
    {
    case 1:
        return cSample::list1;
        break;
    case 2:
        return cSample::list2;
        break;
    default:
        break;
    }
}

int main(int argc , const char *argv[])
{
    cSample *oSample = new cSample();

    const char**list1Item = oSample->GetList(1);//Here getlist returns list1+list2 item which is wrong , I am not sure why...
    cout << "Items from List1 " << endl; 
    while(*list1Item != NULL)
    {
        cout << *list1Item << endl;
        list1Item++;
    }

    const char **list2Item = oSample->GetList(2);//whereas list2 items are returned correctly using same method any idea why?
    cout << "Items from list2" << endl;
    while(*list2Item != NULL)
    {
        cout << *list2Item << endl;
        list2Item++;
    }
    return 0;
}

4 个答案:

答案 0 :(得分:1)

您从未将列表数组的最后一个元素设置为NULL,并且您继续递增list1Item。实际上,你正在做的是UB

只需添加NULL即可避免您遇到的行为,例如

const char *cSample::list1[] = {"Item1" , "Item2" , "Item3", 0};
const char *cSample::list2[] = {"Item4" ,"Item5" ,"Item6", 0};

答案 1 :(得分:1)

您需要添加NULL才能终止列表

const char *cSample::list1[] = {"Item1" , "Item2" , "Item3", NULL};

答案 2 :(得分:0)

您期望您的数组以空值终止,但它们不是。因此,当您枚举list1时,您会直接跑到最后并进入list2

答案 3 :(得分:0)

与其他已经提到过的人一样,您需要取消终止列表

#include <iostream>

using namespace std;

class cSample
{
private:
    static const char *list1[];
    static const char *list2[];

public:
    cSample();
    const char **GetList(int);
};

cSample::cSample()
{
}

const char *cSample::list1[] = {"Item1" , "Item2" , "Item3", '\0'};
const char *cSample::list2[] = {"Item4" ,"Item5" ,"Item6", '\0'};

const char **cSample::GetList(int i)
{
    switch(i)
    {
    case 1:
        return cSample::list1;
        break;
    case 2:
        return cSample::list2;
        break;
    default:
        break;
    }
}

int main(int argc , const char *argv[])
{
    cSample *oSample = new cSample();

    const char **list1Item = oSample->GetList(1);//Here getlist returns list1+list2 item which is wrong , I am not sure why...
    cout << "Items from List1 " << endl; 
    while(*list1Item != NULL)
    {
        cout << *list1Item << endl;
        list1Item++;
    }

    const char **list2Item = oSample->GetList(2);//whereas list2 items are returned correctly using same method any idea why?
    cout << "Items from list2" << endl;
    while(*list2Item != NULL)
    {
        cout << *list2Item << endl;
        list2Item++;
    }
    return 0;
}