设为首页 加入收藏

TOP

C语言中结构体参数变量的传递(一)
2015-01-22 21:25:25 来源: 作者: 【 】 浏览:102
Tags:言中 结构 参数 变量 传递

【文章摘要

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

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

【关键词

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

一、前言

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

// 员工信息结构体

typedef struct

{

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

UINT16 iEmployeeAge; // 员工年龄

UINT32 iEmployeeNo; // 员工工号

} TEmployeeInfo;

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

INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo);

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

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

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

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

* 版权所有 (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; // 该变量用于存放员工信息

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

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所示:

\

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

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

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

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

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

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

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

*

* 文件名称: TestStruct.c

* 文件标识:无

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

* 其它说明:无

* 当前版本: V1.0

* 作 者:周兆熊

* 完成日期: 20140617

*

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

* 修改日期: 20140617

* 版本号

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言--结构体 下一篇C语言--指针(一)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: