表达式没有评估为常量c ++

Joh*_*ohn 16 c++

我编写了以下代码,用于将十进制数转换为base2.可能不是最好的,但它在日食上起作用.但是,当我尝试在visual studio上运行它时,我在第10行得到了这个错误消息(强调):"表达式没有评估为常量".这是为什么?

long base2(int number) {
    int remainder, sizeOfRetNum, isNegative = 0;
    if (number<0)
        isNegative = 1;
    int temp = number;
    while (temp != 0) {
        sizeOfRetNum++;
        temp = temp / 2;
    }
    char ansString[sizeOfRetNum]; // ********line 10********
    int j = sizeOfRetNum - 1;
    while (number != 0) {
        remainder = number % 2;
        number = number / 2;
        if (remainder == 0)
            ansString[j] = '0';
        else
            ansString[j] = '1';
        j--;
    }
    long ansNum = atol(ansString);
    if (isNegative == 1)
        ansNum = -ansNum;
    return ansNum;
}
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 29

char ansString[sizeOfRetNum]; 
Run Code Online (Sandbox Code Playgroud)

可变长度数组,在C++中不是标准的.像GCC这样的编译器允许它们作为扩展,但MSVS不会编译它们.

为了获得动态数组,您需要使用指针和 new

char* ansString = new char[sizeOfRetNum];
Run Code Online (Sandbox Code Playgroud)

或者更好的是,重做函数以使用a std::string,它为您处理内存管理.


E. *_*fat 6

sizeOfRetNum 不是一个常量值 - 换句话说,它的值在编译时是不知道的.

如果要分配内存并且在运行时之前不知道该值,则需要使用动态内存分配.这是在C++中完成的operator new.你自己分配的内存new也需要用delete或释放delete[].

更改char ansString[sizeOfRetNum];char * ansString = new char[sizeOfRetNum];.delete [] ansString;在函数返回之前不要忘记调用,否则会发生内存泄漏.