繁体   English   中英

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

[英]How to assign a array to a pointer in a struct?

我有以下结构作为示例:

#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]错误? 它不应该获取我数组的第一个地址然后执行指针算术吗?

您正在将team->people指向静态定义的人员指针数组。 函数结束后,堆栈指针将移回main断开的位置,从而擦除addPeople函数中所有以前的本地内存。 您需要malloc p ,并从函数返回它

由于您在注释中表示要尝试分配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

最后,请记住释放您的内存。

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

最好使用malloc(sizeof (Person *) * MAX_PEOPLE)创建p ,而不要使用堆栈。

问题在这里:

Person *p[MAX_PEOPLE];

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

您获得此局部变量的地址,然后将其发送回去。 一旦您不使用该功能,便会释放本地数据。 它只是在本地分配的。 它不再有效。 我可能会工作一段时间,或者可能不取决于下一步执行的程序。

你要这个:

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

我认为您在C语言中使用指针和内存管理时遇到了一些错误。 在继续编写应用程序之前,请考虑阅读更多有关它的内容。

另外,我认为您不需要指向人的指针数组,而是需要一个人数组。 您的结构是正确的,但我会像这样实现您的功能:

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

并且不要忘记free()您的team->people

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM