在switch语句中初始化时未定义的变量?
这个问题本身就是一个明显的答案。 无论如何,这里是我的代码片段...
switch(cSet)...
case 8:{ //Special Characters
finalSet = special;
char* charSet = new char[special.size() + 1];
charSet[special.size()] = 0; //Append null terminator
memcpy(charSet, special.c_str(), special.size());
break;
}
case 9:{ //Alphnumeric and Special character
finalSet = all;
char* charSet = new char[all.size() + 1];
charSet[all.size()] = 0; //Append null terminator
memcpy(charSet, all.c_str(), all.size());
break;
}
...
请注意, finalSet
的类型是std::string
。 我需要将它保存为字符数组。 在此声明之后,我在switch语句之外调用charSet
:
for(int i = 0; charSet; i++)
printf("%s", charSet[i]);
现在,switch语句显然是有条件的,所以一个变量可能并不总是被声明的。 因此,Visual Studio 2012 charSet
错误“ charSet
未定义”。 但是,我的switch语句结构化的方式总是定义charSet
,否则程序将在default
情况下退出。
为了解决这个问题,我试图在switch语句的范围之外声明charSet
。 但是,当我这样做时,由于某种原因,编译器会抛出读取访问错误。
我很好奇我如何解决这个问题。
任何建设性的意见,赞赏。
在switch语句之外声明时的错误代码:
`Unhandled exception at 0x0F6616B3 (msvcr110d.dll) in cuda_comb.exe: 0xC0000005: Access violation reading location 0x00000061.`
当你把它拿出来的时候,你尝试了(在开关之前):
char* charSet = 0;
然后在所有的switch语句中删除char *
,如此
char* charSet = new char[all.size() + 1];
变为:
charSet = new char[all.size() + 1];
那么你的代码甚至可以检查(在切换之后):
if (!charSet)
{
// handle odd case
}
switch
之外声明charSet
。 当变量在switch / case中声明时,即使在声明变量的情况被执行时,它在切换结束时也会超出范围。 只要charSet
不是0,你的for(int i = 0; charSet; i++)
循环,并且每次增加i
。 因为你不改变内部的charSet
,它总是不会是0,所以最终charSet[i]
超出范围,并给你读访问错误。 改变它,使其循环,直到i
大于缓冲区的长度,或charSet[i] == '0'
(终止null)。 例如:
for(int i = 0; charSet[i]; i++)
printf("%c", charSet[i]);
在打印char
,将printf
的%s
更改为%c
,而不是char *
。 虽然,无论如何,当你打印一个以null结尾的字符串时,你可以完全避免使用for
循环:
printf("%s", charSet);
您正在为每个case块定义charSet
,尽管您在堆的内部为这个数组分配了内存,但在这些块之外, charSet
引用未在构建器显示时定义。
请注意,通过这样做,如果您未在开关块外部使用charSet
,您将不会收到任何错误,但会泄漏内存。
我的意思是:
switch(cSet)...
case 8:{ //Special Characters
finalSet = special;
char* charSet = new char[special.size() + 1]; // <-- charSet definition
charSet[special.size()] = 0; //Append null terminator
memcpy(charSet, special.c_str(), special.size());
break;
} // <-- charSet reference lost, Memory leak
case 9:{ //Alphnumeric and Special character
finalSet = all;
char* charSet = new char[all.size() + 1]; // charSet definition
charSet[all.size()] = 0; //Append null terminator
memcpy(charSet, all.c_str(), all.size());
break;
} // <-- charSet reference lost, Memory leak
} // End of switch
for(int i = 0; charSet; i++)
printf("%s", charSet[i]); // <-- Error charSet is not defined
正确的解决方案是在switch语句之外声明charSet,以便不会丢失引用:
char* charSet = NULL;
switch(cSet)...
case 8:{ //Special Characters
finalSet = special;
charSet = new char[special.size() + 1];
charSet[special.size()] = 0; //Append null terminator
memcpy(charSet, special.c_str(), special.size());
break;
}
...
}
if(charSet)
printf("%s", charSet);
请注意,当您使用“%s”打印数组时,您可以直接使用charSet
。
上一篇: Undefined variable when initialized in switch statement?