c语言中打印结构体采用%s,C语言中结构体参数变量的传递

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

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

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

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

* 版权所有 (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所示:

0c702d72ead03e992ade54947735099e.png

图2 改进后的采用指针传递时的程序代码运行结果

可见,程序出现了内存问题。原因是在传递之前,ptEmployeeInfo指针已经指向了确定的地址,不能让同一个指针同时指向不同的地址。0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值