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

时间:2014-12-22 08:58:11

标签: 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);

    ........

我的问题出在Person_create函数中,为什么我们要将name复制到who->name的新内存位置。为什么我们不能让who->name指向提供给该功能的*name提供的相同位置。
另外,如果我们直接将*name的地址分配给who->name,我们必须在Person_destroy中将其释放。

2 个答案:

答案 0 :(得分:6)

  

为什么我们不能让who-> name指向由提供给函数的* name提供的相同位置。

对我而言,who->name = strdup(name);who->name = name;更好,如果我知道我将在某处稍后修改name指向的字符串。

所以你不妨这样做:

who->name = name;

然而,像"Joe Alex"这样的字符串文字位于只读位置 - 所以如果你想做这样的事情(稍后代码的某些部分):

who->name[3] = 'x';

你会得到分段错误。因此,如果您想要修改它,您希望mallocstrdup为您做的堆中的{em>可写空间。

您可能需要查看:Modifying String Literal

答案 1 :(得分:-2)

char数组*name不是已分配的数组,这意味着如果离开函数作用域,此数组将不再可用。因此,教程会复制它,以便稍后对此变量进行操作。 此外,如果您直接将变量*name分配给who->name,则不得释放它,因为它不是由malloc返回的。