ATmega32 发表于 2007-11-8 10:00:15

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

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

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

xielihong 发表于 2007-11-8 10:17:40

两个结构体A,B
A=B;或者B=A可以吗?
不可以,不过可以试试memcpy

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

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

试一下不就知道了,呵呵

fineshang 发表于 2007-11-8 10:35:41

C里面可不可以自己写结构体的复制和赋值程序啊?

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

xvewwe 发表于 2007-11-8 10:36:27

交大才子阿莫不懂也不屑回答你的问题,就由我这个技校生来胡扯两句吧

a=b b=a 是可以的

xuanyusyj 发表于 2007-11-8 10:51:22

相同结构体类型变量是可以赋值的

xyang18 发表于 2007-11-8 10:56:08

好像不可以,结构体A或者B代表的是个地址

fineshang 发表于 2007-11-8 11:03:44

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

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

glbest 发表于 2007-11-8 11:54:54

汗,A = B当然可以!试下不就知道了.

ATmega32 发表于 2007-11-8 12:01:04

A=B 可以的,A=0不可以。

xielihong 发表于 2007-11-8 12:14:38

如果可以的话,
试想一下,会不会出现内存泄漏呢。

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

passerby 发表于 2007-11-8 12:22:00

A=B可,A=0不可.

tanyang 发表于 2007-11-8 12:23:57

我支持蚂蚁,如果大家任性胡来,结果降很难预测。

yyccaa 发表于 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.

xielihong 发表于 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));

ATmega32 发表于 2007-11-8 13:02:35

已经是C标准了。
在IAR和GCC上是完全可以的。


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

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

xielihong 发表于 2007-11-8 13:04:48

A = 0;
编译不过。

ATmega32 发表于 2007-11-8 13:07:46

A=0;

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

dvhome 发表于 2007-11-8 13:31:05

这个时候就想起了C++里面的类了,呵呵……

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

fhqmc 发表于 2007-11-8 13:41:45

当然可以,老谭的书误导很多人

xielihong 发表于 2007-11-8 13:49:16

也不能说是误导,人家是C89标准,呵呵。

sy_110034 发表于 2007-11-8 15:50:52

肯定可以撒

chuyu111 发表于 2009-5-25 00:05:43

看c primer plus吧c99的可以的

ba_wang_mao 发表于 2009-5-25 08:46:03

C语言应该不可以。
 除非你用C++语言,并且重载“=”运算符。

Gorgon_Meducer 发表于 2009-5-25 10:35:22

A = 0;不行,但是换成 A={0};就OK了……

marlbroro 发表于 2009-5-25 10:36:23

使用指针的方法是可以的

eggcar 发表于 2009-12-21 20:56:44

可以的,自己试试不就行了?从来不看谭浩强的书的飘过……好多地方都跟ansi不一样

gotofly2001 发表于 2009-12-23 10:50:31

ls真神人也,不看就知道不一样,算出来的??

wangshaosh123 发表于 2012-8-7 11:27:40

结构体A、B虽然一般都是表示指针
但是 A = B或者B = A时,都是赋值语句,不是当做指针来用的 A = B这条语句对B这个结构体不产生任何影响
所以可以在这方面可以给结构体实现常数形式的赋值

aragon 发表于 2014-5-27 14:53:02

测试过,是完全可以的。

albert_w 发表于 2014-5-27 15:07:57

结构体名称不是指针!!
*p = &struct_name这里就看出来了, 某种意义来说,名称相当于第一个成员.

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

RUANJI 发表于 2014-11-3 18:17:07

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



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

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

Gallen.Zhang 发表于 2014-11-3 19:20:49

只要A,B结构体类型相同,是可以A = B这样直接赋值的。

雨中的风铃 发表于 2014-11-3 22:51:57

谢谢分享!!!!

451006071 发表于 2014-11-4 12:14:35

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

老谭的书没有错,他的书遵循的是C89标准,那本书92年出来的,而C9X就是1999年的标准,老谭能认识么....
页: [1]
查看完整版本: C语言结构体A可以直接赋值给结构体B吗?