【发布时间】:2021-12-03 13:38:07
【问题描述】:
我有一个定义如下的结构
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?
我必须重新分配空间来保存内存空间吗?
// 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 本身重新分配内存空间?正确的做法是什么?
【问题讨论】:
-
退后一步;深呼吸; 您实际上希望计算机做什么?
person->name是一个指针。这意味着它包含(即它指向)其他东西的地址。你希望它指向什么? -
无关:你可以用
person* p = malloc(sizeof *p);代替person* p = (person*) malloc(sizeof(person));- 你不需要强制转换并使用sizeof取消引用的指针使它更清晰一些(在许多人看来)。 -
您不需要一次为字符串重新分配一个字符的空间。只需 malloc 字符串的长度加 1:
p->name = malloc(strlen(personName) + 1);strcpy(p->name, personName);。 (注1:sizeof(char)定义为1,所以上面的(strlen(personName) + 1)不需要乘以sizeof(char)。注2:不需要将malloc()的返回值类型转换为另一个指针类型。 ) 一些库实现有一个strdup()函数(不是 C17 标准的一部分)来完成上述工作:p->name = strdup(personName);。 -
我建议使用
strdup()。
标签: c struct dynamic-memory-allocation