繁体   English   中英

C动态分配结构类型

[英]C dynamically allocate struct type

我有一个定义如下的结构

typedef struct{
    int year;
    char* name;
    int id;
}person;

如何动态分配人员对象并将我的数据插入其中? 我的数据如下所示

    int personYear = 20;
    int personId = 12345678;
    char* personName = "firstname lastname";

我知道对于声明我可以做

person* p = (person*) malloc(sizeof(person));
p->year = personYear;
p->id = personId;

但在那之后,我如何为char* person?做插入char* person? 我是否必须重新分配空间来保存内存空间?

 // my thought 
  p->name = (char*) malloc (sizeof(char));
  int counter = 0;
  while (*personName != '\0')
  {
      counter++;
      name = (char*) realloc (name, counter+1) // hold 1 more byte 
      *(name+counter) = '\0'; //make sure intialize the value 
      *(name+counter-1) = *personName;
      personName++;
  }
 //what's next?

真正令人困惑的是,由于 struct 在 C 中有内存对齐,并且在运行时,我们的程序不知道 person->name 将保存多少字节,我们是否需要继续为 struct 本身重新分配内存空间? 正确的做法是什么?

解决该问题的一种方法是使用灵活的结构成员。 它的工作原理是在结构体之后放置一个数组。 在这种情况下,它将是一个带有名称字符串的char数组。

typedef struct {
    int year;
    int id;
    char name[]; // flexible member
}person;

分配struct person只需添加额外的strlen(name) + 1个字节,并将name复制到那里。

person* make_person(int year, int id, char *name) {
  person *p = malloc(sizeof *p + strlen(name) + 1);
  if (!p) return NULL; // out of memory
  p->id = id;
  p->year = year;
  strcpy(p->name, name);
  return p;
}

暂无
暂无

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

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