[英]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.