c - 有没有办法在堆上自动分配结构?
问题描述
我正在使用带有 PlatformIO 的 VSCode 下的 ESP-WROOM32D,它使用默认的 xtensa32 工具链。我目前的项目涉及将一个库移植到这个架构中,并且 C 中的源文件编译得很好,没有任何改动。
但是,在运行时,我经常遇到堆栈溢出错误或大师冥想崩溃。经过一番反复试验,我发现这是因为这个库在堆栈上创建了这样的大型结构:
#define BITBUF_ROWS 25
typedef bitrow_t bitarray_t[BITBUF_ROWS];
/// Bit buffer.
typedef struct bitbuffer {
uint16_t num_rows; // Number of active rows
uint16_t bits_per_row[BITBUF_ROWS]; // Number of active bits per row
uint16_t syncs_before_row[BITBUF_ROWS]; // Number of sync pulses before row
bitarray_t bb; // The actual bits buffer
} bitbuffer_t;
bitbuffer_t bits = {0}; // this gets created on stack
我完全理解堆栈在这个小型架构上的限制,并且在我自己的代码中,我malloc
在需要这种结构时使用。
显然,我可以去修改第三方库,用适当的malloc
/free
对替换堆栈上的所有隐式分配,但这有两个缺点:首先,它很乏味,其次意味着我必须维护自己的库副本。
这就是为什么我想知道这个工具链是否可以实现这些:
- 给编译器一个参数,让它自动在堆上分配结构
#pragma
在头文件之前放置一个指令#including
,以便编译器自动分配在堆上的这些头文件中声明的结构- 在结构定义上添加“存储说明符”,使其在堆上自动分配
- 在变量声明中添加“存储说明符”,使其在堆上自动分配
最后一个在某种程度上可以通过使用static
关键字来实现,但这会稍微改变变量的语义。和第三点一样,它也有同样的问题,因为它在库中创建了一个更改,我每次升级它时都必须跟踪它。
显然,第一名有我的优势,但我在文档中找不到任何明显的东西。
非常感谢您对此的帮助。
解决方案
推荐阅读
- javascript - 节点中的事件流:在控制台中工作正常但不写入流
- javascript - 如何在 Laravel/Vue.js 项目中使用 Vuesax 上传组件?
- recursion - 如何在递归调用中使用迭代器来改变数据序列?
- reactjs - 如何在 React-Redux-Firebase 中更新 firestoreConnect(使用监听器)?
- android - 获取:Fabric 无法初始化,AndroidManifest.xml 中缺少 API 密钥,而我有带有 apiKey 的 fabric.properties
- excel - 将多列/行合并为一列/行
- javascript - width 和 style.width 接受哪些数据类型?
- python - FileNotFoundError: [Errno 2] No such file or directory: get file from a folder macbook
- python - Django DRF 使用 CreateListModelMixin 更改序列化程序数据
- bash - 如何在 shell 脚本的 virtualenv 中运行命令