Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 结构的嵌套数组有问题_C_Arrays_Struct - Fatal编程技术网

C 结构的嵌套数组有问题

C 结构的嵌套数组有问题,c,arrays,struct,C,Arrays,Struct,从函数调用返回后,我很难让嵌套的结构数组保留其成员 以下是我在头文件中定义的内容(为了可读性,压缩结构成员): 我使用这些函数向shop.items[]结构数组添加成员。初学者武器[]是类型武器,在另一个文件中声明了元素0和1: void PopulateShop(location loc) { printf("DEBUG: character location pointer: %s\n\n\n", loc.name); loc.shop.items[0] = beginne

从函数调用返回后,我很难让嵌套的结构数组保留其成员

以下是我在头文件中定义的内容(为了可读性,压缩结构成员):

我使用这些函数向shop.items[]结构数组添加成员。初学者武器[]是类型武器,在另一个文件中声明了元素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[]分配内存,或者将其外部化,或者传递指针(我不完全确定如何进行订阅),或者可能我对shop的定义不正确。感谢您的帮助

使用Kaylum建议的指针进行修复--

我花了一分钟才意识到需要将局部变量保存回指针。谢谢你的帮助

编辑:

小心--这只适用于结构,因为结构的复制构造函数会复制成员。。。大卫·C·兰金

很高兴知道

locIn->shop.items[0] = beginnerWeapons[0];
locIn->shop.items[1] = beginnerWeapons[1];
我也学到了相当于

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

正如我在顶部提到的,我不确定如何使用带有结构订阅的指针。现在我的学习帽上又插了一根羽毛,谢谢大家

常见问题。C中的函数参数是按值传递的。函数内部对函数参数的更改对调用方的值没有影响。如果要更改原始结构,请传入指针。问题的可能重复之处还可能在于如何分配和复制
name
。请小心--这仅适用于结构,因为结构的复制构造函数会复制成员。如果
loc
是任何其他本地声明的复合类型,例如数组,您可以将本地值的地址分配给
PopulateShop
*locIn
,当函数堆栈内存释放以供重用时,该地址将在函数返回时被销毁。或者只需删除
loc
并使用
locIn->
,而不是
loc.
locIn->shop.items[0] = beginnerWeapons[0];
locIn->shop.items[1] = beginnerWeapons[1];
(*locIn).shop.items[0] = myArr[i];