【发布时间】:2016-03-26 22:08:23
【问题描述】:
我需要在一个函数中初始化一个struct players 的可变长度缓冲区。到目前为止,这是我想出的:
#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 终止时应该不再存在。
我错过了什么?
【问题讨论】:
-
让
players_init一次初始化一个玩家,并传递一个char名称以供使用。然后将其命名为:players_init(&players, 'X'); players_init(&players, 'Y');这可能会如您所愿地破坏您的代码,因为您将覆盖未初始化的内存,让您现有的代码看起来正常工作。