我想返回声明的结构体,以及在initializePlayer()
函数中设置的值,这样我就可以在main函数中调用它。
这是一个任务,我们不允许声明全局变量(仅在函数内部),所以我认为我需要在函数内部声明struct
-除非它不是一个变量(?)我真的不知道:(
这是我的代码,我无法让它工作
struct Player initializePlayer(int playerNumber)
{
struct Player
{
int position[1][2];
double money;
int propertiesOwned[10];
} player[4];
// Set player's position to starting tile
player[playerNumber].position[0][0] = 5;
player[playerNumber].position[0][1] = 0;
// Set player's default money
player[playerNumber].money = 300000;
// Set player's properties to none
for (int i; i <= 10; i++)
{
player[playerNumber].propertiesOwned[i] = 0;
}
// Player initialized
return player[playerNumber];
}
int main()
{
// Initializes player 1 and 2
struct Player p1 = initializePlayer(1);
struct Player p2 = initializePlayer(2);
return 0;
}
但是,如果我将struct
声明为global,它就可以正常工作。
我希望函数返回一个结构体,该结构体在函数内部声明
3条答案
按热度按时间trnvg8h31#
这是一个任务,不允许我们声明全局变量(仅在函数内部)
型别规范不是变数。
您需要在使用结构之前宣告它。
同样在函数定义中,返回类型应该是一个完整的对象类型。来自C标准(6.9.1函数定义)
3函数的返回类型应为void或除数组类型以外的完整对象类型。
所以这个函数定义
是错误的。函式的传回型别不是完整的对象型别。
您需要在函数定义之前定义结构,如
同样,最好通过指向结构类型的对象的指针,通过引用将该对象传递给函数。
在这种情况下,函数声明如下所示
函数返回类型为
void
。并且结构类型的对象数组将在
main
中声明0aydgbwb2#
是的,你可以返回一个结构体。你不能做的是返回一个指针,指向一个已经不存在的东西。但这不是你在这里要做的。结构体数据在这里被复制到调用者。
另一方面,你对那个结构体的定义很奇怪。它应该在任何使用之前完成。我不明白你为什么要把那个定义放在函数里面。
为了证明我的观点,举一个例子(使用不同的更简单的
Player
定义)在我的电脑上,它打印
这里的要点是,你可以看到,在
main
中,p.name
和p.pos
实际上是在f
中设置的。由于g
已经在其间被调用,g
在它的局部变量player
中放入了其他内容,由于你可以看到(这不是一个确定的事情,但它是可以预测的,当我想证明我的观点时,它发生了)f
和g
的局部变量player
具有完全相同的地址,你知道,在我们得到f
结果和我们打印它的时间之间,曾经在f
的本地player
中的内容已经被破坏。尽管如此,我们还是把内容做对了。
因为
f
返回了其本地player
的副本。所以,是的,你可以返回struct。
这仍然是一个棘手的问题,因为如果该结构本身包含指向某些局部变量的指针,那么这些指针就不再有效。但是在您的用法中(一旦您更正了定义
struct Player
的位置,以及奇怪的[1]
数组),就不会出现这样的问题。返回的是一个副本。dwthyt8l3#
您尝试在
struct player
尚未定义之前使用它。您无法这样做,您需要在struct
之前定义它。你想这样,这是通常的,标准的和完全正确的方式:
还有另外一个问题:
这是错误的,您忘记初始化
i
。其他地方可能有其他错误,我没有检查所有的东西。