搜索
bottom↓
回复: 33

C语言结构体A可以直接赋值给结构体B吗?

[复制链接]

出0入0汤圆

发表于 2007-11-8 10:00:15 | 显示全部楼层 |阅读模式
C语言结构体A可以直接赋值给结构体B吗?

两个类型相同的结构体A,B
A=B;或者B=A可以吗?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2007-11-8 10:17:40 | 显示全部楼层
两个结构体A,B  
A=B;或者B=A可以吗?
不可以,不过可以试试memcpy

结构体清零A=0;行吗?
不可以

还是memset(&A,0,sizeof(A));  
可以

试一下不就知道了,呵呵

出0入0汤圆

发表于 2007-11-8 10:35:41 | 显示全部楼层
C里面可不可以自己写结构体的复制和赋值程序啊?

就是 void copy(struct&){}这种啊?
如果可以的话,就方便了。

出0入0汤圆

发表于 2007-11-8 10:36:27 | 显示全部楼层
交大才子阿莫不懂也不屑回答你的问题,就由我这个技校生来胡扯两句吧

a=b b=a 是可以的

出0入0汤圆

发表于 2007-11-8 10:51:22 | 显示全部楼层
相同结构体类型变量是可以赋值的

出0入0汤圆

发表于 2007-11-8 10:56:08 | 显示全部楼层
好像不可以,结构体A或者B代表的是个地址

出0入0汤圆

发表于 2007-11-8 11:03:44 | 显示全部楼层
楼上说的对
结构体表示的是指针
a=b
只是说明定义a为指向b的另一个指针
例:0x0202 存放结构体b的初始位置
那么复制后,a就变成了0x0202;
也就是a就是b,b就是a,无法分开操作
如果想要真正的复制,则要真正的复制
需要的是重写函数
我不知道硬件中支持不

偶不懂硬件,可是要学硬件,......

出0入0汤圆

发表于 2007-11-8 11:54:54 | 显示全部楼层
汗,A = B当然可以!试下不就知道了.

出0入0汤圆

 楼主| 发表于 2007-11-8 12:01:04 | 显示全部楼层
A=B 可以的,A=0不可以。

出0入0汤圆

发表于 2007-11-8 12:14:38 | 显示全部楼层
如果可以的话,
试想一下,会不会出现内存泄漏呢。

我记得谭老的那本书上说不可以的。
结构体表示的是指针,今天受教了。

出0入0汤圆

发表于 2007-11-8 12:22:00 | 显示全部楼层
A=B可,A=0不可.

出0入0汤圆

发表于 2007-11-8 12:23:57 | 显示全部楼层
我支持蚂蚁,如果大家任性胡来,结果降很难预测。

出0入0汤圆

发表于 2007-11-8 12:26:52 | 显示全部楼层
老谭的那本书已经老了,有和C标准差异的地方,也有该提到但没提到的部分。
比如相互兼容的结构体间(最普通的就是同一类型的结构体)简单赋值(就是“=”),以C9x的标准,是可以直接直接赋值的,编译器会完成所有成员的值的复制过程的代码(在8位机上就是字节方式复制了)。现代的编译器普遍都支持这个特性了。
赋值所需条件如下(C99标准文件,注意第2个条件就是结构体和联合体):
ISO/IEC 9899:1999 (E) ©ISO/IEC
6.5.16.1 Simple assignment
Constraints
1 One of the following shall hold:93)
— the left operand has qualified or unqualified arithmetic type and the right has
arithmetic type;
— the left operand has a qualified or unqualified version of a structure or union type
compatible with the type of the right;
— both operands are pointers to qualified or unqualified versions of compatible types,
and the type pointed to by the left has all the qualifiers of the type pointed to by the
right;
— one operand is a pointer to an object or incomplete type and the other is a pointer to a
qualified or unqualified version of void, and the type pointed to by the left has all
the qualifiers of the type pointed to by the right; or
— the left operand is a pointer and the right is a null pointer constant.
— the left operand has type _Bool and the right is a pointer.

出0入0汤圆

发表于 2007-11-8 13:02:01 | 显示全部楼层
typedef struct
{
unsigned char Ret;
char *Str;
unsigned char Checked;
}tDiag;       
         tDiag A1={1,"111",0};
        tDiag A2={2,"222",0};
        tDiag B1={3,"333",0};
        tDiag B2={4,"444",0};

        tDiag *p;

        p = &A2;
        ScrPrint(0,0,ASCII,"&A1=%p",&A1);//0x285eff7c
        ScrPrint(0,1,ASCII,"A1=%p",A1);//0x1
        ScrPrint(0,2,ASCII,"A1.Str=%s",A1.Str);//111
        memcpy(&A1,&B1,sizeof(A1));
        ScrPrint(0,3,ASCII,"&A1=%p",&A1);//0x285eff7c
        ScrPrint(0,4,ASCII,"A1=%p",A1);//0x3
        ScrPrint(0,5,ASCII,"A1.Str=%s",A1.Str);//333
        getkey();
        ScrCls();

        ScrPrint(0,0,ASCII,"&A2=%p",&A2);//0x285eff70
        ScrPrint(0,1,ASCII,"A2=%p",A2);//0x2
        ScrPrint(0,2,ASCII,"A2.Str=%s",A2.Str);//222
        A2=B2;
        ScrPrint(0,3,ASCII,"&A2=%p",&A2);//0x285eff70 地址没变
        ScrPrint(0,4,ASCII,"A2=%p",A2);//0x4
        ScrPrint(0,5,ASCII,"A2.Str=%s",A2.Str);//444
        ScrPrint(0,6,ASCII,"*p.Str=%s",(*p).Str);//444
        getkey();
