大家先看一下这段程序:

#include

typedef unsigned char bool;

typedef struct _person person;

struct _person {

bool sex;

};

person main() {

person xingwang;

xingwang.sex = 0;

return xingwang;

}

如此简单清晰的程序,您觉得会报错吗?如果您和我一样,感觉肯定不会报错,请继续看这段程序编译以后的汇编代码:

.file "struct.c"

.text

.globl main

.type main, @function

main:

pushl %ebp

movl %esp, %ebp

subl $16, %esp

movl 8(%ebp), %eax

movb $0, -1(%ebp)

movzbl -1(%ebp), %edx

movb %dl, (%eax)

leave

ret $4

.size main, .-main

.ident "GCC: (GNU) 4.4.6 20110731 (Red Hat 4.4.6-3)"

.section .note.GNU-stack,"",@progbits

pushl %ebp 将当前的基址存储,函数退出时用

movl %esp, %ebp 当前函数的基址

subl $16, %esp 在栈中,分配16个字节来存储局部的变量

movl 8(%ebp), %eax 调用main()函数的地方,返回值会存储在这里。(很显然,没有函数调用main(),这个地址很不确定)

movb $0, -1(%ebp) 为xingwang.sex赋值

movzbl -1(%ebp), $edx

movb %dl, (%eax) 将xingwang赋值给eax指向的内存地址

问题就出在 movl 8(%ebp), %eax 这一行。使用GDB调试以后发现,%ebp+8这个位置的值是 0x1,也就是说函数最后的返回值要存储给0x1这个内存单元。很显然这个内存单元不是用户可以操作的。

原因是,根据ABI,当返回值为结构体类型时,返回值就存储在栈中。

所以,这个C程序最后运行时,会提示 段错误 或者 Segment Fault。

研究了好几天,也没研究出什么眉目,好像根据什么 calling conventions 和 ABI,有个约定,某些时候会把返回值存储在寄存器里,某些时候会存储在调用函数的栈中。有哪位大侠知道的,给指个路……多谢了!

c语言中结构体类型只有,C语言中main()函数不要返回结构体类型(求助)相关推荐

  1. c语言中怎么定义一个指针,C语言中,定义一个指针的时候为这个指针开辟...

    2016-08-03 10:00齐景宪 客户经理 区别:C语言把内存划分成四个区,它把一般的变量和数组等存在于内存中的栈区,所以数组在C语言的定义中只是一组同类型的普通变量,即使这个变量有可能是指针. ...

  2. %f在c语言中是什么意思,在C语言中,%d,%c,%f都是什么意思,请详细的说一下,谢谢了...

    满意答案 huluzhubao 推荐于 2017.11.26 采纳率:40%    等级:12 已帮助:5759人 printf函数调用的一般形式 printf函数是一个标准库函数,它的函数原型在头文 ...

  3. c语言中什么是指针初始化,C语言中的“char指针初始化”是什么意思?

    满意答案 gqtywh 推荐于 2019.10.06 采纳率:53%    等级:8 已帮助:60人 char 指针,也就是char *类型. 其初始化本质上与其它变量初始化没有什么区别,就是赋予其一 ...

  4. c语言中尖括号的作用,C语言中,#include

    C语言中,#include 头文件中的尖括号可以用双引号""代替吗?那还可以用圆括号代替呢?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后 ...

  5. static在c语言中是什么意思,在C语言中static有什么含义

    2019-10-10阅读(64) 最主要有两点用途.让一个变量长期有效,而不管其是在什么地方被申明.比如:intfun1(){staticints_value=0;....}那么fun1不管在什么地方 ...

  6. goto在c语言中的作用,为什么在C语言中,goto这么不受待见?

    原标题:为什么在C语言中,goto这么不受待见? 什么是goto语句 goto语句被称为C语言中的跳转语句.用于无条件跳转到其他标签.它将控制权转移到程序的其他部分. goto语句一般很少使用,因为它 ...

  7. c语言中如何正确使用union,C语言中的union使用方法

    共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量. 在union中,全部的共用体成员共用一个空间. 而且同一时间仅仅能储存当中一个成员变量的值. 1.union中能够 ...

  8. c语言中字符数字加'0',C语言中的NULL与转义字符'\0'以及数值0的关系

    以下两种只是一个巧合,只不过地址值的数值为0而已.0本身只不过是一个可以显示的字符,与内存并没有直接关系.在0与ASCII表中关联NULL做了关联,这样使得输入转义字符'\0',也可以将一个变量赋值为 ...

  9. c 语言中字符串是什么意思,c语言中string是啥意思啊? 控制啥的啊?

    侃侃尔雅 C语言提供了丰富的字符串处理函数, 大致可分为字符串的输入.输出.合并.修改.比较.转换.复制.搜索几类. 使用这些函数可大大减轻编程的负担.用于输入输出的字符串函数, 在使用前应包含头文件 ...

最新文章

  1. 转载:Quartz.NET 入门
  2. Failed to issue method call: Unit mysql.service failed to load: No such file or directory解决的方式...
  3. 持续交付二:为什么需要多个环境
  4. 【阿里云MVP月度分享】SaaS服务商如何通过数加平台统计业务流量
  5. 利用Samba-Winbind组件进行Linux加windows域
  6. [转帖]win10 .Net Runtime Optimization Service占用大量CPU资源解决方法
  7. Kafka的架构设计
  8. UML--实现图(组件图、配置图)
  9. Flask 的 数据库连接 与 DBUtils 数据库连接池
  10. 空间中常见曲面图形的绘制(matlab)
  11. Docker load 命令
  12. Kruskal理解+代码解析
  13. 鸿蒙系统源代码解析,鸿蒙内核源码分析(系统调用篇) | 图解系统调用全貌
  14. 绍耕反失败学课程(06)——在正确时间做正确的事情,轻装上阵抛弃负担
  15. 力扣题 <爬楼梯> 递归结合表
  16. 2022字节跳动数据仓库实习面经
  17. 沪江网校前端架构漫谈
  18. PCIe实践之路:BAR空间和TLP
  19. 视频融合平台EasyCVR集成播放器,但是无法播放该如何解决?
  20. 图像超分辨率重建之SRCNN

热门文章

  1. 做自适应网站专业乐云seo_什么叫网站优化-网站建设-SEO优化
  2. linux分区始柱号,找到了linux分区顺序错乱修复方法
  3. linux 服务端口查询,linux 怎么查看服务和端口
  4. 将dll制作成控件_全国首例将“影视作品”制作成“网络图片集”方式侵权案宣判...
  5. windows系统改装为linux系统_Linux怎么克隆系统?备份系统跟Windows系统有区别吗?...
  6. 操作系统hpf算法事例_操作系统中常见算法汇总
  7. Win7系统win键没有反应的应对措施
  8. 优酷视频如何修改账号密码?
  9. 腾讯视频如何下载视频_腾讯视频如何做明星装扮
  10. matlab读取suffer,MATLAB调用surfer时出错