繁体   English   中英

数组的动态内存分配和结构中的结构数组

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

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