为何无法使用大尺寸VLA部分替代malloc?
为何不能靠扩大栈空间替代malloc()使用变长数组(VLA)?
通常当我们预先不知道所需内存大小时,会使用malloc(),示例代码(省略检查/错误处理等逻辑)如下:
FILE * fp = fopen(path, "rb"); fseek(fp, 0, SEEK_END); ssize_t length = ftell(fp); rewind(fp); char* buffer = malloc(length * sizeof(char)); fread(buffer, 1, length, fp); fclose(fp); free(buffer);
我们需要使用char* buffer = malloc(length * sizeof(char));而非char buffer[length];,核心原因是栈的空间非常有限。但这里有个疑问:既然C语言支持局部变量的变长数组(VLA),为何不能大幅扩大栈空间,转而直接使用栈内存?
我整理了相关讨论中的几点关键原因:
malloc()会返回NULL表示分配失败,而VLA没有失败反馈机制,内存耗尽时程序直接崩溃- 局部VLA具有局部作用域,无法从被调用函数返回至调用方
- 无法使用
realloc()动态调整VLA的大小 - VLA并非ISO C标准的强制特性,部分平台可能不支持
(但像上述示例的场景,我们往往只需要一个运行时确定大小后就不再改变的大型局部缓冲区,却仍必须使用malloc())
补充说明:
很多人会问“为何不直接用malloc()?”,我的需求很明确:希望减少(甚至完全消除)malloc()的使用,从而减轻确保所有返回路径都能释放内存的心智负担,这类似于C语言中的本地化简易RAII机制。
内容的提问来源于stack exchange,提问作者D.J. Elkind
相关产品推荐
相关产品推荐

