【文章摘要】
在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個章節中:
二、采用指針傳遞時的程序代碼
采用指針傳遞時的程序代碼如下:
/**********************************************************************
* 版權所有 (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.\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
}
程序的運行結果如圖1所示:
圖1 采用指針傳遞時的程序代碼運行結果
從圖1可以看出,函數GetEmployeeInfo的入參為空,不能實現賦值的功能。
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-07/104647p2.htm