输入参数一处隐藏错误,致命错误

大部分函数的参数都是用于输入

但,也存在用于输出

比如说:

bool AddFun(int nItem, int &nRet);

像第二个参数 nRet是可以用于输出,当然也可以做输入

由于C语言限制,C语言里要这样写:

bool AddFun(int nItem, int *nRet);

写法不一样,功能是一样的。

 

这里会存在问题的,而且是致命的,所以使用的时候要注意!

例如:

函数

bool AddFun(int32_t dwID, int32_t *dwNameID)

{

  ....

  ....

  *dwNameID = 8;  //随便举个例子,就是说这个参数被改变了(重新赋值)

  ....

}

 

实际调用的地方:

static int16_t wTestFlag = 34;

static int16_t wNameID = 0;

 

AddFun(123456, &wNameID);

 

////补充 int16_t 表示2字节的整形,int32_t 表示4字节的整形

 

////不知道有没有发现问题?

是的,这样写编译没有问题,结果也未必会有错误的影响。

 

注意:

输入源:wNameID 是一个 2字节整形,AddFun 的参数是4字节的,

如果调用 AddFun,那么  会从 &wNameID 地址开始 连续 取4个字节

而AddFun 会对这个地址进行赋值操作,这样原先2字节的前面两个字节会因为重新赋值而变成0,

这样就会出现奇怪的问题,临近的变量 莫名的被改掉,很危险。

 

 

所以,如果作为输出用的参数,就不要强制转换了,当然也包括各种结构体,类等参数

 

posted @ 2020-09-30 16:36  小刚学长  阅读(154)  评论(0)    收藏  举报