三、改进后的采用指针传递时的程序代码
既然程序打印出指针为空的信息,那么我们先对传入的指针进行赋值操作是不是就可以了呢?
改进后的采用指针传递时的程序代码如下:
/**********************************************************************
* 版权所有 (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; // 该变量用于存放员工信息
// 先对员工信息字段赋值, 防止空指针的存在
strncpy((char *)ptEmployeeInfo->szEmployeeName, "Di Renjie", strlen("Di Renjie")); // 对姓名字段赋值
ptEmployeeInfo->iEmployeeAge = 150; // 对年龄字段赋值
ptEmployeeInfo->iEmployeeNo = 654321; // 对工号字段赋值
// 调用函数对员工信息字段赋值, 并打印出来
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
}
程序的运行结果如图2所示:
图2 改进后的采用指针传递时的程序代码运行结果
可见,程序出现了内存问题。原因是在传递之前,ptEmployeeInfo指针已经指向了确定的地址,不能让同一个指针同时指向不同的地址。