【发布时间】:2017-06-02 08:45:34
【问题描述】:
据我了解,以下代码生成可变长度数组(通过 C++ 的非标准扩展)。
int main()
{
int valone = rand();
int valtwo = rand();
int array[valone][valtwo];
// Printing size
cout << sizeof(array) << endl;
}
有没有办法检查它是在堆栈还是堆上生成的?维基百科描述 here 说 gcc 在堆栈中生成相同的内容,但是当我尝试上面的代码时,大多数时候,数组大小似乎太大而无法放入堆栈,但它从不抱怨。
注意:此代码仅适用于 gcc 和 clang,不适用于 Visual Studio
【问题讨论】:
-
您指向的维基百科链接谈论的是 C99,而不是 C++。
gcc可能会也可能不会将 C99 代码和 C++ 代码视为相同。 -
不确定标准方式(“标准”适用于“非标准扩展”),但为了快速测试,您可以比较
valtwo和array[0]的地址。如果数组在堆栈上,它们应该是相邻的。如果在堆上,它们将完全不同。这不是 100% 可靠的,但在大多数情况下都可以工作。 -
在你访问外部临时存储之前它可能不会抱怨,但谁知道呢?
-
请注意,堆栈溢出的情况并不总是很明显,尤其是如果您从不写入数组末尾的项目(即使您这样做也可能不会)。因此,“它从不抱怨”这一事实不应被视为非标准扩展的实现的任何意义。