近期的工作中对于C++项目的调试让可以看出自身对于C++指针内容还不够熟悉,对于指针的应用需要加强学习。
这次的错误主要发生在子程序调用全局变量的结构体指针赋值时发生错误。主要错误背景如下:
<head>
struct 结构体1
{
int ....
...
...
}结构体1
struct 结构体2
{
int ...
...
...
char data[];
}结构体2
<cpp>
//子程序功能:用另一个结构体exp2的内容给结构体exp1赋值
int subprogram( 结构体1 *exp1 )
{
char * ptrAck = (char *)malloc(data); //定义受到的数据包并开辟空间
receive(...............,ptrAck,....); //从socket接收数据包
结构体2 *exp2 = (结构体2 *) malloc ( sizeof( data ) ) ;
//定义结构体exp2并开辟空间
exp2 = ( 结构体2 *) ptrAck ;
//给结构体exp2赋值,内容为数据包中数据
exp1 = ( 结构体1 *) exp2->data;
//用结构体exp2中的data数组里的数据给结构体exp1赋值
fwrite(......,exp1 ,sizeof(exp1) ); //将结构体exp1内容打印,写入文件
return 0;
}
int main()
{
结构体1 exp1; //定义一个结构体1
subprogram( &exp1 ); //调用子程序给结构体exp1赋值
fwrite(......,exp1 ,sizeof(exp1) ); //将结构体exp1内容打印,写入文件
return 0;
}
在上述代码中出现了问题,在子程序subprogram中用exp1->data给exp2赋值后,在子程序内部的fwrite函数打印出的exp2数据是正确的,内容为exp1中的data数组存储数据,但是在主程序main中的fwrite函数打印出的数据却出现了错误。
经过测试,发现问题在于在子程序的第7行中用exp1->data来exp2赋值时,其语法导致在子函数中结构体指针*exp2暂时被赋值为exp1->data这个指针,所以打印时输出的数据为exp1->data中的数据,而程序跑出子程序后主程序中的exp2结构体并未赋值,结构体指针exp2的生命周期只到子程序结束为止,出了子程序就无法再指向exp1->data中的数据内容。
修改方法也很简单,在子程序第7行为exp2指针赋值时不可以直接赋值,需要改变exp2指针所指向的内存中的内容,即对指针指向的内容赋值,代码改变如下:
*exp1 = *( 结构体1 *) exp2->data;
//用结构体exp2中的data数组里的数据给结构体exp1赋值
由此可见指针知识在C++中的重要,还需学习。