编译环境:GCCARM(GCC 3.0)
结论:
1.在新的编译器下,相同类型的结构体可民直接赋值,即A =B;
2.在使用此特性前,建议测试一下你的编译器,同时此代码以后会不会用到其他编译平台。
否则,还是memcpy(&A1,&B1,sizeof(A1));

出0入0汤圆

 楼主| 发表于 2007-11-8 13:02:35 | 显示全部楼层
已经是C标准了。
在IAR和GCC上是完全可以的。


另外,函数返回值可以返回一个结构体,并赋值给另外一个结构体。

STRUCT A;
STRUCT fun(void);
A=fun();

出0入0汤圆

发表于 2007-11-8 13:04:48 | 显示全部楼层
A = 0;
编译不过。

出0入0汤圆

 楼主| 发表于 2007-11-8 13:07:46 | 显示全部楼层
A=0;

0不是与A类型一样的结构体,当然编译不过。

出0入0汤圆

发表于 2007-11-8 13:31:05 | 显示全部楼层
这个时候就想起了C++里面的类了,呵呵……

如果A.init();这样可以的话,该多好……

出0入0汤圆

发表于 2007-11-8 13:41:45 | 显示全部楼层
当然可以,老谭的书误导很多人

出0入0汤圆

发表于 2007-11-8 13:49:16 | 显示全部楼层
也不能说是误导,人家是C89标准,呵呵。

出0入0汤圆

发表于 2007-11-8 15:50:52 | 显示全部楼层
肯定可以撒

出0入0汤圆

发表于 2009-5-25 00:05:43 | 显示全部楼层
看c primer plus吧  c99的  可以的

出0入0汤圆

发表于 2009-5-25 08:46:03 | 显示全部楼层
C语言应该不可以。
 除非你用C++语言,并且重载“=”运算符。

出0入296汤圆

发表于 2009-5-25 10:35:22 | 显示全部楼层
A = 0;不行,但是换成 A={0};就OK了……

出0入0汤圆

发表于 2009-5-25 10:36:23 | 显示全部楼层
使用指针的方法是可以的

出0入0汤圆

发表于 2009-12-21 20:56:44 | 显示全部楼层
可以的,自己试试不就行了?从来不看谭浩强的书的飘过……好多地方都跟ansi不一样

出0入0汤圆

发表于 2009-12-23 10:50:31 | 显示全部楼层
ls真神人也,不看就知道不一样,算出来的??

出0入0汤圆

发表于 2012-8-7 11:27:40 | 显示全部楼层
结构体A、B虽然一般都是表示指针
但是 A = B  或者B = A时,都是赋值语句,不是当做指针来用的 A = B这条语句对B这个结构体不产生任何影响
所以可以在这方面可以给结构体实现常数形式的赋值

出0入0汤圆

发表于 2014-5-27 14:53:02 | 显示全部楼层
测试过,是完全可以的。

出0入42汤圆

发表于 2014-5-27 15:07:57 | 显示全部楼层
结构体名称不是指针!!
*p = &struct_name这里就看出来了, 某种意义来说,名称相当于第一个成员.

a=b, b=a, 就是所谓的浅拷贝, 不存在内存泄露, 如果结构体成员指向自行分配的堆内存,那就悲剧大了. 可能出现各种野指针

出0入0汤圆

发表于 2014-11-3 18:17:07 | 显示全部楼层
albert_w 发表于 2014-5-27 15:07
结构体名称不是指针!!
*p = &struct_name这里就看出来了, 某种意义来说,名称相当于第一个成员.

我查了一下“浅拷贝”,大概的意思就是复制地址,但不会新建内存空间。

但是结构体名称不是指针,请问是如何进行浅拷贝的?

出0入0汤圆

发表于 2014-11-3 19:20:49 | 显示全部楼层
只要A,B结构体类型相同,是可以A = B这样直接赋值的。

出0入0汤圆

发表于 2014-11-3 22:51:57 | 显示全部楼层
谢谢分享!!!!

出0入0汤圆

发表于 2014-11-4 12:14:35 | 显示全部楼层
yyccaa 发表于 2007-11-8 12:26
老谭的那本书已经老了,有和C标准差异的地方,也有该提到但没提到的部分。
比如相互兼容的结构体间(最普通 ...

老谭的书没有错,他的书遵循的是C89标准,那本书92年出来的,而C9X就是1999年的标准,老谭能认识么....
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-4 02:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表