Stack中的动态数组?

时间:2009-07-30 04:59:31

标签: c++

这是对的吗? 这是用g ++(3.4)成功编译的。

int main()
{
    int x = 12;
    char pz[x]; 
}

6 个答案:

答案 0 :(得分:17)

以下是您对所有这些其他内容的组合答案:

您的代码现在标准C ++。 标准C99。这是因为C99允许您以这种方式动态声明数组。澄清一下,这也是标准C99:

#include <stdio.h>

int main()
{
    int x = 0;

    scanf("%d", &x);

    char pz[x]; 
}

这是标准的任何内容:

#include <iostream>

int main()
{
    int x = 0;
    std::cin >> x;
    char pz[x]; 
}

它不能是标准的C ++,因为它需要常量数组大小,并且它不能是标准C,因为C没有std::cin(或名称空间,或类等等)

要使其成为标准C ++,请执行以下操作:

int main()
{
    const int x = 12; // x is 12 now and forever...
    char pz[x]; // ...therefore it can be used here
}

如果您需要动态数组,可以执行此操作:

#include <iostream>

int main()
{
    int x = 0;
    std::cin >> x;

    char *pz = new char[x];

    delete [] pz;
}

但你应该这样做:

#include <iostream>
#include <vector>

int main()
{
    int x = 0;
    std::cin >> x;

    std::vector<char> pz(x);
}

答案 1 :(得分:13)

从技术上讲,这不是C ++的一部分。您可以在C99(ISO / IEC 9899:1999)中执行可变长度数组,但它们不是C ++的一部分。正如您所发现的,它们被一些编译器支持作为扩展。

答案 2 :(得分:13)

G ++支持C99功能,允许动态调整大小的数组。它不是标准的C ++。 G ++有-ansi选项可以关闭一些不在C ++中的功能,但这不是其中之一。要使G ++拒绝该代码,请使用-pedantic选项:

$ g++ -pedantic junk.cpp
junk.cpp: In function ‘int main()’:
junk.cpp:4: error: ISO C++ forbids variable-size array ‘pz’

答案 3 :(得分:7)

如果你想在堆栈上使用动态数组:

void dynArray(int x)
{
    int *array = (int *)alloca(sizeof(*array)*x);

    // blah blah blah..
}

答案 4 :(得分:5)

在堆栈上分配具有可变长度的数组是个好主意,因为它速度快且不会破坏内存。但不幸的是,C ++标准不支持它。您可以使用alloca函数的模板包装器来完成此操作。但是使用alloca并不是真正的标准符合。

标准方法是将std :: vector与自定义分配器一起使用,以避免内存碎片和加速内存分配。请查看boost::pool_alloc以获取快速分配器的良好示例。

答案 5 :(得分:2)

实际上,如果你想创建一个动态数组,你应该使用std :: vector,如:

#include <iostream>
#include <cstdlib>
#include <vector>

int main(int argc, char* argv[])
{
   int size;
   std::cin>>size;
   std::vector<int> array(size);
   // do stuff with array ...
   return 0; 
}

如果您只是对语法感到好奇,那么您要找的是:

//...
int* array = new int[size];
// Do stuff with array ...
delete [] array;
//...

这些都没有分配本地存储。标准C ++目前不支持使用本地存储自动分配的动态大小的数组,但在当前的C标准中受支持。