【C语言】结构体赋值
结构体在 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语言】结构体赋值相关推荐
- C语言结构体赋值和有指针成员的结构体赋值
1 结构体赋值 #include <windows.h>struct MyStruct {int a;int b;char c[20]; };int APIENTRY WinMain(H ...
- c语言结构体赋值时使用点号.
最近发现一种比较方便的方式来对结构体进行赋值,那就是通过点号来赋值. 实例代码如下 struct { int a, b, c, d; }test={ .c = 3, .b = 2, .d = 4, . ...
- c语言结构体赋值,并输出各种类型变量的值
1 代码 #include<stdio.h> struct Student{ char sex; int age; char name[10]; }; main(){ st ...
- c++ 结构体赋值_《零基础看得懂的C语言入门教程》—(十二)结构体是这么回事
一.学习目标 了解C语言的结构体的使用方法 了解C语言结构体的结构的赋值 了解多种C语言结构体变量的赋值方法和取值方法 目录 <零基础看得懂的C语言入门教程>--(二)简单带你了解流程 & ...
- java发送c语言结构体_C语言中结构体直接赋值?
在C语言中结构体变量之间可以进行赋值操作吗? 简单结构体的赋值 先说结论:一般来说,C语言中的结构体变量可以用另一个变量对其进行赋值或初始化.简单结构体(不包含指针成员)直接赋值没有问题. 我们先下面 ...
- 结构体复数相乘c语言,复数乘法中的结构体赋值实现代码
复数乘法中的结构体赋值实现代码 废话不多说,直接上代码 复制代码 代码如下: #include using namespace std; typedef struct { double real; d ...
- c语言2个字符串可以相互赋值吗,c语言结构体2之变量赋值于字符串
#include #include struct dangdang { char email[]; char name[]; char addr[]; int num; int bugnum; cha ...
- C语言结构体能否整体赋值
C语言结构体能否整体赋值 先放结论 可以将一个结构体变量的值赋给另一个具有相同结构的结构体变量,但是需要满足一个条件. 整体赋值规则 ansi/iso C规定:"相同类型的结构体是可以直接赋 ...
- C语言 | 结构体成员数组赋值的问题
C语言只有在定义字符数组的时候才能用"="来初始化变量,其它情况下是不能直接用"="来为字符数组赋值的,之所以不能赋值成功,是因为数组名是一个指针常量,指向固定 ...
- c语言 结构体数组的赋值
c语言 结构体数组的赋值 //**创建结构体** #include<stdio.h> struct Class{int id;char name[10]; }; //******结构体数组 ...
最新文章
- 《伊拉图斯死之主》:硬核游戏也有相对放松的游戏体验
- Python3实现快速排序 通俗易懂
- Shiro-550反序列化漏洞复现
- [记录] --- linux上项目
- RN环境搭建(Android端)
- TDS、NET-Library和网络协议
- 【转】飞鸽端口号被占用时的解决方法
- 详谈归并排序时间复杂度过程推导----软考
- Linux之tar命令
- 五子棋项目结束总结_五子棋比赛总结报告
- RGGEDU-Rob Grimm静物食物美食菜谱摄影技巧与后期-中文字幕
- 推荐系统——Neural Collaborative Filtering(NMF)
- 360权重是什么,360权重怎么查询
- 在eclipse中用java代码测试是否成功连接数据库
- 用JavaScript实现倒记时特效代码--Java自学网
- 我对ACM初学者想说的话
- [COI2012] TRAMPOLIN
- 正确解决:坑爹的0xc000007b——应用程序无法正常启动
- 红米Redmi G Pro电脑系统经常崩溃怎么U盘重装?
- 基于Ardupilot/PX4固件,APM/PIXhawk硬件的VTOL垂直起降固定翼软硬件参数调试(第二篇)软硬件参数调试