3

我想不出我的问题的正确标题,所以就这样吧。我正在尝试学习 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提供给函数的相同位置。
此外,如果我们直接分配了*nameto who->namedo 的地址,我们必须将其释放到Person_destroy.

4

2 回答 2

6

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

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

所以你不妨这样做:

who->name = name;

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

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

你会得到分段错误。因此,如果您想修改它,您希望从堆中获得malloc一些对您有用的可写strdup空间。

您可能想看看:修改字符串文字

于 2014-12-22T09:02:28.150 回答
-2

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

于 2014-12-22T09:04:46.467 回答