最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【整理】C语言中的结构体直接用等号去赋值

工作和技术 crifan 7071浏览 0评论

近日在Linux代码中,发现一个现象,即,有个两个同类型的结构体,直接用等号“=”去赋值:

drivers/i2c/i2c-boardinfo.c中:

int __init i2c_register_board_info(int busnum, struct i2c_board_info const *info, unsigned len)
{

struct i2c_devinfo *devinfo;

devinfo->board_info = *info;

}

其中:

struct i2c_devinfo {
struct list_head list;
int    busnum;
struct i2c_board_info board_info;
};

struct i2c_board_info {
char   type[I2C_NAME_SIZE];
unsigned short flags;
unsigned short addr;
void   *platform_data;
struct dev_archdata *archdata;
int   irq;
};

上述代码中,devinfo->board_info = *info;,就是把结构体*info直接用=,赋值给devinfo->board_info,而不是以前见到的,通过memcpy或者两者都是指针,通过指针赋值而达到类似的效果。

看到这样的代码,第一反应是,以前学习谭浩强大哥的C语言的时候,记得说是不允许结构体直接等号赋值的,而是要每一个成员变量单独赋值才可以的。

但是很奇怪的是,这部分代码的确是正常工作的。

首先,人家Linux内核的代码,肯定是经过充分验证,可以使用的。其次用gcc去编译Linux此代码也是没有任何警告和错误的;再者,我加了打印代码,发现代码只是也是工作正常的,用=赋值后,对应的变量的值的确是赋值过去的。

所以,就去找了下网上有没有其他人也遇到此疑问的,后来找到了一个:

C里面何时出了对结构体赋值的支持的?

http://www.abc188.com/info/html/chengxusheji/C-C–/20080224/13056.html

也是说到此问题,说明gcc(默认的应该是C89(也叫C90)的版本)是直接支持此功能的。而谭大哥的C语言书,的确是应该纠正一下了。

【总结】

经过验证,C语言里面是直接支持两个同类型结构体直接用等号“=”去进行赋值的。实际作用等效于用memcpy去将值拷贝赋值过去,和用每个结构体的成员变量单独去赋值,本质都是一样的。不过其优点更明显,代码更简洁。

转载请注明:在路上 » 【整理】C语言中的结构体直接用等号去赋值

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (2)

  1. Oh,错了,加减不行,要重载运算符
    林缘雨梦15年前 (2010-05-16)回复
  2. 在VC中也可以,好像还能做加减,不过其他的就没测试过
    林缘雨梦15年前 (2010-05-16)回复
82 queries in 0.169 seconds, using 22.13MB memory