项目中:
pCwmpParamValueArray[(*ulPresetParamCount)++].Name = CcspTr069PaCloneString("Device.DeviceSummary" );
printfExplictly("pCwmpParamValueArray[%lu]=%s\n",*ulPresetParamCount-1,pCwmpParamValueArray[*ulPresetParamCount-1].Name);
pCwmpParamValueArray[(*ulPresetParamCount)++].Name = CcspTr069PaCloneString("Device.DeviceInfo.Manufacturer" );
printfExplictly("pCwmpParamValueArray[%lu]=%s\n",*ulPresetParamCount-1,pCwmpParamValueArray[*ulPresetParamCount-1].Name);
被误写成:
pCwmpParamValueArray[*(ulPresetParamCount)++].Name = CcspTr069PaCloneString("Device.DeviceSummary" );
printfExplictly("pCwmpParamValueArray[%lu]=%s\n",*ulPresetParamCount-1,pCwmpParamValueArray[*ulPresetParamCount-1].Name);
pCwmpParamValueArray[*(ulPresetParamCount)++].Name = CcspTr069PaCloneString("Device.DeviceInfo.Manufacturer" );
printfExplictly("pCwmpParamValueArray[%lu]=%s\n",*ulPresetParamCount-1,pCwmpParamValueArray[*ulPresetParamCount-1].Name);
结果编译完全不提示,因为语法是合格的。
打印pCwmpParamValueArray.Name老是为空,而*(ulPresetParamCount)++被打印出来成4294967295(这个数是2^32-1)
分析原因:
c语言运算符优先级:
(*ulPresetParamCount)++是先解引用ulPresetParamCount在将解引用后的值加加,加加后由0变为1;
*(ulPresetParamCount)++是先将指针ulPresetParamCount加加,为野指针,即ulPresetParamCount后移四个字节的代码段地址,解引用为未定义的值,这里就是4294967295
于是将代码优化,解引用耗内存,后面的很多次解引用,都用变量index_start++代替(*ulPresetParamCount)++
结果也不能这样,别人希望*ulPresetParamCount)添加一个就把该引用加1,然后*ulPresetParamCount)是个参数,是要传到外面的,可以后面直接加总数*ulPresetParamCount+=27,但是这样的话别人二次修改的时候很可能把这件事忘了,so就让他(*ulPresetParamCount)++吧!