我有以下结构作为示例:
#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]
错了?难道它不能获得我的数组的第一个地址然后执行指针运算吗?
答案 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是预处理器定义,那么完全没必要使用堆中的内存。如果您没有在结构中存储太多人,则堆栈可以轻松满足您的要求。