malloc 调用的静态替换

Static replacement for malloc calls

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

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

据我了解,此行仅尝试为结构的一个实例分配足够的 space,并将该 space 的地址存储在 ptr 中。

因此,我尝试将其替换为以下行 -

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

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

如何在此处静态分配内存而不是使用 malloc?

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

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

一种更简单的方法是声明一个 struct foo 的变量并使用指向该变量的指针。该变量需要是全局变量或静态变量,以便在函数作用域完成后出现。

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

要分配多个结构,您需要一个静态结构数组

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

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

的功能