近日在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此代码也是没有任何警告和错误的;再者,我加了打印代码,发现代码只是也是工作正常的,用=赋值后,对应的变量的值的确是赋值过去的。
所以,就去找了下网上有没有其他人也遇到此疑问的,后来找到了一个:
http://www.abc188.com/info/html/chengxusheji/C-C–/20080224/13056.html
也是说到此问题,说明gcc(默认的应该是C89(也叫C90)的版本)是直接支持此功能的。而谭大哥的C语言书,的确是应该纠正一下了。
【总结】
经过验证,C语言里面是直接支持两个同类型结构体直接用等号“=”去进行赋值的。实际作用等效于用memcpy去将值拷贝赋值过去,和用每个结构体的成员变量单独去赋值,本质都是一样的。不过其优点更明显,代码更简洁。
转载请注明:在路上 » 【整理】C语言中的结构体直接用等号去赋值