c - 有没有办法检查是否在堆栈/堆上创建了可变长度数组?

标签 c arrays c99

据我了解,以下代码生成可变长度数组(通过 C++ 的非标准扩展)。

int main() 
{
    int valone = rand();
    int valtwo = rand();
    int array[valone][valtwo];
    // Printing size
    cout << sizeof(array) << endl;
}

有什么方法可以检查它是在堆栈还是堆上生成的?维基百科描述heregcc 在堆栈中生成相同的内容,但是当我尝试上面的代码时,大多数时候,数组大小似乎太大而无法放入堆栈,但它从不提示。

注意:此代码仅适用于 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/

相关文章:

c - gcc48(从 Homebrew 软件下载)找不到stdio.h

c - 尝试创建一个结构数组并从文件加载数据

c - 在可变参数宏中引用特定参数

iphone - libSystem 库的引用

c - 如何在 C 中打印全零?

c - Xlib 的空窗口或透明窗口仅显示边框线

android - 在 Android 中以 native 代码创建 .pcap 文件,然后检索它

c - 由于一个分号,函数无法编译,我不知道为什么

php - 如何在 MySQL 中显示重复记录并使用 PHP 合并记录?

引用数组位置(不是元素)的 Javascript 数组