练习16中的这个片段是什么;“艰苦学习C”;意思是

练习16中的这个片段是什么;“艰苦学习C”;意思是,c,C,我正在从中学习C语言。以下是博客中的一些代码: 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->h

我正在从中学习C语言。以下是博客中的一些代码:

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;
}
我有以下疑问:

  • Person_是否创建此函数的名称?函数名怎么可能是指针?这意味着什么
  • 为什么strdup(stringduplicate)只用于名称,而不用于身高、年龄等其他字段
Person\u create()
是一个函数,返回
struct Person*
(指向
Person
结构的指针)。它也可以写成以下形式:
struct Person*Person\u create()
struct Person*Person\u create()

strdup()
仅用于
name
变量,因为
name
Person
结构中唯一的字符串(
char*
/
char
array in C)变量

那么,为什么需要在
char*
上使用
strdup()
,而不必对
int
等类型使用类似的函数呢?
这是因为在C中,您按值传递,这意味着您将传递
整数
(您可以使用
=
)的值和
字符*
的值。
*char
指针指向内存中相同的位置,以
\0
结尾(C中字符串的符号/
char
数组终止)。因此,您必须使用单独的函数来复制传递给函数时
char*name
指向的位置与
\0
(与
\0
一起)之间的所有字符。

Person\u create
是一个函数。它也可以写为
struct Person*Person\u create
,语法相同。是将空格放在类型旁边还是名称旁边,这是一个与C语言一样古老的争论,我拒绝参与其中

正如您可能已经注意到的,名称字符串是一个指针。当你只需要
who->name=name您不会复制字符串。您只需将指针复制到字符串。结果将是有两个指针指向同一个字符串。为什么这是一个问题?假设您对其中一个结构中的名称进行了一些更改。这样,更改也会影响另一个结构。这可能不是你的意图


这就是为什么需要
strdup()
。它代表“字符串复制”。它创建一个字符串的副本,并返回一个指向新创建字符串的指针,然后可以独立于原始字符串进行处理。

因为很明显,函数声明可以用以下方式编写

struct Person * Person_create(char *name, int age, int height, int weight);
即函数名为
Person\u create
,函数返回类型为
struct Person*
的对象。正如您在其定义中所看到的,该函数返回定义为的
who

struct Person *who = malloc(sizeof(struct Person));
您甚至可以编写函数声明,例如

struct Person * ( Person_create(char *name, int age, int height, int weight) );
例如,请考虑以下所有声明都是等效的

int *p;
int* p;
int * p;
至于你的第二个问题,那么数据成员
name
的声明如下

char *name;
您需要对
name
指向的所有内存进行加密,以便将参数
name
指向的字符串存储在此内存中。函数
strdup
做两件事。它分配所需的内存,并将参数指向的字符串复制到分配的内存,并返回指向该内存的指针


对于结构的其他数据成员,它们不是指针。它们是对象(虽然指针也是对象,但它指向必须存储在某处的其他对象)。因此,您不需要分配内存来在这些对象中存储数据。这些数据成员的内存将在创建结构实例时分配。

也可以将其写入语法相同的
struct Person*Person\u create
。是将空格放在类型旁边还是名称旁边是一个几十年前的争论。顺便说一句,如果
malloc
返回了
NULL
,也应该在非调试版本中进行检查(也就是说,它不应该通过断言来完成)。strdup是一种防御性编程方法,因为我们在这里使用的是可变长度字符串,不是字符串文字。