我需要从函数内初始化struct player
的可变长度缓冲区。到目前为止,这是我想出的:
#include<stdio.h>
#include<stdlib.h>
struct player{
char name;
};
void players_init(struct player **players){
*players = malloc(2 * sizeof(struct player));
struct player p1, p2;
p1.name = 'X';
p2.name = 'Y';
(*players)[0] = p1;
(*players)[1] = p2;
}
int main(int argc, char *argv[])
{
struct player *players = NULL;
players_init(&players);
printf("%c\n", players[0].name); // prints X
printf("%c\n", players[1].name); // prints Y
return 0;
}
我的问题是:由于我是在函数内创建 p1
和 p2
,因此这两个变量应该分配在专用于同一函数的堆栈帧上,所以当该函数终止时,这些变量应该消失。
正如您从我的示例中看到的,我将这些变量分配给缓冲区 players
的位置,该缓冲区是在另一个函数中创建的。
我想知道为什么我的代码有效(如果它真的有效),因为我基本上引用了根据我的理解,当 players_init
终止时不应该再存在的变量。
我错过了什么?
最佳答案
因为您要将整个结构复制到数组中,所以它可以工作。如果您只是使用 p1
和 p2
的地址,那么您将出现未定义的行为,因为正如您所说的 p1
和 p2` 会超出范围。
您的情况很简单,但在现实世界中,请注意您正在执行结构复制,因此您需要知道哪些位被复制,哪些没有被复制
关于在函数内的堆栈上创建一个结构体,并将其分配给在另一个函数中创建的数组的数组位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36241469/