在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

    链接地址: http://www.djcxy.com/p/84441.html

    上一篇: Undefined variable when initialized in switch statement?

    下一篇: Java: Cant break after a case in a switch