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

Declaration of static array using variable size in c++11

本文关键字:声明 静态 数组 c++11      更新时间:2023-10-16

我的问题是关于我最近在代码中遇到的一个问题。长话短说,有一个函数得到一个动态分配的哈希表数组,如下void output(Hashtable* hash_array)所示。函数内部是以下代码int k=some_function(); int results[k];

问题是:运行程序一段时间后,hash_array内部的数据丢失。在调试程序的过程中,我尝试用fprintf(stderr,"%pn",hash_array);打印hash_array的值,结果发现hash_array在分段故障之前具有值(nil),尽管函数输出仅从hash_array读取数据。当我将int results[k];更改为int* results=new int[k]; 时,问题得到了解决

所以我有两个问题:

  1. 当编译器遇到像int results[k];中那样用可变大小声明的静态数组时,它会做什么
  2. int results[k];是如何(或可能)影响哈希表数组的
  1. 当编译器遇到像int results[k];中那样用可变大小声明的静态数组时,它会做什么

根据您的描述,迂腐的是,数组似乎是自动的,而不是静态的。可变长度数组甚至不能是静态的。

根据C++11,编译器应该发布诊断,因为标准不允许使用可变长度(非动态)数组,因此就标准而言,程序格式不正确。

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

以下是对编译器在足够高的级别上所做的工作的描述,该级别不特定于实现:当达到数组的定义时,将为数组分配内存。当变量超出作用域时,内存将被释放。

  1. 如何(或可以)int results[k];影响哈希表数组

仅分配和初始化对其他数组没有影响。它是如何使用的,可以有。尤其是如果你有不明确的行为。

这样的代码:

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

导致在堆栈上分配results所需的空间。。。然后,就像任何局部变量一样,在函数返回后,该内存将被放弃。

当你切换到做:

int* results=new int[k];

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