结构体在 C 程序中使用的较为频繁,能对数据有一定的封装的作用。对一个结构体赋值时,经常采用的方式是,分别对其成员变量赋值。那么能否将一个结构体用赋值号(“=”)直接赋值给另一个结构体呢?网上的答案不一,有说可以的,有说不可以的,有说这样的话两个结构体共用一块内存空间。我们可以从汇编语言的角度来看这个问题,测试程序:

//test.c

#include

int main() {    struct foo    {        int a;

int b[5];

int *c;    } x, y;    x.a = 666;    x.b[0] = 555;    x.c = NULL;    y = x;

return 0; }

程序定义了结构体 foo,它有3个成员变量:int 型数据 a、int 数组 b、int 指针 c,以观察是否对不同类型的成员有不同的处理。使用 gcc 将其编译:

gcc -S -masm=intel test.c

编译时并没有报错,说明编译器接受这种赋值方式,但赋值时具体发生了什么?打开其输出的汇编文件,关键部分为:

mov     DWORD PTR [esp 36], 666

mov     DWORD PTR [esp 40], 555

mov     DWORD PTR [esp 60], 0

lea     edx, [esp 8] lea     ebx, [esp 36]

mov     eax, 7

mov     edi, edx

mov     esi, ebx

mov     ecx, eax rep movsd

前面3条 mov 语句为给成员变量赋值的语句;中间两条 lea 语句得到了两块内存空间的偏移地址,第一块为新的内存空间,第二块为结构体 x 占有的内存空间;后面4条 mov 语句,第1、4条作用为把7赋给 ecx,第2条为把新内存空间地址赋给 edi,第3条为把 x 内存空间地址赋给 esi。关键在于最后一条语句:rep movsd。 
movsd 是一个串传送指令,其英文为 move string dword,具体作用为以 esi(Source Index)为源地址,以 edi(destination Index)为目的地址,将源地址处一个双字(dword)内容复制到目的地址。然后根据方向标志位 DF 的值,DF = 0,esi 与 edi 自增4,DF = 1,esi与edi自减4(dword 占用4个字节)。(但此处并没有使用 CLD 设置 DF 值,默认为0?)rep 可以根据 ecx 的值,重复执行 ecx 次 movsd 指令。 
这样的话,rep movsd 指令的作用是,将 esi 处的7个 dword 复制到 edi 处,而 foo 结构体正好占用4*7个字节(此处没有对齐的问题)。于是,x 的内容便被复制到了另一块相同大小的内存中,我们基本可以确定,这块空间就是 y 所占的空间。 
因此,我们可以得出结论,结构体可以直接赋值,且赋值的结果是将赋值号左边的结构体中的内容原原本本的

来源:http://blog.csdn.net/imred/article/details/45588477

【C语言】结构体赋值相关推荐

  1. C语言结构体赋值和有指针成员的结构体赋值

    1  结构体赋值 #include <windows.h>struct MyStruct {int a;int b;char c[20]; };int APIENTRY WinMain(H ...

  2. c语言结构体赋值时使用点号.

    最近发现一种比较方便的方式来对结构体进行赋值,那就是通过点号来赋值. 实例代码如下 struct { int a, b, c, d; }test={ .c = 3, .b = 2, .d = 4, . ...

  3. c语言结构体赋值,并输出各种类型变量的值

    1 代码 #include<stdio.h> struct Student{   char sex;   int age;   char name[10]; }; main(){   st ...

  4. c++ 结构体赋值_《零基础看得懂的C语言入门教程》—(十二)结构体是这么回事

    一.学习目标 了解C语言的结构体的使用方法 了解C语言结构体的结构的赋值 了解多种C语言结构体变量的赋值方法和取值方法 目录 <零基础看得懂的C语言入门教程>--(二)简单带你了解流程 & ...

  5. java发送c语言结构体_C语言中结构体直接赋值?

    在C语言中结构体变量之间可以进行赋值操作吗? 简单结构体的赋值 先说结论:一般来说,C语言中的结构体变量可以用另一个变量对其进行赋值或初始化.简单结构体(不包含指针成员)直接赋值没有问题. 我们先下面 ...

  6. 结构体复数相乘c语言,复数乘法中的结构体赋值实现代码

    复数乘法中的结构体赋值实现代码 废话不多说,直接上代码 复制代码 代码如下: #include using namespace std; typedef struct { double real; d ...

  7. c语言2个字符串可以相互赋值吗,c语言结构体2之变量赋值于字符串

    #include #include struct dangdang { char email[]; char name[]; char addr[]; int num; int bugnum; cha ...

  8. C语言结构体能否整体赋值

    C语言结构体能否整体赋值 先放结论 可以将一个结构体变量的值赋给另一个具有相同结构的结构体变量,但是需要满足一个条件. 整体赋值规则 ansi/iso C规定:"相同类型的结构体是可以直接赋 ...

  9. C语言 | 结构体成员数组赋值的问题

    C语言只有在定义字符数组的时候才能用"="来初始化变量,其它情况下是不能直接用"="来为字符数组赋值的,之所以不能赋值成功,是因为数组名是一个指针常量,指向固定 ...

  10. c语言 结构体数组的赋值

    c语言 结构体数组的赋值 //**创建结构体** #include<stdio.h> struct Class{int id;char name[10]; }; //******结构体数组 ...

最新文章

  1. 《伊拉图斯死之主》:硬核游戏也有相对放松的游戏体验
  2. Python3实现快速排序 通俗易懂
  3. Shiro-550反序列化漏洞复现
  4. [记录] --- linux上项目
  5. RN环境搭建(Android端)
  6. TDS、NET-Library和网络协议
  7. 【转】飞鸽端口号被占用时的解决方法
  8. 详谈归并排序时间复杂度过程推导----软考
  9. Linux之tar命令
  10. 五子棋项目结束总结_五子棋比赛总结报告
  11. RGGEDU-Rob Grimm静物食物美食菜谱摄影技巧与后期-中文字幕
  12. 推荐系统——Neural Collaborative Filtering(NMF)
  13. 360权重是什么,360权重怎么查询
  14. 在eclipse中用java代码测试是否成功连接数据库
  15. 用JavaScript实现倒记时特效代码--Java自学网
  16. 我对ACM初学者想说的话
  17. [COI2012] TRAMPOLIN
  18. 正确解决:坑爹的0xc000007b——应用程序无法正常启动
  19. 红米Redmi G Pro电脑系统经常崩溃怎么U盘重装?
  20. 基于Ardupilot/PX4固件,APM/PIXhawk硬件的VTOL垂直起降固定翼软硬件参数调试(第二篇)软硬件参数调试

热门文章

  1. 在您的Maven-Fu包中增加了一些东西
  2. J2Pay –实施网关
  3. mockito_吸收Mockito的流利度
  4. 过滤序列,惰性序列_Java 8的惰性序列实现
  5. 使用Spring Integration重试RabbitMQ
  6. 使用Junit和Easytest进行数据驱动的测试
  7. 多线程编程反模式_编程反模式
  8. dateformat线程_Java最佳实践–多线程环境中的DateFormat
  9. 使用Bean验证扩展PrimeFaces CSV
  10. Apache Mesos:编写您自己的分布式框架