复制传递给函数的字符串作为C中的参数

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.

Sad*_*que 6

为什么我们不能只让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可以为你做.

您可能需要查看:修改字符串文字