5
const int sizea = 600; 
char sz[sizea];

上面的代码工作正常。但是下面的代码段会导致错误。我正在开发 Visual Studio 2005 - MFC 应用程序

CString strFinal;

.......//strFinal value is dynamically changing . . 

const int size = strFinal.GetLength();
char sz[size];

错误 2 错误 C2057:预期的常量表达式
错误 5 错误 C2070:'char []':非法大小的操作数
错误 4 错误 C2133:'sz':未知大小 错误 3 错误 C2466:无法分配常量大小 0 的数组

4

5 回答 5

4

在当前版本的 C++ 中,数组必须具有固定大小,由编译时常量指定。如果您需要使用运行时值,那么您的选择是:

  • 最便携的是,使用动态数组类,例如std::stringor std::vector<char>
  • 使用支持 C99 可变长度数组的编译器作为非标准扩展;
  • 等待一年(希望)在 C++14 中引入动态数组(并且可能等待更长时间让您的编译器供应商赶上来)。
于 2013-08-26T13:01:10.583 回答
2

正常的用例是使用newdelete当你完成时)可变大小的元素。如果必须使用堆栈,可以使用alloca.

char *psz = new char[size+1];  // +1 you probably want zero-termination
...
delete [] psz;
于 2013-08-26T12:44:20.833 回答
1

您可以将向量用作动态数组。试试这个。

#include <vector> // use this header
#include <iostream>

using namespace std; // use this namespace

int main()
{
    vector<int> v; //declare dynamic array equivalent

    for (int i = 0; i < 10; ++i) {
        v.push_back(10 + i);
    }

    cout << "vector data: " << endl;
    print_collection(v);

    while (v.begin() != v.end()) { 
        cout << "v.back(): "; print_elem(v.back()); cout << endl;
        v.pop_back();
    }
}
于 2015-06-11T10:49:14.027 回答
-1

它会产生一个错误,因为它会GetLength()返回一个任意值,而不是静态定义的。

正确的方法是分配足够的内存来保存您的字符串,如果需要,NULL通过调用malloc或使用new运算符(如果使用 C++ 编译器编译)来保存 - 终止符号。

于 2013-08-26T12:57:29.910 回答
-1

我很久以前做过类似的事情,想法是使用指针。

所以你需要制作具有(char和nextPointer)的结构,char代表数组的当前值,nextPointer代表系列的下一个结构

循环所有这些指针,你将拥有你想要连接结构的任何数组

struct yourStructure {
  Char char;
  double nextPointer;
} ;

所以你创建第一个结构并连接到第二个和树

在此处输入图像描述

于 2015-07-22T04:42:24.167 回答