【发布时间】:2023-03-30 23:06:01
【问题描述】:
我真的很好奇alloca() 函数是如何工作的,因此我编写了一个简单的测试程序如下:
int test() {
int a = 0;
int e;
char tmp2[a]; //alloca
int d;
char* tmp3 = new char[2];
tmp2[100] = 1;
return 0;
}
int main(int argc, char** argv) {
test();
return 0;
}
根据文档,alloca() 将在堆栈中分配内存。我使用 gdb 运行程序,发现(char*)&tmp2 - (char*)a = -44 表示它们之间有 44 个字节,而e-a、d-e、tmp3-d 的地址之间的距离是 4 个字节。我真的不明白编译器如何在堆栈中分配可变长度数组,希望有人能告诉我44字节的含义。
【问题讨论】:
-
您的代码不包含对名为
alloca的函数的调用。但是,它确实包含new,它动态分配内存。这不会发生在“堆栈”上。 -
你的测试根本没有调用
alloca()... -
很抱歉,我使用的是 \"char tmp2[a];"它分配一个可变长度数组,就像 alloca 所做的一样
-
选择一种语言 -
new是 C++ 而 VLA 是 C99。两者不相容。 -
我猜你假设 GCC 的 VLA 实现使用
alloca?
标签: c c99 variable-length-array