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