结构体中指针赋值问题的分析及C代码示例

2016-12-13 09:37:51来源:作者:51CTO人点击

第七城市

问题描述

某结构体的定义如下:

typedefstruct{intiAge;//年龄charszAddr1[100];//地址1char*pszAddr2;//地址2char**pszAddr3;//地址3}T_PeopleInfo;

请问如何对结构体中的各个成员变量(尤其是指针变量)进行赋值?

问题分析及C代码示例

我们可以看到,在结构体T_PeopleInfo中,pszAddr2和pszAddr3均为指针,其中pszAddr2为一级指针,pszAddr3为二级指针。本文的重点,就是要找到对一级指针和二级指针赋值的正确方法。

我们把结构体T_PeopleInfo放到具体的C代码中,以直观地展现对结构体中的各个成员变量的赋值方法。

我们首先编写如下程序(程序1):

/***********************************************************************版权所有(C)2016,ZhouZhaoxiong。**文件名称:PointerTest.c*文件标识:无*内容摘要:演示指针的用法*其它说明:无*当前版本:V1.0*作者:ZhouZhaoxiong*完成日期:20160712***********************************************************************/#include<stdio.h>//重定义数据类型typedefsignedintINT32;typedefunsignedintUINT32;typedefunsignedcharUINT8;//结构体定义typedefstruct{UINT32iAge;//年龄UINT8szAddr1[100];//地址1UINT8*pszAddr2;//地址2UINT8**pszAddr3;//地址3}T_PeopleInfo;/*****************************************************************功能描述:主函数*输入参数:无*输出参数:无*返回值:0-执行完成*其他说明:无*修改日期版本号修改人修改内容*-------------------------------------------------------------*20160712V1.0ZhouZhaoxiong创建****************************************************************/INT32main(void){T_PeopleInfotPeopleInfo={0};//结构体变量赋值//对iAge赋值tPeopleInfo.iAge=10;//对szAddr1赋值strncpy(tPeopleInfo.szAddr1,"Chongqing,China!",strlen("Chongqing,China!"));//对pszAddr2赋值strncpy(tPeopleInfo.pszAddr2,"Chengdu,China!",strlen("Chengdu,China!"));//对pszAddr3赋值strncpy(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):

/***********************************************************************版权所有(C)2016,ZhouZhaoxiong。**文件名称:PointerTest.c*文件标识:无*内容摘要:演示指针的用法*其它说明:无*当前版本:V1.0*作者:ZhouZhaoxiong*完成日期:20160712***********************************************************************/#include<stdio.h>//重定义数据类型typedefsignedintINT32;typedefunsignedintUINT32;typedefsignedcharINT8;//结构体定义typedefstruct{UINT32iAge;//年龄INT8szAddr1[100];//地址1INT8*pszAddr2;//地址2INT8**pszAddr3;//地址3}T_PeopleInfo;/*****************************************************************功能描述:主函数*输入参数:无*输出参数:无*返回值:0-执行完成*其他说明:无*修改日期版本号修改人修改内容*-------------------------------------------------------------*20160712V1.0ZhouZhaoxiong创建****************************************************************/INT32main(void){T_PeopleInfotPeopleInfo={0};//结构体变量赋值//对iAge赋值tPeopleInfo.iAge=10;//对szAddr1赋值strncpy(tPeopleInfo.szAddr1,"Chongqing,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=Chengdu,China!,Addr3=Wuhan,China!

除了程序2可以实现对一级指针和二级指针的正常赋值之外,我们还可以编写如下程序(程序3):

*版权所有(C)2016,ZhouZhaoxiong。**文件名称:PointerTest.c*文件标识:无*内容摘要:演示指针的用法*其它说明:无*当前版本:V1.0*作者:ZhouZhaoxiong*完成日期:20160712***********************************************************************/#include<stdio.h>//重定义数据类型typedefsignedintINT32;typedefunsignedintUINT32;typedefsignedcharINT8;//结构体定义typedefstruct{UINT32iAge;//年龄INT8szAddr1[100];//地址1INT8*pszAddr2;//地址2INT8**pszAddr3;//地址3}T_PeopleInfo;/*****************************************************************功能描述:主函数*输入参数:无*输出参数:无*返回值:0-执行完成*其他说明:无*修改日期版本号修改人修改内容*-------------------------------------------------------------*20160712V1.0ZhouZhaoxiong创建****************************************************************/INT32main(void){T_PeopleInfotPeopleInfo={0};//结构体变量赋值//对iAge赋值tPeopleInfo.iAge=10;//对szAddr1赋值strncpy(tPeopleInfo.szAddr1,"Chongqing,China!",strlen("Chongqing,China!"));//对pszAddr2赋值tPeopleInfo.pszAddr2="Chengdu,China!";//对pszAddr3赋值tPeopleInfo.pszAddr3="Wuhan,China!";//打印变量的值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,ZhouZhaoxiong。**文件名称:PointerTest.c*文件标识:无*内容摘要:演示指针的用法*其它说明:无*当前版本:V1.0*作者:ZhouZhaoxiong*完成日期:20160712***********************************************************************/#include<stdio.h>//重定义数据类型typedefsignedintINT32;typedefunsignedintUINT32;typedefsignedcharINT8;//结构体定义typedefstruct{UINT32iAge;//年龄INT8szAddr1[100];//地址1INT8*pszAddr2;//地址2INT8**pszAddr3;//地址3}T_PeopleInfo;/*****************************************************************功能描述:主函数*输入参数:无*输出参数:无*返回值:0-执行完成*其他说明:无*修改日期版本号修改人修改内容*-------------------------------------------------------------*20160712V1.0ZhouZhaoxiong创建****************************************************************/INT32main(void){T_PeopleInfotPeopleInfo={0};//结构体变量赋值//对iAge赋值tPeopleInfo.iAge=10;//对szAddr1赋值strncpy(tPeopleInfo.szAddr1,"Chongqing,China!",strlen("Chongqing,China!"));//对pszAddr2赋值tPeopleInfo.pszAddr2="Chengdu,China!";//对pszAddr3赋值tPeopleInfo.pszAddr3=(INT8*)malloc(100);if(tPeopleInfo.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语言项目中,很多程序出现问题,就是对指针的处理不当造成的。因此,熟练掌握各种指针的使用方法,是对一个合格的软件开发人员的基本要求。

【本文是51CTO专栏作者周兆熊的原创文章,作者微信公众号:周氏逻辑(logiczhou)】

第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台