1. 结构体整体赋值
结构体可以整体赋值,例如 a= b;但是a b必须为相同的结构体类型;
结构体的初始化:在声明变量时即初始化各成员,可称为定义性声明。例如
- struct st1 st1 = {1,2,3);
struct st1 st1;
st1 = (struct st1){1,2,3};
否则若是不加强制转换 st1 = {1,2,3};
则会出现expected expression before '{'token 的编译错误,因为{1,2,3}为复合语句。
再者对于结构体的赋值可以引申出 深拷贝和浅拷贝的概念,以下列说明。
struct A
{
int a1;
int a2;
}A1,A2;
A1=A2 是可以的,不可以 if(A == B)。因为c中,自定义类型、数组都是要另外自己定义复制函数的。
结构体中若含有指针等变量,例如
struct B{
char *v1;
int v2;} c,d;
c = d;c、 d的指针成员只是指向了同一个地址(系统不会为c中的指针成员分配地址空间),若C中的指针释放了地址,D中的指针成员v1就会变成野指针,会造成安装隐患。所以对于含有指针成员变量的结构体,不要直接赋值(浅拷贝).对于函数数组的结构体,是可以直接赋值的(浅拷贝)。所以对于结构体的赋值,最好是逐个成员拷贝或者使用memcpy函数.
用一句简单的话来说就是浅拷贝,只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!C++中=重载其是就是实现了浅拷贝
2.使用函数指针数组
当需要分类处理上一次的输入时,如果每个分支的处理函数的参数和返回值都相同,而且分支很多,此时可以考虑使用函数指针数组来处理,以减少使用case分类时的代码量。
例如:首先定义函数指针数组 int(*fun[40])(void);
其次实现分支处理函数,如下文中的test_create_listen;
初始化函数指针数组,如下文中的init_wbttest_fun;
最后调用:如下文中的int test_entry;
int init_wbttest_fun(void)
{
fun[1] = test_create_listen;
fun[2] = test_get_broadcastIP;
fun[3] = test_close_resource;
fun[4] = test_send_version_to_server;
fun[5] = test_connect_server;
fun[6] = test_check_domain_change;
fun[7] = test_sock_connect_by_ip;
}
最后调用实现:int test_entry(int mask) //mask为输入
{
int ret =0;
init_wbttest_fun();
A_PRINTF("enter %s mask =%d\n",__func__,mask);
if(0 == mask)
{
A_PRINTF("white box test nofunction\n");
return 0;
}
else
{
A_PRINTF("white box test start\n");
ret = (*fun[mask])();
A_PRINTF("white box test end\n");
}
return ret;
}
3 常见编译error:
编译error1: implicit declaration of function 'test_entry'
字面意思: 隐式声明的函数
原因是:没有包含该函数所在的头文件,或者头文件中没有添加该文件的声明
编译error2:: expected ‘=’, ‘,’,‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
这类错误很可能是因为缺少分号等格式引起的错误,例如:
haier_alarm.c: In function ‘test_sock_connect_by_ip’:
haier_alarm.c:11: error: expected ‘=’, ‘,’,‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
haier_alarm.c:58: error: expected ‘=’, ‘,’,‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
haier_alarm.c:69: error: expected ‘=’, ‘,’,‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
haier_alarm.c:141: error: expected ‘=’,‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
haier_alarm.c:179: error: expected ‘=’,‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
haier_alarm.c:214: error: old-styleparameter declarations in prototyped function definition
haier_alarm.c:214: error: expected ‘{’ atend of input
make: *** [haier_alarm.o] Error 2
原因:test_sock_connect_by_ip 在haier_wht.h 中声明,haier_alarm文件包含了haier_wht.h.但是test_sock_connect_by_ip声明时忘记了加分号。因此在编译haier_alarm.c文件时,出现上述提出错误。
编译error3:warning: no newline at end of file
解决办法:在*.c文件最后面添加上一个回车,独立成一行。(在程序代码的最后面多敲一个空行,也就是说在右括号后打个回车键。因为gcc对你的源文件有要求,就是.c or .cpp文件后面要有一个空行)
分析:应该是编译器需要文件最后有一个回车,作为文件结尾。