免费注册 查看新帖 |

Chinaunix

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

初学C语言请教一个返回struct的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-10 14:36 |只看该作者 |倒序浏览

  1. #include <stdio.h>

  2. struct A {
  3.     int a;
  4.     char b[10];
  5. };

  6. struct A B() {
  7.     struct A a;
  8.     a.b[0] = 'a';
  9.     a.b[1] = 0;
  10.     return a;
  11. }

  12. void main() {
  13.     printf("%s\n", B().b);
  14. }

复制代码

这个程序为什么会说 Segmentation fault: 11 (core dumped)
谢谢!

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
2 [报告]
发表于 2008-04-10 14:42 |只看该作者
struct A a;
这里定义是一个局部变量
在函数返回之后已经不存在了

  1. #include <stdio.h>

  2. struct A {
  3.     int a;
  4.     char b[10];
  5. };

  6. struct A B() {
  7.     struct A a;
  8.     a.b[0] = 'a';
  9.     a.b[1] = 0;
  10.     return a;
  11. }

  12. void main() {
  13.     struct A  a;
  14.     a = B();
  15.     printf("%s\n", a.b);
  16. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2008-04-10 20:37 |只看该作者
原帖由 yecheng_110 于 2008-4-10 14:42 发表
struct A a;
这里定义是一个局部变量
在函数返回之后已经不存在了

...


不是这样的。函数返回之后局部变量 a 是不存在了,但是你返回的不是对 a 的引用,而是 a 的值。函数调用之后可以使用这个值。

论坛徽章:
0
4 [报告]
发表于 2008-04-10 20:40 |只看该作者
原帖由 党妈妈 于 2008-4-10 14:36 发表

#include

struct A {
    int a;
    char b[10];
};

struct A B() {
    struct A a;
    a.b[0] = 'a';
    a.b[1] = 0;
    return a;
}

void main() {
    printf("%s\n", B().b);
} ...


这涉及到 C89 标准(ANSI C)和 C99 标准之间的一些微妙区别。只要了解 B().b 这样的使用是合法的 C99 程序但在 C89 中是不允许的就可以了。

论坛徽章:
0
5 [报告]
发表于 2008-04-11 11:38 |只看该作者
原帖由 whyglinux 于 2008-4-10 20:40 发表


这涉及到 C89 标准(ANSI C)和 C99 标准之间的一些微妙区别。只要了解 B().b 这样的使用是合法的 C99 程序但在 C89 中是不允许的就可以了。

多谢版主!版主能不能介绍一下这个微妙的区别?谢谢!!

论坛徽章:
0
6 [报告]
发表于 2008-04-11 11:50 |只看该作者

回复 #5 党妈妈 的帖子

gcc -S 输出。
汇编代码里清晰反映出编译器翻译的异同.

论坛徽章:
0
7 [报告]
发表于 2008-04-11 12:13 |只看该作者
原帖由 system888net 于 2008-4-11 11:50 发表
gcc -S 输出。
汇编代码里清晰反映出编译器翻译的异同.

谢谢。不过看不大懂汇编。我也想知道标准是怎么规定的,初学自己读不懂标准。谢谢!

论坛徽章:
0
8 [报告]
发表于 2008-04-11 12:39 |只看该作者

回复 #7 党妈妈 的帖子

www.baidu.com

输入c89 c99

论坛徽章:
0
9 [报告]
发表于 2008-04-11 12:59 |只看该作者
原帖由 system888net 于 2008-4-11 12:39 发表
www.baidu.com

输入c89 c99

谢谢你这么耐心!!不过我baidu过了,帖子里都没有讲这个内容。你要是知道能讲讲吗?

论坛徽章:
0
10 [报告]
发表于 2008-04-11 15:26 |只看该作者

回复 #1 党妈妈 的帖子


咱汇编都忘得差不多了。。先给出两个对比的例子(从LZ那里改过来的)
///////////////////////正常运行////////////////////////////////
#include <stdio.h>

struct A {
    int a;
    char b[10];
};

struct A B() {
    struct A a;
    a.b[0] = 'a';
    a.b[1] = 0;
    return a;
}

void main() {
            struct A tmp;
        tmp = B();
        printf("%s\n", tmp.b);
}

////////////////////////挂掉的////////////////////////////////////////
#include <stdio.h>

struct A {
    int a;
    char b[10];
};

struct A B() {
    struct A a;
    a.b[0] = 'a';
    a.b[1] = 0;
    return a;
}

void main() {
            struct A tmp;
        printf("%s\n", B().b);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP