2013-06-18 127 views
0

我有一个填充空缓冲区(char *)的函数。它看起来像:传递一个缓冲区和缓冲区的大小作为参数

void Matrix::toString(char* buffer, int sizeBuffer) const{ 
    char buf[sizeBuffer]; 
    //some code to fill buf 
    //copy buf into buffer 
} 

它是完美的工作,直到我在QtCreator带来的功能与我的新GUI使用它。编译器告诉我他预期恒定表达式而且他不能分配恒定大小的数组0buf:未知大小

我搜索了一下,我发现我不得不动态分配我的数组。它正在工作,但现在我想知道为什么我不能在堆栈上分配它?这是不好的编码?而且,为什么它以前工作? 谢谢

+1

你能显示代码吗?你为什么使用char数组而不是std :: string,QbyteArray或QString? – UmNyobe

+0

要在堆栈中分配数组,编译器必须知道数组的大小,因此它必须在运行时指定。这就是为什么你收到的错误是'未知的大小'。正如@UmNyobe所说,你最好使用QString或QByteArray而不是char数组。 – TheDarkKnight

回答

1

您的问题的基本答案是,C++标准不允许可变长度数组。在编译时无法知道sizeBuffer的值,因此可变性。我对这个决定的确切原因并不熟悉,但它确实可以简化编译器的工作,并有助于避免堆栈溢出。

作为一个旁注,我不认为你真的需要首先声明一个单独的缓冲区。您不能将Matrix的数据直接复制到buffer参数中吗?为什么不使用QString &参数呢?或者只是返回QString

+0

谢谢大家的回答。我没有使用QString的原因很简单:我不知道在编写这些函数时我会使用qt。我使用char *而不是std :: string只是因为我正在继续其他程序员的工作,而他正在使用char *,所以我只是像他一样继续。 –

+0

但我仍然想知道为什么之前编译..? –

+0

它不是。 C++中永远不允许使用可变长度的数组。也许'sizeBuffer'在你以前的代码中是一个常量。 –