[英]Dynamic memory allocation for an array and an array of structures within a struct
我是C的新手。我试图弄清楚在结构和数组的情况下动态内存分配是如何工作的。所以我喜欢像我这样的代码...
struct Person
{
int id;
char *name;
char *place;
};
struct Database
{
struct Person *data_rows;
};
我想动态地为字符数组名称和place ...以及struct data_rows ...的数组分配内存作为输入。那么理想情况下,分配顺序和正确的语法应该是什么? 谢谢。
好吧,“很明显”你需要首先填写“struct Database”:
struct Database MyDatabase;
MyDatabase.data_rows=malloc(sizeof(MyDatabase.data_rows[0])*NumberOfPeople);
忽略我没有检查malloc()失败的事实,这将给你一个“struct Person”数组,全部未初始化。 所以,很可能,你会想要初始化它们:
int i;
for (i=0; i<NumberOfPeople; i++)
{
struct Person* MyPerson;
MyPerson=&MyDatabase.data_rows[i];
MyPerson->id=i;
MyPerson->name=malloc(...);
/* Do something to store the name in MyPerson->name */
MyPerson->place=malloc(...);
/* Do something to store the place in MyPerson->name */
}
现在,这里的问题是我放在malloc上的“......”。 如果你使用固定大小很容易,但是你可能刚刚宣布你的结构是这样的
struct Person
{
int id;
char name[100];
char place[200];
};
基本上,我只是不知道名字的长度应该是多少,因此我只是将其键入为“......”。
而且,我只是猜到了“id”可能是什么。 使用数组索引实际上有点无意义:-)
当然,您现在不必全部完成。 您可以设置名称并将指针置于NULL并稍后填充它们,例如当您从文件中读取数据时,或者您计划执行的任何操作时。 或者你可以根本不在这里初始化它,如果你确信你的代码总是“知道”哪些字段被初始化而哪些不是。
我强烈建议编写一个函数person_new
和person_free
来处理结构内存管理:
struct Person* person_new(char *name, char* place) {
struct Person* person = malloc(sizeof(struct Person));
person->name = strdup(name);
person->place = strdup(place);
return person;
}
void person_free(struct Person* person) {
free(person->name);
free(person->place);
free(person);
}
最好的方法是将结构转换为类,以下也适用于结构...
您可以在Database和in Person中定义构造函数和析构函数,如下所示:
struct Person
{
Person(){
name = new char[256];
place = new char[256];
};
~Person(){
delete name;
delete place;
}
int id;
char *name;
char *place;
};
struct Database
{
Database(int nPersons){
data_rows = new Person[nPersons];
};
~Database(){
delete data_rows;
};
struct Person *data_rows;
};
或者你可以在没有构造函数和析构函数的情况下执行此操作,并在代码中按顺序分配所有内容,这是一种非常难看的方法!
如:
Database myData;
myData.data_rows = new Persons[40];
for(int i=0; i < 40; i++){
myData.data_rows[i].name = new char[256];
myData.data_rows[i].place = new char[256];
}
请注意, data_rows[i]
只不过是 - > *(data_rows + i)
,它将指针的地址移动i次,然后取消引用它!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.