MiJ*_*iJo 3 c string struct strdup
我想不出我的问题的正确标题,所以在这里.我正在尝试学习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);
........
Run Code Online (Sandbox Code Playgroud)
我的问题是Person_create功能为什么我们要复制name到新的内存位置who->name.为什么我们不能只who->name指向*name提供给函数的相同位置.
此外,如果我们直接分配的地址*name,以who->name做我们必须释放它Person_destroy.
为什么我们不能只让who-> name指向由提供给函数的*name提供的相同位置.
对我来说这who->name = strdup(name);比这更好,who->name = name;如果我知道我将修改name稍后某处指向的字符串.
所以你不妨这样做:
who->name = name;
Run Code Online (Sandbox Code Playgroud)
但是,字符串文字就像"Joe Alex"是在只读位置 - 所以如果你想做这样的事情(稍后在代码的某些部分):
who->name[3] = 'x';
Run Code Online (Sandbox Code Playgroud)
你会得到分段错误.因此,如果你想修改它,你希望堆中的malloc一些可写空间strdup可以为你做.
您可能需要查看:修改字符串文字