首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有可能在不使用malloc的情况下返回一个结构的指针?

有没有可能在不使用malloc的情况下返回一个结构的指针?
EN

Stack Overflow用户
提问于 2013-06-28 23:06:59
回答 7查看 3.5K关注 1票数 7

我正在用GBDK写一个Gameboy ROM,它有一个不稳定的malloc版本,我无法正常工作。我也不能在结构体中返回结构体。这使得我试图返回一个指针,这就是为什么我想知道是否有一种方法可以避免在返回结构指针时使用malloc?

我基本上想要做的是,我希望能够写出这样的东西:

代码语言:javascript
复制
create_struct(struct_name, char member_x, char member_y);

这是我使用malloc编写的代码:

代码语言:javascript
复制
 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;
};
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-06-29 00:09:37

返回指针(指向结构或任何类型的对象)的有效方法有很多,但返回指向在调用函数之前不存在的新对象的指针的唯一方法是使用mallocrealloccallocaligned_alloc (C11)或某种实现定义的分配函数(例如,POSIX系统上的mmap等)。

返回有效指针的其他方法包括:

  1. 指向具有static存储持续时间的对象的指针。这样的对象只存在一次实例,所以这通常是一种不好的方式。
  2. 作为参数传递给函数的指针,用作存储结果的位置。这通常是一种很好的方法,因为您将获取存储的责任推给了调用者。
  3. 从某种全局池中获取的对象的指针。在嵌入式系统和低端游戏设备的游戏设计中,这可能是一种非常好的方法。
票数 6
EN

Stack Overflow用户

发布于 2013-06-28 23:51:37

是否有可能在不使用malloc的情况下返回指向结构的指针?

I.从技术上讲,是的。你可以让你的结构static,这样它就可以在函数调用中存活下来:

代码语言:javascript
复制
struct foo *bar()
{
    static struct foo f = { 1, 2, 3 };
    return &f;
}

但我怀疑您是否真的想这样做(因为这有有趣的副作用,请阅读static关键字的含义)。您有几种不同的可能性:

II. C标准库所采用的方法总是让调用者隐式地负责提供结构和管理内存。因此,该函数不返回指针,而是接受一个指向struct的指针并填充它:

代码语言:javascript
复制
void dostuff(struct foo *f)
{
    foo->quirk = 42;
}

或者返回结构本身,它不会造成伤害,不是吗(它甚至可以是移动优化的):

代码语言:javascript
复制
struct foo bar()
{
    struct foo f = { 1, 2, 3 };
    return f;
}

所以,选择你的毒药。

票数 3
EN

Stack Overflow用户

发布于 2013-06-28 23:10:51

只要像这样做就行了:

代码语言:javascript
复制
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;
}

该结构将需要“分配”到其他地方(可能在堆栈上是最好的选择)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17367895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档