C语言问题总结

1. 结构体整体赋值

结构体可以整体赋值,例如 a= b;但是a b必须为相同的结构体类型;

结构体的初始化:在声明变量时即初始化各成员,可称为定义性声明。例如

  1. 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文件后面要有一个空行)

分析:应该是编译器需要文件最后有一个回车,作为文件结尾。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值