我正在用GBDK写一个Gameboy ROM,它有一个不稳定的malloc版本,我无法正常工作。我也不能在结构体中返回结构体。这使得我试图返回一个指针,这就是为什么我想知道是否有一种方法可以避免在返回结构指针时使用malloc?
我基本上想要做的是,我希望能够写出这样的东西:
create_struct(struct_name, char member_x, char member_y);这是我使用malloc编写的代码:
struct point {
char member_x;
char member_y;
};
struct point *makepoint(char member_x, char member_y) {
struct point *temp = malloc(sizeof(struct point));
temp->member_x = member_x;
temp->member_y = member_y;
return temp;
};发布于 2013-06-29 00:09:37
返回指针(指向结构或任何类型的对象)的有效方法有很多,但返回指向在调用函数之前不存在的新对象的指针的唯一方法是使用malloc、realloc、calloc、aligned_alloc (C11)或某种实现定义的分配函数(例如,POSIX系统上的mmap等)。
返回有效指针的其他方法包括:
static存储持续时间的对象的指针。这样的对象只存在一次实例,所以这通常是一种不好的方式。发布于 2013-06-28 23:51:37
是否有可能在不使用malloc的情况下返回指向结构的指针?
I.从技术上讲,是的。你可以让你的结构static,这样它就可以在函数调用中存活下来:
struct foo *bar()
{
static struct foo f = { 1, 2, 3 };
return &f;
}但我怀疑您是否真的想这样做(因为这有有趣的副作用,请阅读static关键字的含义)。您有几种不同的可能性:
II. C标准库所采用的方法总是让调用者隐式地负责提供结构和管理内存。因此,该函数不返回指针,而是接受一个指向struct的指针并填充它:
void dostuff(struct foo *f)
{
foo->quirk = 42;
}或者返回结构本身,它不会造成伤害,不是吗(它甚至可以是移动优化的):
struct foo bar()
{
struct foo f = { 1, 2, 3 };
return f;
}所以,选择你的毒药。
发布于 2013-06-28 23:10:51
只要像这样做就行了:
void makepoint(struct point *dest, char member_x, char member_y) {
dest->member_x = member_x; // you had these wrong in your code, by the way
dest->member_y = member_y;
}该结构将需要“分配”到其他地方(可能在堆栈上是最好的选择)。
https://stackoverflow.com/questions/17367895
复制相似问题