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

【文章摘要】

      在C语言中,结构体参数变量经常作为函数的参数来进行传递。但如果参数设置不当,会出现内存问题。

      本文以实际的程序代码为例,详细地介绍如何正确地使用结构体参数变量,为相关的开发工作提供了参考。

【关键词】

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

一、前言

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

// 员工信息结构体

typedef struct

{

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

      UINT16  iEmployeeAge;                    // 员工年龄

      UINT32  iEmployeeNo;                      // 员工工号

} TEmployeeInfo;

 

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

INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo);

 

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

将C语言梳理一下,分布在以下10个章节中:

  1. Linux-C成长之路(一):Linux下C编程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
  2. Linux-C成长之路(二):基本数据类型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
  3. Linux-C成长之路(三):基本IO函数操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
  4. Linux-C成长之路(四):运算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
  5. Linux-C成长之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
  6. Linux-C成长之路(六):函数要义 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
  7. Linux-C成长之路(七):数组与指针 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
  8. Linux-C成长之路(八):存储类,动态内存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
  9. Linux-C成长之路(九):复合数据类型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
  10. Linux-C成长之路(十):其他高级议题 

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

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

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

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

*

* 文件名称: TestStruct.c

* 文件标识:无

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

* 其它说明:无

* 当前版本: V1.0

* 作    者:周兆熊

* 完成日期: 20140617

*

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

* 修改日期: 20140617

* 版本号: V1.0

* 修改人: Zhou Zhaoxiong

* 修改内容:创建

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

#include <stdio.h>

#include <string.h>

 

 

// 数据类型

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("员工信息为: \n姓名: %s\n年龄: %d\n工号: %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的入参为空,不能实现赋值的功能。

相关推荐