2015-08-14 117 views
1

我输入这个代码在VS社区:奇怪的错误 - C++

#include <iostream> 
using namespace std; 

int main(){ 
    int N; 
    cin >> N; 
    int T[N]; 

    return 0; 
} 

,它给了我这些错误:在第7行

C2131 expression did not evaluate to a constant 
Error (active)  expression must have a constant value 

(INT T [ N])。我真的不知道发生了什么事。

+4

可变长度数组不是标准C++的一部分,只作为语言的扩展支持各种编译器。显然你的编译器不支持它们。我建议使用'std :: vector'而不是依赖于在编译器中不应该被认为兼容的东西。 –

+0

从阅读['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)开始,然后搜索教程和/或示例并进行操作,直到您理解它为止。如果您遇到了使用它的问题,无法弄清楚如何使用它执行特定的任务等。再次发布所有详细信息,我们将提供帮助。 –

+0

我已经更新了我的答案。 – sergej

回答

2

visual C++编译器不支持可变长度数组。所以,在这种情况下最好的选择可能是使用std::vector。但是,如果由于某些原因,您不允许使用动态内存分配,则可以使用_malloca()在堆栈上分配一个内存块。

下面是一个例子:

#include <iostream> 
#include <malloc.h> 

int main() { 
    int* T; 
    size_t N = 0; 
    const size_t Nmax = _ALLOCA_S_THRESHOLD/sizeof(*T); 

    /** 
    * read array size from the standard input, 
    * return if reading fails or if the requested 
    * array size would exceed the stack size 
    */ 
    std::cin >> N; 
    if (std::cin.fail() || N > Nmax) { 
     std::cout << "bad input" << std::endl; 
     return -1; 
    } 

    T = (int*)_malloca(N * sizeof(*T)); 

    /** 
    * do somethig with the array 
    * eg: initialize it with zeros 
    */ 
    for (int i = 0; i < N; i++) 
     T[i] = 0; 

    /* free the memory block */ 
    _freea(T); 

    return 0; 
} 

相关:

注:

  • 小心使用_malloca(),详情请参阅the msdn documentation
  • 在调试模式下,_malloca总是从堆中分配内存。
+0

这段代码还有其他一些问题。 1:从cin读取可能会失败。你可以通过给N创建一个正值和非零值,或者用if包围cin >> N位来处理这个问题。此外,在执行任何内存分配或任何其他操作之前,检查N是否小于零很方便。而且使用容器(比如std :: vector eg)可能会更好,而不是使用malloc等。调整矢量和类型的东西比malloc方法更容易... – 2015-08-15 11:24:26

+0

@Tive看到更新,'std :: vector'已经被提及。 – sergej

+0

哪里是[调用'_freea'](http://stackoverflow.com/a/734878/673826)?如果分配发生在堆而不是堆栈上,您可能会引入内存泄漏。特别是在调试模式下。 – mlt

1

数组绑定必须是常量,它不在当前代码中。