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;
如果您分配内存并且不经常释放它,则此方法会奏效。如果你有很多 malloc
和 free
你应该考虑编写你自己的分配器来模仿 malloc
的功能
我正在开发裸机应用程序。我希望为我的应用程序采用 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;
如果您分配内存并且不经常释放它,则此方法会奏效。如果你有很多 malloc
和 free
你应该考虑编写你自己的分配器来模仿 malloc