据我了解,以下代码生成可变长度数组(通过 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
最佳答案
the array size seems too big to fit into stack, but it never complains.
“从不提示”,我猜你的意思是程序不会崩溃。
您永远不会触及您分配的内存,编译器足够聪明地证明了这一点并且没有分配任何东西。
让我们获取变量的地址,并将其发送到别处定义的函数:
int array[valone][valtwo] = {};
cout << &array << endl;
现在,编译器不太确定数组从未被访问过。那是因为它不能进入在另一个翻译单元中实现的流操作符。也许运算符(operator)会取消对指针的引用;我们必须确保数组存在。
Segfault 在我第一次尝试时就让这个程序崩溃了。堆栈溢出。
我想这种碰撞测试是一种测试 VLA 是否在堆栈上的方法。
Mikhail 在评论中提出的将自动变量的邻接性与 VLA 进行比较的建议是一个不错的平台相关想法,但它只有在您分配足够小的 VLA 且不会导致程序崩溃时才有效。
关于c - 有没有办法检查是否在堆栈/堆上创建了可变长度数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41711515/