好的,显然这个可以工作:
void foo(size_t s) {
int myArray[s];
// ... use myArray...
}
这真的合法吗?我的意思是,毕竟它可以编译通过(C编译器会将其拒绝为非常量)。我的第一个问题是:这是如何工作的?我认为它在堆栈上分配内存?这与使用alloca()
有什么不同吗?
实际上,我找到了一些这样的代码:
void bar(size_t chunkSize) {
CFReadStreamRef foo = NULL;
// ...some stuff to init foo...
while (stuffToDo) {
UInt8 buffer[chunkSize];
// ...read some data from stream into buffer
// using CFReadStreamRead()...
}
}
这个可以运行。但是,当我将缓冲区分配从循环内部移动到函数的第一行(就在声明
foo
之前),该函数...停止工作。在调试器中,它到达了本地变量的第一个访问,然后就退出了。我没有看到任何异常被抛出,它不会崩溃,程序只是继续运行(实际上,函数返回一个字符串,该返回值为NULL
,这是初始化返回变量的值)。我不确定发生了什么。基于第一部分,第二个问题是,到底发生了什么?
char foo[some_large_value]
有可能会导致堆栈溢出。实际上,这个特性没有什么好的理由存在。 - Ed S.