关于 c:malloc 调用的静态替换

Static replacement for malloc calls

我正在开发一个裸机应用程序。我希望为我的应用程序采用 U-Boot 源代码。我想替换 U-Boot 中找到的以下 malloc 调用来静态分配内存 -

1
struct foo *ptr = malloc(sizeof(struct foo));

根据我的理解,这一行只尝试为结构的一个实例分配足够的空间,并将该空间的地址存储在 ptr 中。

因此,我尝试用以下几行替换它 -

1
2
3
4
struct foo *ptr;
int struct_sz = sizeof(struct foo);
char buf[struct_sz];
ptr = &buf;     //also tried ptr = buf;

但是,这会导致堆栈缓冲区溢出,调用堆栈中函数的返回地址被垃圾覆盖。

这里如何静态分配内存而不是使用 malloc?


你正在做的是分配一个字符数组,然后将一个指向结构的指针指向同一个内存。

虽然这是可能的,但您可能会遇到内存对齐问题。该结构可能需要从特定的 yte 位置开始。 (例如,32 位 int 需要以 4 的倍数开始地址)。字符数组可以从任何位置开始。

更简单的方法是声明一个struct foo 变量并使用指向该变量的指针。这个变量需要是全局的或静态的,以便在函数范围完成后它会存在。

1
2
static struct foo var;
struct foo *ptr = &var;

要分配许多结构,你需要一个结构的静态数组

1
2
static struct arr[5];
struct foo *ptr = arr;

如果您分配内存并且不经常释放它,这种方法将有效。如果你有很多 mallocfree 你应该考虑编写你自己的分配器来模仿 malloc

的功能