请验证我对这个结构相关的事情是否正确

时间:2015-01-01 21:28:01

标签: c pointers struct malloc verify

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;
}

我在http://c.learncodethehardway.org/book/ex16.html上浏览ex16,我并不完全确定我理解这段代码。

据我所知,逐行进行,此代码执行以下操作:

  1. 声明返回Person的函数,该函数接受参数*nameageheightweight

  2. 声明一个类型为Person的指针,指向内存部分顶部的点,其大小足以容纳Person类型的结构。

  3. 查看指针并确定它是否为NULL类型。

  4. 分配内容。

  5. who指针返回main(),以便可以发生这种情况。

  6. 说实话,我不明白为什么main()可以通过who以外的名称访问此结构。指针是如何通过的?或者指针全局某种程度? 或者,我在想这个吗?

2 个答案:

答案 0 :(得分:3)

指针只是一个数字。这是一个内存地址。

假设你在一张纸上写下你家的地址,把那张纸放在信封里,然后在外面写下“谁”。然后,你把它交给别人,那个人把它放在一个不同的信封里,并在信封的外面写了一些不同的东西。

您的实际地址不会改变。你房子的内容不会改变。

这里是相同的,在C代码中。您将malloc返回的内存地址放在一个名为who的变量中(类似于我们的“信封”。)然后,您正在修改地址所指向的内存中的内容。然后,您将地址返回给可以将其放入完全不同的变量且名称完全不同的人。

答案 1 :(得分:2)

  
      
  1. 声明返回Person的函数,该函数接受参数   *姓名,年龄,身高和体重。
  2.   

该函数不返回Person。它将指针返回给Person。参数为nameageweight,而不是*name*name中的星号表示参数name是指针类型;它不是论证名称的一部分。

  
      
  1. 查看指针并确定它是否为NULL类型。
  2.   

NULL不是指针类型。指针who是指向struct person的指针。在这里,我们确定指针是否为NULL

请注意,如果没有可用内存,strdup()可以返回NULL,就像malloc()一样。代码也应该检查一下。

关于如何将指针传递给main:您将其从person_create()返回到main(),以便main()可以选择如何访问它。 main()可以执行以下操作:

/* ... */
struct Person *new_person = create_person(...);

/* Use new_person->age, etc. */

关键是,main()可以自由选择它想要给任何person_create()返回的名称。你在person_create()内的内容并不重要,因为一旦你返回,就会销毁局部变量名。