2017-07-02 164 views
0

從函數調用返回後,我無法獲取結構的嵌套數組來保留其成員。嵌套數組結構的問題

以下是我在頭文件(可讀性冷凝結構成員)定義:

typedef struct { 
    char *name; 
} weapon; 

#define MAX_SHOP_ITEMS 10 
struct shop { 
    weapon items[MAX_SHOP_ITEMS]; 
}; 

typedef struct { 
    char *name; 
    struct shop shop; 
} location; 

我使用這些函數將成員添加到結構的shop.items []數組。所述beginnerWeapon []是類型的武器,並具有元件0和1在另一文件中聲明:

void PopulateShop(location loc) 
{ 
    printf("DEBUG: character location pointer: %s\n\n\n", loc.name); 

    loc.shop.items[0] = beginnerWeapons[0]; 
    loc.shop.items[1] = beginnerWeapons[1]; 

    printf("DEBUG: loc.shop.items[0].name: %s\n\n\n", loc.shop.items[0].name); 
} 

void ShowItems(location loc) 
{ 
    printf("DEBUG: location pointer in ShowItems(): %s\n\n\n", loc.name); 
    printf("DEBUG: loc.shop.items[0].name: %s\n\n\n", loc.shop.items[0].name); 
} 

現在,當我的位置傳遞給從通過此功能的另一文件中的每個函數:......

void ShopMenu(location loc) 
{ 
    PopulateShop(loc); 
    ShowItems(loc); 
} 

...調試顯示兩個函數中的位置名稱正確,正確的武器名稱出現在PopulateShop()中,但shop.items []數組更改在我調用ShowItems()時不會粘住。我不確定是否需要爲.items []分配內存,或將其外部化,或者傳遞指針(我不完全確定如何處理下標),或者我可能會錯誤地定義商店。任何幫助表示讚賞!

+6

常見問題。 C中的函數參數是按值傳遞的。函數內部對函數參數的更改對調用者的值沒有影響。如果要更改原始結構,請傳入指針。 – kaylum

+0

[將結構體傳遞給函數](https://stackoverflow.com/questions/10370047/passing-struct-to-function) – kaylum

+0

可能的重複問題可能還在於如何分配和複製'name'。 – chux

回答

0

通過使用指針修正了Kaylum的建議 -

void PopulateShop(location *locIn) 
{ 
    location loc = *locIn; 

    loc.shop.items[0] = beginnerWeapons[0]; 
    loc.shop.items[1] = beginnerWeapons[1]; 

    *locIn = loc; 
} 

花了一分鐘,以實現我需要保存在本地變量回指針。謝謝您的幫助!

編輯:

要小心 - 這隻能用於結構由於複製構造結構做會員的副本......戴維·蘭

好知道。正如我在上面提到的

locIn->shop.items[0] = beginnerWeapons[0]; 
locIn->shop.items[1] = beginnerWeapons[1]; 

,我也學會了相當於

(*locIn).shop.items[0] = myArr[i]; 

,我不知道如何使用指針與結構的下標。現在我的學習帽上還有一根羽毛,謝謝大家!

+0

BE CAREFUL - 這僅適用於由*拷貝構造函數*構造成員拷貝的結構。如果'loc'是任何其他本地聲明的複合類型,例如一個數組,你可以將'PopulateShop'本地值的地址賦值給'* locIn',當函數堆棧內存被釋放以供重用時,在函數返回時它將被銷燬。 –

+3

或者直接刪除'loc'並使用'locIn->'而不是'loc.'。 – alk