在c ++ 11中使用可变大小的静态数组声明

时间:2016-01-07 08:29:16

标签: c++ arrays c++11 segmentation-fault

我的问题是关于我最近在代码中遇到的问题。简而言之,有一个函数可以获得动态分配的哈希表数组,如下面的void output(Hashtable* hash_array)。函数内部是以下代码int k=some_function(); int results[k];

问题是:运行程序一段时间后,hash_array内的数据丢失了。在尝试调试程序时,我尝试使用hash_array打印fprintf(stderr,"%p\n",hash_array);的值,结果发现hash_array在分段错误之前具有值(nil),即使函数输出仅从hash_array读取数据。当我将int results[k];更改为int* results=new int[k];

时,问题已解决

所以我对此有两个问题:

  1. 当遇到使用int results[k];中的可变大小声明的静态数组时编译器究竟做了什么?
  2. (或可能)int results[k];如何影响哈希表数组?

2 个答案:

答案 0 :(得分:1)

  
      
  1. 当遇到使用可变大小声明的静态数组时,编译器究竟做了什么,如int results [k];?
  2.   

为了迂腐,根据你的描述,阵列看起来是自动的,而不是静态的。可变长度数组甚至不能是静态的。

根据C ++ 11,编译器应该发出诊断信息,因为标准不允许使用可变长度(非动态)数组,因此就标准而言,程序生成错误。

编译器可能支持可变长度数组作为语言的扩展。支持很常见,因为C中允许使用可变长度数组。它可以在不同的编译器中以不同的方式实现。这是关于gcc实现的SO question

以下是编译器在足够高的级别上执行的非特定实现的描述:当达到数组的定义时,为数组分配内存。当变量超出范围时,将释放内存。

  
      
  1. 如何(或可能)int结果[k];影响哈希表数组?
  2.   

只是分配和初始化对其他数组没有影响。它是如何使用的,可以有。特别是如果你有未定义的行为。

答案 1 :(得分:0)

这样的代码:

int k = some_function();
int results[k];

results分配必要的空间...然后,就像任何局部变量一样,在函数返回后放弃该内存。

当你切换到:

int* results=new int[k];

您现在正在堆上分配内存(它不会自动消失)。因此您的哈希表仍然可以访问,但您现在正在泄漏内存。