如何将数组赋给结构中的指针?

时间:2014-10-27 18:59:14

标签: c pointers

我有以下结构作为示例:

#define MAX_PEOPLE 16
typedef struct {
  int age;
}Person;

typedef struct {
  Person *people;
  int numPeople;
}Team;

我试图在函数中分配一组人,通过参数传递。我的Team应该存储一个由16个Person指针组成的数组。我无法弄清楚我做错了什么。

void initiateTeam(Team * team){
  team->numPeople = MAX_PEOPLE;
  Person *p[MAX_PEOPLE];
  for(int i=0; i<MAX_PEOPLE;i++){
    p[i] = malloc(sizeof(Person);
  }
  team->people = &p[0];
}

我打印出了team->people[i]的地址,我收到了随机垃圾。为什么分配team->people = &p[0]错了?难道它不能获得我的数组的第一个地址然后执行指针运算吗?

5 个答案:

答案 0 :(得分:2)

您将team->people指向静态定义的人物指针数组。一旦函数结束,堆栈指针就会移回到main left off的位置,删除addPeople函数中所有先前的本地内存。你需要malloc p,并从函数

返回它

答案 1 :(得分:1)

由于您在评论中表示您尝试分配Person个对象和非指针的数组,因此您应该这样做:

void addPeople(Team * team){
    team->numPeople = MAX_PEOPLE;
    team->people = malloc(sizeof(Person) * MAX_PEOPLE);
}

请注意*中没有sizeof,因为您不需要指针数组而是需要对象数组。稍后您将能够使用

访问单个元素(即每个Person对象)
team->people[2].age = 25; // The third person in the array

最后,记得释放你的记忆。

答案 2 :(得分:1)

您的变量p分配在addPeople()函数的堆栈中。赋值team->people = &p[0](相当于team->people = p)有效但危险,因为该函数完成后该地址将无效。

使用p更好地创建malloc(sizeof (Person *) * MAX_PEOPLE),而不是使用堆栈。

答案 3 :(得分:1)

问题在于:

Person *p[MAX_PEOPLE];

这会在函数中分配一个局部变量来保存人员指针数组。

您获取此局部变量的地址并将其发回。只要您不在函数中,就会释放本地数据。它刚刚在本地分配。它不再有效。我可能会工作一段时间,或者可能不会取决于该计划下一步。

你想要这个:

Person **p = (Person **)malloc(sizeof (Person *) * MAX_PEOPLE);

答案 4 :(得分:1)

我认为你在C中使用指针和内存管理的东西有点不对劲。在继续编写应用程序代码之前,请考虑阅读更多内容。

此外,我认为你不需要一系列指向人的指针,而是一群人。 你的结构是正确的,但我会像你那样实现你的功能:

void addPeople(Team * team){
    team->numPeople = MAX_PEOPLE;
    team->people = malloc(sizeof(Person) * MAX_PEOPLE);
}

不要忘记free() team->people

但是如果MAX_PEOPLE是预处理器定义,那么完全没必要使用堆中的内存。如果您没有在结构中存储太多人,则堆栈可以轻松满足您的要求。