【文章摘要】 在C语言中,结构体参数变量经常作为函数的参数来进行传递。但如果参数设置不当,会出现内存问题。 本文以实际的程序代码为例,详细地介绍如何正确地使用结构体参数变量,为相关的开发工作提供了参考。【关键词】 C语言 结构体 函数 参数 传递 一、前言 本文中的程序实现对员工信息结构体字段赋值并打印出来的功能。该结构体的定义如下:// 员工信息结构体typedef struct{ INT8 szEmployeeName[100]; // 员工姓名 UINT16 iEmployeeAge; // 员工年龄 UINT32 iEmployeeNo; // 员工工号} TEmployeeInfo; 函数GetEmployeeInfo用来对员工信息字段进行赋值,其声明如下:INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo); 在主函数main中,采用两种参数传递的方法,一种是指针传递,另一种是非指针传递。
C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码 http://www.linuxidc.com/Linux/2014-05/101227.htm读C++ Primer 之构造函数陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm读C++ Primer 之智能指针 http://www.linuxidc.com/Linux/2011-08/40177.htm读C++ Primer 之句柄类 http://www.linuxidc.com/Linux/2011-08/40175.htm
将C语言梳理一下,分布在以下10个章节中:- Linux-C成长之路(一):Linux下C编程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
- Linux-C成长之路(二):基本数据类型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
- Linux-C成长之路(三):基本IO函数操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
- Linux-C成长之路(四):运算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
- Linux-C成长之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
- Linux-C成长之路(六):函数要义 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
- Linux-C成长之路(七):数组与指针 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
- Linux-C成长之路(八):存储类,动态内存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
- Linux-C成长之路(九):复合数据类型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
- 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.
"); return -1; } printf("员工信息为:
姓名: %s
年龄: %d
工号: %d
", 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.
"); return -1; } strncpy((char *)ptEmployeeInfo->szEmployeeName, "Li Yuanfang", strlen("Li Yuanfang")); // 对姓名字段赋值 ptEmployeeInfo->iEmployeeAge = 100; // 对年龄字段赋值 ptEmployeeInfo->iEmployeeNo = 123456; // 对工号字段赋值 return 0; // 赋值成功, 返回0} 程序的运行结果如图1所示: 图1 采用指针传递时的程序代码运行结果 从图1可以看出,函数GetEmployeeInfo的入参为空,不能实现赋值的功能。
更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2014-07/104647p2.htm