问题描述某结构体定义如下:typedefstruct{intiAge;//agecharszAddr1[100];//address1char*pszAddr2;//address2char**pszAddr3;//地址3}T_PeopleInfo;如何给结构体中的每个成员变量(尤其是指针变量)赋值?问题分析及C代码示例我们可以看到,在结构体T_PeopleInfo中,pszAddr2和pszAddr3都是指针,其中pszAddr2是一级指针,pszAddr3是二级指针。这篇文章的重点是找到给一级指针和二级指针赋值的正确方法。我们将结构体T_PeopleInfo放到具体的C代码中,直观的展示了结构体中各个成员变量的赋值方式。我们首先编写如下程序(程序1):/***************************************************************************版权所有(C)2016,周肇雄。**文件名:PointerTest.c*文件标识:无*内容概要:演示指针使用*其他说明:无*当前版本:V1.0*作者:周兆雄*完成日期:20160712******************************************************************************/#include//重新定义数据类型typedefsignedintINT32;typedefunsignedintUINT32;typedefunsignedcharUINT8;//结构定义typedefstruct{UINT32iAge;//AgeUINT8szAddr1[100];//地址1UINT8*pszAddr2;//地址2UINT8**pszAddr3;//地址3}T_PeopleInfo;/***********************************************************************函数说明:主要函数*输入参数:无*输出参数:无*返回值:0-执行完成*其他说明:无*修改日期版本号修改内容修改*------------------------------------------------------------*20160712V1.0ZhouZhaoxiongCreated*********************************************************************/INT32main(void){T_PeopleInfoPeopleInfo={0};//结构变量赋值//赋值给iAgetPeopleInfo.iAge=10;//赋值给szAddr1strncpy(tPeopleInfo.szAddr1,"重庆,China!",strlen("Chongqing,China!"));//赋值给pszAddr2strncpy(tPeopleInfo.pszAddr2,"Chengdu,China!",strlen("Chengdu,China!"));//赋值给pszAddr3Valuestrncpy(tPeopleInfo.pszAddr3,"Wuhan,China!",strlen("Wuhan,China!"));//打印变量的值printf("Age=%d,Addr1=%s,Addr2=%s,Addr3=%s",tPeopleInfo.iAge,tPeopleInfo.szAddr1,tPeopleInfo.pszAddr2,tPeopleInfo.pszAddr3);return0;}在程序1中,我们按照结构体中给数组赋值的方法给指针赋值,程序可以编译通过。但是运行的时候,程序会挂掉。原因是没有为pszAddr2和pszAddr3指针分配内存空间。我们改进程序1,编写如下程序(程序2):/******************************************************************************Copyright(C)2016,ZhouZhaoxiong.**文件名:PointerTest.c*文件标识:无*内容概要:演示指针使用*其他说明:无*当前版本:V1.0*作者:周兆雄*完成日期:20160712******************************************************************************/#include//重新定义数据类型typedefsignedintINT32;typedefunsignedintUINT32;typedefsignedcharINT8;//结构定义typedefstruct{UINT32iAge;//AgeINT8szAddr1[100];//地址1INT8*pszAddr2;//地址2INT8**pszAddr3;//地址3}T_PeopleInfo;/***********************************************************************函数说明:主要函数*输入参数:无*输出参数:无*返回值:0-执行完成*其他说明:无*修改日期版本号修改内容修改*------------------------------------------------------------*20160712V1.0ZhouZhaoxiongCreated*********************************************************************/INT32main(void){T_PeopleInfoPeopleInfo={0};//结构变量赋值//赋值给iAgetPeopleInfo.iAge=10;//赋值给szAddr1strncpy(tPeopleInfo.szAddr1,"重庆,China!",strlen("Chongqing,China!"));//给pszAddr2赋值tPeopleInfo.pszAddr2=(INT8*)malloc(100);if(tPeopleInfo.pszAddr2==NULL){return-1;}strncpy(tPeopleInfo.pszAddr2,"Chengdu,China!",strlen("Chengdu,China!"));//给pszAddr3赋值tPeopleInfo.pszAddr3=(INT8*)malloc(100);if(tPeopleInfo.pszAddr3==NULL){return-2;}strncpy(tPeopleInfo.pszAddr3,"Wuhan,China!",strlen("Wuhan,China!"));//打印变量的值printf("Age=%d,Addr1=%s,Addr2=%s,Addr3=%s\n",tPeopleInfo.iAge,tPeopleInfo.szAddr1,tPeopleInfo.pszAddr2,tPeopleInfo.pszAddr3);return0;}在程序2中,我们首先使用malloc为pszAddr2和pszAddr3分配内存空间(注意,执行后malloc,判断指针是否为空),这时候可以给它们赋变量值。程序编译运行正常,输出结果如下:~/zhouzx/Test/PointerTest>PointerTestAge=10,Addr1=Chongqing,China!,Addr2=中国成都!,Addr3=中国武汉!除了程序2中一级指针和二级指针的正常赋值外,我们还可以编写如下程序(程序3):*Copyright(C)2016,ZhouZhaoxiong.**文件名:PointerTest.c*文件标识:无*内容概要:演示指针使用*其他说明:无*当前版本:V1.0*作者:周兆雄*完成日期:20160712******************************************************************************/#include//重新定义数据类型typedefsignedintINT32;typedefunsignedintUINT32;typedefsignedcharINT8;//结构定义typedefstruct{UINT32iAge;//AgeINT8szAddr1[100];//地址1INT8*pszAddr2;//地址2INT8**pszAddr3;//地址3}T_PeopleInfo;/***********************************************************************函数说明:主要函数*输入参数:无*输出参数:无*返回值:0-执行完成*其他说明:无*修改日期版本号修改内容修改*------------------------------------------------------------*20160712V1.0ZhouZhaoxiongCreated*********************************************************************/INT32main(void){T_PeopleInfoPeopleInfo={0};//结构变量赋值//赋值给iAgetPeopleInfo.iAge=10;//赋值给szAddr1strncpy(tPeopleInfo.szAddr1,"重庆,China!",strlen("Chongqing,China!"));//赋值tPeopleInfo.pszAddr2="Chengdu,China!"topszAddr2;//赋值tPeopleInfo.pszAddr3="中国武汉!"topszAddr3;//转打印变量值printf("Age=%d,Addr1=%s,Addr2=%s,Addr3=%s\n",tPeopleInfo.iAge,tPeopleInfo.szAddr1,tPeopleInfo.pszAddr2,tPeopleInfo.pszAddr3);return0;}程序3,我们直接给pszAddr2和pszAddr3赋值字符串,即将这两个字符串的首地址赋值给指针。那么,指针指向的地址中存储的内容就是字符串的值。程序编译运行正常,输出结果如下:~/zhouzx/Test/PointerTest>PointerTestAge=10,Addr1=Chongqing,China!,Addr2=Chengdu,China!,Addr3=Wuhan,China!另外,对于第二层的指针赋值,我们还可以编写如下程序(程序4):/****************************************************************************版权所有(C)2016,周肇雄.**文件名:PointerTest.c*文件标识:无*内容概要:演示指针使用*其他说明:无*当前版本:V1.0*作者:周兆雄*完成日期:20160712******************************************************************************/#include//重新定义数据类型typedefsignedintINT32;typedefunsignedintUINT32;typedefsignedcharINT8;//结构定义typedefstruct{UINT32iAge;//AgeINT8szAddr1[100];//地址1INT8*pszAddr2;//地址2INT8**pszAddr3;//地址3}T_PeopleInfo;/***********************************************************************函数说明:主要函数*输入参数:无*输出参数:无*返回值:0-执行完成*其他说明:无*修改日期版本号修改内容修改*------------------------------------------------------------*20160712V1.0ZhouZhaoxiongCreated*********************************************************************/INT32main(void){T_PeopleInfoPeopleInfo={0};//结构变量赋值//赋值给iAgetPeopleInfo.iAge=10;//赋值给szAddr1strncpy(tPeopleInfo.szAddr1,"重庆,China!",strlen("Chongqing,China!"));//赋值pszAddr2tPeopleInfo.pszAddr2="Chengdu,China!";//赋值pszAddr3tPeopleInfo.pszAddr3=(INT8*)malloc(100);if(人物eInfo.pszAddr3==NULL){return-1;}*(tPeopleInfo.pszAddr3)="Wuhan,China!";//打印变量的值printf("Age=%d,Addr1=%s,Addr2=%s,Addr3=%s\n",tPeopleInfo.iAge,tPeopleInfo.szAddr1,tPeopleInfo.pszAddr2,*(tPeopleInfo.pszAddr3));return0;}在程序4中,我们首先使用malloc为pszAddr3分配内存空间,然后然后就可以使用这个指针来接收字符串变量的值了(注意这里“Wuhan,China!”被赋值给了*(tPeopleInfo.pszAddr3))。程序编译运行正常,输出如下:~/zhouzx/Test/PointerTest>PointerTestAge=10,Addr1=Chongqing,China!,Addr2=Chengdu,China!,Addr3=Wuhan,China!总结本文分析了结构体中的指针赋值问题,并用C代码演示了指针赋值方法。在实际的C语言项目中,很多程序出现问题,都是由于指针处理不当造成的。因此,熟练使用各种指针是一个合格的软件开发人员的基本要求。【本文为专栏作家周兆雄原创文章,作者微信公众号:周氏逻辑(logiczhou)】