我的问题是关于我最近在代码中遇到的问题。简而言之,有一个函数可以获得动态分配的哈希表数组,如下面的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];
所以我对此有两个问题:
int results[k];
中的可变大小声明的静态数组时编译器究竟做了什么?int results[k];
如何影响哈希表数组?答案 0 :(得分:1)
- 当遇到使用可变大小声明的静态数组时,编译器究竟做了什么,如int results [k];?
醇>
为了迂腐,根据你的描述,阵列看起来是自动的,而不是静态的。可变长度数组甚至不能是静态的。
根据C ++ 11,编译器应该发出诊断信息,因为标准不允许使用可变长度(非动态)数组,因此就标准而言,程序生成错误。
编译器可能支持可变长度数组作为语言的扩展。支持很常见,因为C中允许使用可变长度数组。它可以在不同的编译器中以不同的方式实现。这是关于gcc实现的SO question。
以下是编译器在足够高的级别上执行的非特定实现的描述:当达到数组的定义时,为数组分配内存。当变量超出范围时,将释放内存。
- 如何(或可能)int结果[k];影响哈希表数组?
醇>
只是分配和初始化对其他数组没有影响。它是如何使用的,可以有。特别是如果你有未定义的行为。
答案 1 :(得分:0)
这样的代码:
int k = some_function();
int results[k];
为results
分配必要的空间...然后,就像任何局部变量一样,在函数返回后放弃该内存。
当你切换到:
int* results=new int[k];
您现在正在堆上分配内存(它不会自动消失)。因此您的哈希表仍然可以访问,但您现在正在泄漏内存。