我想不出我的问题的正确标题,所以在这里。我正在尝试学习C,以下代码来自我正在学习的教程。
struct Person {
char *name;
int age;
int height;
int weight;
};
struct Person *Person_create(char *name, int age, int height, int weight){
struct Person *who = malloc(sizeof(struct Person));
assert(who != NULL);
who->name = strdup(name);
who->age = age;
who->height = height;
who->weight = weight;
return who;
}
void Person_destroy(struct Person *who){
assert(who != NULL);
free(who->name);
free(who);
}
int main(int argc, char *argv[]){
struct Person *joe = Person_create("Joe Alex", 32, 64, 140);
........
我的问题出在Person_create
函数中,为什么我们要将name
复制到who->name
的新内存位置。为什么我们不能让who->name
指向提供给该功能的*name
提供的相同位置。
另外,如果我们直接将*name
的地址分配给who->name
,我们必须在Person_destroy
中将其释放。
答案 0 :(得分:6)
为什么我们不能让who-> name指向由提供给函数的* name提供的相同位置。
对我而言,who->name = strdup(name);
比who->name = name;
更好,如果我知道我将在某处稍后修改name
指向的字符串。
所以你不妨这样做:
who->name = name;
然而,像"Joe Alex"
这样的字符串文字位于只读位置 - 所以如果你想做这样的事情(稍后代码的某些部分):
who->name[3] = 'x';
你会得到分段错误。因此,如果您想要修改它,您希望malloc
从strdup
为您做的堆中的{em>可写空间。
您可能需要查看:Modifying String Literal
答案 1 :(得分:-2)
char数组*name
不是已分配的数组,这意味着如果离开函数作用域,此数组将不再可用。因此,教程会复制它,以便稍后对此变量进行操作。
此外,如果您直接将变量*name
分配给who->name
,则不得释放它,因为它不是由malloc返回的。