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语言有一定了解的同学应该知道,我们新建一个结构体的时候, ...
随机推荐
- Android 环境变量配置(Mac)
Mac 系统10.10,自带的就是jdk1.6,因为工作需要就升级到了1.7,要从新配置环境变量了 mac 默认是自带的有jdk1.6 安装路径为: /System/Library/Framework ...
- HDU 4293 Groups
模型挺好的dp题,其实这道题就是建一个模型然后就很容易想到递推过程了,我们可以把每个人的描述,存到数组a中,a[l][r]表示左边有l个,到第r个这个人所在一层停止...然后就可以写出转移状态方程了. ...
- 与众不同 windows phone (13) - Background Task(后台任务)之后台文件传输(上传和下载)
原文:与众不同 windows phone (13) - Background Task(后台任务)之后台文件传输(上传和下载) [索引页][源码下载] 与众不同 windows phone (13) ...
- hdu1427之速算24点
速算24点 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- script:查看历史sql执行信息
script:查看历史sql执行信息 SELECT * FROM (SELECT '1.v$sql'||'实例号:'||GV$SQL.inst_id source, ...
- (原创)(C#随笔)IEnumerable< ICollection < IList区别
public interface IEnumerable { IEnumerator GetEnumerator(); } 再看ICollection<T> public interfac ...
- WinDBG调试技巧
参考链接:http://wenku.baidu.com/view/4e58744dcf84b9d528ea7a42.html
- Java NIO实战之聊天室
在工作之余花了两个星期看完了<Java NIO>.整体来说这本书把NIO写的非常具体,没有过多的废话,讲的都是重点,仅仅是翻译的中文版看的确实吃力.英文水平太低也没办法,总算也坚持看完了. ...
- iOS:点击button卡死
场景: 在tableView的Cell中有一个button,我须要点击这个button然后使得其视图控制器上的一个视图改变frame,可是我点击这个button后,导致卡死,也不崩溃.所有事 ...
- JAVA必备——13个核心规范
标准的价值: 你听过这句话吗?"一流企业做标准.二流企业做品牌.三流企业做产品!"我时我就在想,做标准的企业就是一流的?卖产品就是三流公司?而坐产品或者加工的公司,即使说销售量非常 ...