歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C語言中結構體參數變量的傳遞

【文章摘要】

      在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個章節中:

  1. Linux-C成長之路(一):Linux下C編程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
  2. Linux-C成長之路(二):基本數據類型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
  3. Linux-C成長之路(三):基本IO函數操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
  4. Linux-C成長之路(四):運算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
  5. Linux-C成長之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
  6. Linux-C成長之路(六):函數要義 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
  7. Linux-C成長之路(七):數組與指針 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
  8. Linux-C成長之路(八):存儲類,動態內存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
  9. Linux-C成長之路(九):復合數據類型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
  10. Linux-C成長之路(十):其他高級議題 

二、采用指針傳遞時的程序代碼

      采用指針傳遞時的程序代碼如下:

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

* 版權所有 (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

Copyright © Linux教程網 All Rights Reserved