免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 32073 | 回复: 80
打印 上一主题 下一主题

[C] c语言编译器是怎么返回结构体的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-05 11:48 |只看该作者 |倒序浏览
最近看Computer Systems: A Programmer's Perspective,大致了解了c语言函数调用返回的堆栈变化. 比如函数返回int,实际上是把返回值存在一个特定的寄存器上(eax?),而返回一个float,是把返回值放在第一个浮点寄存器上%st(0)

请问,如果是返回结构体,那结构体放在哪里?我设想可以由callee把它放在堆中,在eax放置指向它的指针,然后由caller销毁.但是这样做很笨重.

代码如下,该代码可以通过gcc的编译,即使我指定了 -std=c89:

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

  typedef struct St{
    int id;
  }St;

  St* returnPointer(void)
  {
    St* p=calloc(1,sizeof(St));
    p->id=100;
    return p;
  }
   
  St returnStruct(void)
  {
    St st;
    st.id=100;
    return st;
  }

  int main()
  {
    St st1=*(returnPointer());
    St st2=returnStruct();
    printf("%d\n", st1.id);
    printf("%d\n", st2.id);

    return 0;
  }


[ 本帖最后由 lipingtababa 于 2008-7-1 09:17 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-06-05 11:53 |只看该作者
一般是返回指针, 需要空间的话就在堆上动态申请

论坛徽章:
0
3 [报告]
发表于 2008-06-05 11:55 |只看该作者
不同的编译器处理不一样
gcc似乎就会传入一个隐含的结构指针,通过这个指针进行赋值

论坛徽章:
0
4 [报告]
发表于 2008-06-05 12:03 |只看该作者
只能返回结构体指针吧.

论坛徽章:
0
5 [报告]
发表于 2008-06-05 12:03 |只看该作者
长见识了

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
6 [报告]
发表于 2008-06-05 12:08 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2008-06-05 12:08 |只看该作者
应该是指针

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2008-06-05 12:09 |只看该作者
函数是不能返回结构的。

论坛徽章:
0
9 [报告]
发表于 2008-06-05 13:07 |只看该作者
下面的代码我在x86+linux+gcc上编译通过,并且运行正常.
即使我指定gcc -std=c89编译,结果也是一样

(另外, 怎么让页面给代码加高亮?)

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

  typedef struct St{
    int id;
  }St;

  St* returnPointer(void)   
  {  
    St* p=calloc(1,sizeof(St));
    p->id=100;
    return p;
  }   
   
  St returnStruct(void)   
  {  
    St st;
    st.id=100;
    return st;
  }

  int main()
  {
    St st1=*(returnPointer());  
    St st2=returnStruct();  
    printf("%d\n", st1.id);
    printf("%d\n", st2.id);

    return 0;
  }

论坛徽章:
0
10 [报告]
发表于 2008-06-05 13:53 |只看该作者
原帖由 lenovo 于 2008-6-5 12:09 发表
函数是不能返回结构的。


瞎扯!

函数不返回结构体,怎么传递数据?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP