免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lipingtababa
打印 上一主题 下一主题

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

论坛徽章:
0
61 [报告]
发表于 2008-06-08 06:23 |只看该作者
返回指针

论坛徽章:
0
62 [报告]
发表于 2008-06-08 20:07 |只看该作者
可以返回的是指针吧

论坛徽章:
0
63 [报告]
发表于 2008-06-08 21:39 |只看该作者
GCC返回的不是指针, 就是一个结构临时变量

论坛徽章:
0
64 [报告]
发表于 2008-06-08 22:40 |只看该作者
我明白楼主的意思了. 看这个帖子我也受教了

楼主问的是, 编译器如何实现结构的返回.

我认为是返回地址, 但被调用者不知道这样一个的地址(在编译时), 但它又需要静态编译, 很简单, 取一个中间寄存器就行了, 存放返回地址.

左值你可以试试->, 当然, 希望不大

论坛徽章:
0
65 [报告]
发表于 2008-06-08 23:27 |只看该作者
用入口参数返回不可以吗?

论坛徽章:
0
66 [报告]
发表于 2008-06-09 06:57 |只看该作者
白天我又看了看英文和汇编的代码, 很强大.

论坛徽章:
0
67 [报告]
发表于 2008-06-09 07:00 |只看该作者
指针

论坛徽章:
0
68 [报告]
发表于 2008-06-09 10:31 |只看该作者
从汇编代码里看的应该清楚
#include <unistd.h>
#include <stdlib.h>
struct aa {
        int b;
        int c;
};
struct aa fun(){
        struct aa b;
        return b;
}
void fun2(){
        struct aa c = fun();
}
int main(){
        fun2();
}

gcc -S后
.file   "returnstruct.c"
        .text
.globl fun
        .type   fun, @function
fun:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $16, %esp
        movl    8(%ebp), %ecx
        movl    -8(%ebp), %eax
        movl    -4(%ebp), %edx
        movl    %eax, (%ecx)
        movl    %edx, 4(%ecx)
        movl    %ecx, %eax
        leave
        ret     $4
        .size   fun, .-fun
.globl fun2
        .type   fun2, @function
fun2:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $28, %esp
        leal    -24(%ebp), %eax
        movl    %eax, (%esp)
        call    fun
        subl    $4, %esp
        movl    -24(%ebp), %eax
        movl    -20(%ebp), %edx
        movl    %eax, -8(%ebp)
        movl    %edx, -4(%ebp)
        leave
        ret
        .size   fun2, .-fun2
.globl main
        .type   main, @function
main:
        leal    4(%esp), %ecx
        andl    $-16, %esp
        pushl   -4(%ecx)
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %ecx
        subl    $4, %esp
        call    fun2
        addl    $4, %esp
        popl    %ecx
        popl    %ebp
        leal    -4(%ecx), %esp
        ret
        .size   main, .-main
        .ident  "GCC: (GNU) 4.1.2 20070925 (Red Hat 4.1.2-33)"
        .section        .note.GNU-stack,"",@progbits

注意看fun函数里的几句代理:
      movl    8(%ebp), %ecx
        movl    -8(%ebp), %eax
        movl    -4(%ebp), %edx
        movl    %eax, (%ecx)
        movl    %edx, 4(%ecx)
        movl    %ecx, %eax
以及 fun2的代码
可以很明显的看出这个简单的结构体的返回利用了堆栈
我第一次写的时候没看清楚

[ 本帖最后由 空灵静世 于 2008-6-10 00:09 编辑 ]

论坛徽章:
0
69 [报告]
发表于 2008-06-09 14:34 |只看该作者

这问题,看英文的教科书里都有答案!

这问题,看英文的教科书里都有答案!

c89是不支持返回结构的!要返回架构只能是指针,然后使用结构格式化。
C99支持返回结构,返回的使指针!

感觉这问题也不是很偏僻,但是中文教科书很少说这些!

不过Vc直到现在都不太支持c99!其他编译器,对c99支持都还不错了!

论坛徽章:
0
70 [报告]
发表于 2008-06-09 15:33 |只看该作者
http://bbs.chinaunix.net/thread-1154820-1-1.html

自己实验比书上的结论更好些.

原帖由 gale320 于 2008-6-9 14:34 发表
这问题,看英文的教科书里都有答案!

c89是不支持返回结构的!要返回架构只能是指针,然后使用结构格式化。
C99支持返回结构,返回的使指针!

感觉这问题也不是很偏僻,但是中文教科书很少说这些!

不 ...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP