C语言中结构体参数变量的传递

 c语言  结构体  函数  参数  传递

成都创新互联主要从事网站设计、成都网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务永和,十余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792

 

一、前言

       本文中的程序实现对员工信息结构体字段赋值并打印出来的功能。该结构体的定义如下:

// 员工信息结构体
typedef struct
{
       INT8       szEmployeeName[100];     // 员工姓名
       UINT16  iEmployeeAge;                    // 员工年龄
       UINT32  iEmployeeNo;                      // 员工工号
} TEmployeeInfo;

 

        函数GetEmployeeInfo用来对员工信息字段进行赋值,其声明如下:

INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo);

 

       在主函数main中,采用两种参数传递的方法,一种是指针传递,另一种是非指针传递。

 

二、采用指针传递时的程序代码

       采用指针传递时的程序代码如下:

/**********************************************************************

*版权所有 (C)2014, Zhou Zhaoxiong。

*

*文件名称: TestStruct.c

*文件标识:无

*内容摘要:用于演示结构体变量的用法

*其它说明:无

*当前版本: V1.0

*作   者:

*完成日期: 20170711

*

**********************************************************************/

#include

#include

 

 

// 数据类型

typedef signed   char INT8;

typedef unsigned char UINT16;

typedef unsigned int  UINT32;

typedef signed   int  INT32;

 

 

// 员工信息结构体

typedef struct

{

       INT8    szEmployeeName[100];  // 员工姓名

       UINT16  iEmployeeAge;         // 员工年龄

       UINT32  iEmployeeNo;          // 员工工号

} TEmployeeInfo;

 

 

//函数声明

INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo); //获取员工信息函数

INT32 main(void);

 

 

/****************************************************************

*功能描述: 主函数                                            

*输入参数: 无                                                 

*输出参数: 无                                                

* 返回值: 0-执行成功  -1-执行失败                           

* 其他说明:  无                                                

* 修改日期        版本号        修改人        修改内容

* ----------------------------------------------------------------------------------------

* 20140617        V1.0      Zhou Zhaoxiong     创建

****************************************************************/

INT32 main(void)

{

   INT32          iRetValue      = 0;       // 该变量用于表示调用GetEmployeeInfo函数返回的值

   TEmployeeInfo *ptEmployeeInfo = NULL;   // 该变量用于存放员工信息

   

    // 调用函数对员工信息字段赋值, 并打印出来

    iRetValue = GetEmployeeInfo(ptEmployeeInfo);

    if (iRetValue != 0)

    {

        printf("exec GetEmployeeInfo failed.\n");

        return -1;

    }

       

   printf("员工信息为: 姓名: %s年龄: %d工号: %d\n",ptEmployeeInfo->szEmployeeName,ptEmployeeInfo->iEmployeeAge,ptEmployeeInfo->iEmployeeNo);

 

   return 0;

}

 

 

/**********************************************************************

* 功能描述:对员工信息字段赋值

* 输入参数: ptEmployeeInfo: 员工信息结构体

* 输出参数: ptEmployeeInfo: 员工信息结构体

* 返回值: 0-成功  -1-失败

* 其它说明:无

* 修改日期          版本号           修改人         修改内容

* --------------------------------------------------------------------------------------

* 20140617           V1.0         Zhou Zhaoxiong      创建

***********************************************************************/

INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo)

{

    // 先对输入的指针参数进行异常判断

    if (ptEmployeeInfo == NULL)

    {

        printf("Input parameter is NULL.\n");

        return -1;

    }

 

    strncpy((char *)ptEmployeeInfo->szEmployeeName, "Li Yuanfang", strlen("Li Yuanfang"));   // 对姓名字段赋值

    ptEmployeeInfo->iEmployeeAge = 100;       // 对年龄字段赋值

    ptEmployeeInfo->iEmployeeNo  = 123456;    // 对工号字段赋值

 

    return 0;     // 赋值成功, 返回0

}

 

         程序的运行结果如图1所示:

C语言中结构体参数变量的传递

图1 采用指针传递时的程序代码运行结果

 

        从图1可以看出,函数GetEmployeeInfo的入参为空,不能实现赋值的功能。

 

三、改进后的采用指针传递时的程序代码

        既然程序打印出指针为空的信息,那么我们先对传入的指针进行赋值操作是不是就可以了呢?

        改进后的采用指针传递时的程序代码如下:

/**********************************************************************

*版权所有 (C)2014, Zhou Zhaoxiong。

*

*文件名称: TestStruct.c

*文件标识:无

*内容摘要:用于演示结构体变量的用法

*其它说明:无

*当前版本: V1.0

*作   者:周兆熊

*完成日期: 20140617

*

*修改记录1://修改历史记录,包括修改日期、版本号、修改人及修改内容

*修改日期: 20140617

*版本号: V1.0

*修改人: Zhou Zhaoxiong

*修改内容:创建

**********************************************************************/

#include

#include

 

 

// 数据类型

typedef signed   char INT8;

typedef unsigned char UINT16;

typedef unsigned int  UINT32;

typedef signed   int  INT32;

 

 

//员工信息结构体

typedef struct

{

       INT8    szEmployeeName[100];  // 员工姓名

       UINT16  iEmployeeAge;         // 员工年龄

       UINT32  iEmployeeNo;          // 员工工号

} TEmployeeInfo;

 

 

//函数声明

INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo); //获取员工信息函数

INT32 main(void);

 

 

/****************************************************************

*功能描述: 主函数                                            

*输入参数: 无                                                

*输出参数: 无                                                

*返回值: 0-执行成功 -1-执行失败                           

*其他说明: 无                                                 

*修改日期        版本号        修改人        修改内容

* --------------------------------------------------------------------------------------------

* 20140617        V1.0      Zhou Zhaoxiong     创建

****************************************************************/

INT32 main(void)

{

   INT32          iRetValue      = 0;       // 该变量用于表示调用GetEmployeeInfo函数返回的值

   TEmployeeInfo *ptEmployeeInfo = NULL;   // 该变量用于存放员工信息

 

   //先对员工信息字段赋值,防止空指针的存在

   strncpy((char *)ptEmployeeInfo->szEmployeeName, "Di Renjie", strlen("Di Renjie"));   //对姓名字段赋值

   ptEmployeeInfo->iEmployeeAge = 150;       // 对年龄字段赋值

   ptEmployeeInfo->iEmployeeNo  = 654321;    // 对工号字段赋值

   

   // 调用函数对员工信息字段赋值,并打印出来

   iRetValue = GetEmployeeInfo(ptEmployeeInfo);

    if (iRetValue != 0)

    {

        printf("exec GetEmployeeInfo failed.\n");

        return -1;

    }

       

    printf("员工信息为: 姓名: %s年龄: %d工号: %d\n",ptEmployeeInfo->szEmployeeName,ptEmployeeInfo->iEmployeeAge,ptEmployeeInfo->iEmployeeNo);

 

    return 0;

}

 

 

/**********************************************************************

*功能描述:对员工信息字段赋值

*输入参数: ptEmployeeInfo:员工信息结构体

*输出参数: ptEmployeeInfo:员工信息结构体

*返回值: 0-成功 -1-失败

*其它说明:无

*修改日期          版本号           修改人         修改内容

* -----------------------------------------------------------------------------------

* 20140617           V1.0         Zhou Zhaoxiong      创建

***********************************************************************/

INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo)

{

   // 先对输入的指针参数进行异常判断

    if (ptEmployeeInfo == NULL)

    {

        printf("Input parameter is NULL.\n");

        return -1;

    }

 

    strncpy((char *)ptEmployeeInfo->szEmployeeName, "Li Yuanfang", strlen("Li Yuanfang"));   // 对姓名字段赋值

    ptEmployeeInfo->iEmployeeAge = 100;       // 对年龄字段赋值

    ptEmployeeInfo->iEmployeeNo  = 123456;    // 对工号字段赋值

 

    return 0;     // 赋值成功, 返回0

}

 

          程序的运行结果如图2所示:

C语言中结构体参数变量的传递

图2 改进后的采用指针传递时的程序代码运行结果

 

       可见,程序出现了内存问题。原因是在传递之前,ptEmployeeInfo指针已经指向了确定的地址,不能让同一个指针同时指向不同的地址。

 

四、第二次改进后的程序代码

        既然不能用指针作为参数进行传递,那么我们就要考虑另外的方法。

        以下代码采用非指针的传递方式:

/**********************************************************************

*版权所有 (C)2014, Zhou Zhaoxiong。

*

*文件名称: TestStruct.c

*文件标识:无

*内容摘要:用于演示结构体变量的用法

*其它说明:无

*当前版本: V1.0

*作   者:周兆熊

*完成日期: 20140617

*

*修改记录1://修改历史记录,包括修改日期、版本号、修改人及修改内容

*修改日期: 20140617

*版本号: V1.0

*修改人: Zhou Zhaoxiong

*修改内容:创建

**********************************************************************/

#include

#include

 

 

// 数据类型

typedef signed   char INT8;

typedef unsigned char UINT16;

typedef unsigned int  UINT32;

typedef signed   int  INT32;

 

 

// 员工信息结构体

typedef struct

{

       INT8    szEmployeeName[100];  // 员工姓名

       UINT16  iEmployeeAge;         // 员工年龄

       UINT32  iEmployeeNo;          // 员工工号

} TEmployeeInfo;

 

 

//函数声明

INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo); //获取员工信息函数

INT32 main(void);

 

 

/****************************************************************

*功能描述: 主函数                                            

*输入参数: 无                                                 

*输出参数: 无                                                

*返回值: 0-执行成功 -1-执行失败                           

*其他说明: 无                                                

*修改日期       版本号       修改人       修改内容

* --------------------------------------------------------------

*20140617        V1.0      Zhou Zhaoxiong     创建

****************************************************************/

INT32 main(void)

{

    INT32         iRetValue     = 0;      // 该变量用于表示调用GetEmployeeInfo函数返回的值

   TEmployeeInfo tEmployeeInfo = {0};   // 该变量用于存放员工信息

   

   // 调用函数对员工信息字段赋值,并打印出来

   iRetValue = GetEmployeeInfo(&tEmployeeInfo);

    if (iRetValue != 0)

    {

        printf("exec GetEmployeeInfo failed.\n");

        return -1;

    }

       

    printf("员工信息为: 姓名: %s年龄: %d工号: %d\n",tEmployeeInfo.szEmployeeName,tEmployeeInfo.iEmployeeAge,tEmployeeInfo.iEmployeeNo);

 

    return 0;

}

 

 

/**********************************************************************

*功能描述:对员工信息字段赋值

*输入参数: ptEmployeeInfo:员工信息结构体

*输出参数: ptEmployeeInfo:员工信息结构体

*返回值: 0-成功 -1-失败

*其它说明:无

* 修改日期          版本号           修改人         修改内容

* --------------------------------------------------------------

* 20140617           V1.0         Zhou Zhaoxiong      创建

***********************************************************************/

INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo)

{

   // 先对输入的指针参数进行异常判断

    if (ptEmployeeInfo == NULL)

    {

        printf("Input parameter is NULL.\n");

        return -1;

    }

 

    strncpy((char *)ptEmployeeInfo->szEmployeeName, "Li Yuanfang", strlen("Li Yuanfang"));   // 对姓名字段赋值

    ptEmployeeInfo->iEmployeeAge = 100;       // 对年龄字段赋值

    ptEmployeeInfo->iEmployeeNo  = 123456;    // 对工号字段赋值

 

    return 0;     // 赋值成功, 返回0

}

 

        程序的执行结果如图3所示:

C语言中结构体参数变量的传递

图3第二次改进后的程序代码执行结果

 

        从图3可以看出,程序执行结果正确,得到了我们想要的结果。

 

五、总结

        在编写代码的过程中,我们需要注意以下方面:

       (1) 程序头部、函数头部及重要的程序语句处一定要有注释,这体现了软件开发人员的专业素养。

       (2) 函数中出现的变量在定义的同时要进行初始化,函数在调用之前一定要先进行声明。

       (3) 对于函数中的指针变量参数,在使用之前一定要先进行异常判断(即判断其是否为NULL)。

       (4) 对于有返回值的函数,要用不同的返回值来区别不同的执行结果,并在重要的地方打印出提示信息,方便对代码的调试。

 

        指针是C语言的精华所在,同时也是难点所在。对于一个合格的软件开发工程师来说,一定要熟练掌握指针的使用方法。


本文名称:C语言中结构体参数变量的传递
当前网址:http://myzitong.com/article/pigidp.html