C语言中结构体參数变量的传递
【文章摘要】
在C语言中,结构体參数变量常常作为函数的參数来进行传递。但假设參数设置不当。会出现内存问题。
本文以实际的程序代码为例。具体地介绍怎样正确地使用结构体參数变量。为相关的开发工作提供了參考。
【关键词】
C语言 结构体 函数 參数 传递
一、前言
本文中的程序实现对员工信息结构体字段赋值并打印出来的功能。该结构体的定义例如以下:
// 员工信息结构体
typedef struct
{
INT8 szEmployeeName[100]; // 员工姓名
UINT16 iEmployeeAge; // 员工年龄
UINT32 iEmployeeNo; // 员工工号
} TEmployeeInfo;
函数GetEmployeeInfo用来对员工信息字段进行赋值。其声明例如以下:
INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo);
在主函数main中,採用两种參数传递的方法,一种是
*
*
*
* 版本号: 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 tEmployeeInfo = {0}; // 该变量用于存放员工信息
// 调用函数对员工信息字段赋值, 并打印出来
iRetValue = GetEmployeeInfo(&tEmployeeInfo);
if (iRetValue != 0)
{
printf("exec GetEmployeeInfo failed.\n");
return -1;
}
printf("员工信息为: \n姓名: %s\n年龄: %d\n工号: %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所看到的:
图3第二次改进后的程序代码运行结果
从图3能够看出。程序运行结果正确,得到了我们想要的结果。
五、总结
在编写代码的过程中,我们须要注意下面方面:
(1) 程序头部、函数头部及重要的程序语句处一定要有凝视,这体现了软件开发者的专业素质。
(2) 函数中出现的变量在定义的同一时候要进行初始化,函数在调用之前一定要先进行声明。
(3) 对于函数中的指针变量參数,在使用之前一定要先进行异常推断(即推断其是否为NULL)。
(4) 对于有返回值的函数。要用不同的返回值来差别不同的运行结果。并在重要的地方打印出提示信息。方便对代码的调试。
指针是C语言的精华所在,同一时候也是难点所在。对于一个合格的软件开发project师来说。一定要熟练掌握指针的使用方法。
(本人微博:http://weibo.com/zhouzxi?topnav=1&wvr=5,微信号:245924426。欢迎关注!
)
C语言中结构体參数变量的传递的更多相关文章
- C语言中结构体赋值问题的讨论
今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...
- C语言中结构体对齐问题
C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...
- C语言中结构体赋值问题的讨论(转载)
今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...
- Go语言中结构体的使用-第2部分OOP
1 概述 结构体的基本语法请参见:Go语言中结构体的使用-第1部分结构体.结构体除了是一个复合数据之外,还用来做面向对象编程.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. ...
- 6. Go 语言中结构体的使用
1. 结构体的定义格式 在go语言中结果的定义格式如下: 123 type structName struct { filedList} 列子如下: 1234 type Person struct { ...
- Go语言中结构体的使用-第1部分结构体
1 概述 结构体是由成员构成的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性.结构体成员,也可称之为成员变量,字段,属性.属性要满足唯一性.结构体的概念在软件工程上 ...
- c语言中结构体指针
1.指向结构体的指针变量: C 语言中->是一个总体,它是用于指向结构体,如果我们在程序中定义了一个结构体,然后声明一个指针变量指向这个结构体.那么我们要用指针取出结构体中的数据.就要用到指向运 ...
- 关于C语言中结构体中的结构体成员导致的字节对齐问题
关于结构体的字节对齐是什么,就不赘述,再此附上一篇文章,介绍字节对齐:http://www.linuxsong.org/2010/09/c-byte-alignment/ 这里的结构体字节对齐的数据类 ...
- C语言中结构体的访问方法解读
在C语言中,对结构体的访问一般有两种常规方式:"."访问和"->"访问.那么两者有什么区别呢?对C语言有一定了解的同学应该知道,我们新建一个结构体的时候, ...
随机推荐
- EF具体用在什么类型的项目上
一般来说,使用EF框架,肯定会比直接使用ADO.NET,消耗的时间多一些. 因为使用ADO.NET直接把SQL语句传回数据库执行. 而使用EF框架的话,会把所用到的尸体,转换成相对应得SQL,然后再传 ...
- Servlet的学习之web路径问题
在这个篇章中,我们来学习下在web开发过程中会碰到的路径写法问题. 在之前的web应用开发,尤其是Servlet的学习过程中,我们碰到多次要写路径的问题,这些路径并不统一,因此这里将大致说明下各个方法 ...
- HTTP实现长连接(TTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持Connection: keep-alive)
HTTP实现长连接 HTTP是无状态的 也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接.如果客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web ...
- 14.1.2 Checking InnoDB Availability 检查InnoDB 可用性:
14.1.2 Checking InnoDB Availability 检查InnoDB 可用性: 确认你的server 是否支持InnoDB,使用 SHOW ENGINES 语句.(默认MySQL的 ...
- ThinkPHP运算符 与 SQL运算符 对比表
ThinkPHP运算符 与 SQL运算符 对比表 TP运算符 SQL运算符 样例 实际查询条件 eq = $map['id'] = array('eq',100); 等效于:$map['id'] = ...
- jquery中怎么删除<ul>中的整个<li>包括节点
.$('ul li').remove(); .$('ul li').each(function(){ $(this).remove(); }); .$("ul").find(&qu ...
- 程序缩小到托盘后系统就无法关机(解决方案)——处理WM_QUERYENDSESSION消息,并把它标识为处理过了
程序缩小到托盘后系统就无法关机(解决方案) 老帅 程序最小化到托盘后,会出现系统无法关闭的问题,常见于WinXP系统中,这里提供一个解决方案!一.解决 ...
- VC生成的DLL给QT的EXE调用时lib路径问题小结
VC生成的DLL给QT调用,有两种方式,一种是隐式调用调用(使用.lib文件方式): ① 在*.pro工程文件中添加VC生成的lib文件路径时,或者使用一个绝对路径,如: LIBS += " ...
- 区间Dp 暴力枚举+动态规划 Hdu1081
F - 最大子矩形 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Status Des ...
- [Cocos2d-x]节点的尺寸大小
作为一个CCNode,本身没有大小而言,但是AddChild之后,便有了尺寸的概念. Cocos2d-x中对于一个节点的尺寸可以通过以下三个方法获取: CCSprite: getContentSize ...