在c++11中使用可变大小声明静态数组
Declaration of static array using variable size in c++11
我的问题是关于我最近在代码中遇到的一个问题。长话短说,有一个函数得到一个动态分配的哈希表数组,如下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];
时,问题得到了解决
所以我有两个问题:
- 当编译器遇到像
int results[k];
中那样用可变大小声明的静态数组时,它会做什么 int results[k];
是如何(或可能)影响哈希表数组的
- 当编译器遇到像int results[k];中那样用可变大小声明的静态数组时,它会做什么
根据您的描述,迂腐的是,数组似乎是自动的,而不是静态的。可变长度数组甚至不能是静态的。
根据C++11,编译器应该发布诊断,因为标准不允许使用可变长度(非动态)数组,因此就标准而言,程序格式不正确。
编译器可能支持可变长度数组作为该语言的扩展。这种支持非常常见,因为C中允许使用可变长度数组。它可以在不同的编译器中以不同的方式实现。下面是一个关于gcc实现的SO问题。
以下是对编译器在足够高的级别上所做的工作的描述,该级别不特定于实现:当达到数组的定义时,将为数组分配内存。当变量超出作用域时,内存将被释放。
- 如何(或可以)int results[k];影响哈希表数组
仅分配和初始化对其他数组没有影响。它是如何使用的,可以有。尤其是如果你有不明确的行为。
这样的代码:
int k = some_function();
int results[k];
导致在堆栈上分配results
所需的空间。。。然后,就像任何局部变量一样,在函数返回后,该内存将被放弃。
当你切换到做:
int* results=new int[k];
您现在正在堆上分配内存(不会自动消失)。。因此,您的哈希表仍然可以访问,但是您现在正在泄漏内存。
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 如何在C++函数中声明静态 2D 数组?
- 无法声明静态 constexpr char []
- 缺少类型说明符 - int 假定 声明静态成员后出错
- 如何在类中声明静态 const 结构元素
- 如何在C++中嵌套词法作用域可访问的作用域中声明静态信息?
- 为什么我不能使用 msvc 在模板类中声明静态 constexpr 变量?
- 在 C++14 中使用 decltype(auto) 声明静态数据成员
- 重新声明静态 constexpr 数据成员?
- 如何在C++中声明静态常量结构
- 声明静态对象和指向静态对象的指针之间的区别
- C++在类中声明静态枚举与枚举
- 声明"静态常量"和"常量静态"有什么区别
- "Undefined reference"声明C++静态成员变量
- C++ 在声明静态成员时是否创建实例
- 在c++11中使用可变大小声明静态数组
- 我们如何能够在与类具有相同数据类型的类中声明静态成员
- 为什么在c++中声明静态成员会导致链接器链接atexit
- 在对象是静态的类函数中声明静态变量是否有意义
- 在C++中声明静态/动态数组会自动调用每个元素的默认构造函数