免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2008-06-05 14:21 |只看该作者
原帖由 ew3j 于 2008-6-5 14:18 发表
C的函数不能返回整个一个结构体, 只能返回结构体指针.
C++的函数可以返回整个一个类, 也可返回类的指针, 这是C++编译器背后做了工作.

不知支持C99的编译器是否支持C函数返回整个一个结构体???


标准c可以返回结构体的,
参看K&R Charpter 6 makepoint例子

论坛徽章:
0
22 [报告]
发表于 2008-06-05 14:21 |只看该作者
To ew3j

c89都支持返回结构体,请见我上面贴的代码

论坛徽章:
0
23 [报告]
发表于 2008-06-05 14:24 |只看该作者
返回一个地址,指向一个空间,怎么用是你自己的事了

论坛徽章:
0
24 [报告]
发表于 2008-06-05 14:28 |只看该作者
原帖由 lipingtababa 于 2008-6-5 14:21 发表
写c代码的风格一般是传一个结构体指针给函数,函数修改之,返回一个int值起errorcode的作用.

返回函数指针不是一个好的风格,因为用户要记得free.

不过我现在的问题是,假使我就是要返回结构体,编译器一般是 ...



编译器偷摸地在这个函数里定义一个static 的结构体变量, 或者把你返回的结构体变量偷默地转为staic定义. C++编译器也只能这么做.

这都是我猜的,不一定正确.

[ 本帖最后由 ew3j 于 2008-6-5 14:38 编辑 ]

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
25 [报告]
发表于 2008-06-05 14:52 |只看该作者
用GCC试了一下
汇编代码看得头痛

struct x_t x;
x = fun();

我写的代码汇编出来是这样的结论(这肯定只是其中一种可能):

直接把x的地址传给fun 在fun中用memcpy给x赋值

论坛徽章:
0
26 [报告]
发表于 2008-06-05 15:12 |只看该作者
从汇编代码中应该能看出来。

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

论坛徽章:
0
28 [报告]
发表于 2008-06-05 17:03 |只看该作者
FUNCTION可以传递整个结构做参数, 也可以返回整个结构.

尽量不要这样用.

[CODE]
#include <stdio.h>

struct test {
        int a;
        char str[1024];
};

struct test func(struct test t)
{
        t.a++;
        t.str[0]++;
        return t;
}

main()
{
struct test a, b;
        a.a = 1;
        strcpy(a.str, "1234567890");
        b = func(a);
        printf("b.a: %d b.str %s\n", b.a, b.str);
}

[CODE]

论坛徽章:
0
29 [报告]
发表于 2008-06-05 17:10 |只看该作者
原帖由 思一克 于 2008-6-5 17:03 发表
FUNCTION可以传递整个结构做参数, 也可以返回整个结构.

尽量不要这样用.


#include

struct test {
        int a;
        char str[1024];
};

struct test func(struct test t)
{
         ...


i don't agree of that.

i have test your code
and i got a random print

论坛徽章:
0
30 [报告]
发表于 2008-06-05 17:13 |只看该作者
struct test {
        int a;
        char str[1024];
};

struct test func(void)
{
        struct test  t;
        t.a++;
        t.str[0]++;
        return t;
}

虽然 t 以函数局部变量形式定义的, 在这种情况下, 如果某C编译器支持这个func函数返回结构体, 我猜测,编译器会默默地把 t 变量改成静态定义, 也就是, static struct test  t;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP