【发布时间】:2014-11-01 09:03:52
【问题描述】:
在The C Programming Language by KNR - 第 2 版,第 6.5 节中,他们定义了一个函数 strdup,因此:
char *strdup(char *s)
{
char *p;
p = (char *) malloc(strlen(s) + 1) /* +1 for the '\0' */
if (p != NULL)
strcpy(p, s);
return p;
}
用法是将字符串复制到结构tnode的成员上,如下定义:
struct tnode {
char *word;
int count;
struct tnode *left;
struct tnode *right;
};
这样称呼:
struct tnode *addtree(struct tnode *p, char *w)
{
...
p->word = strdup(w);
...
}
为什么我们不能改用这样的东西?
strcpy(p->word, w);
【问题讨论】:
-
您需要先完成 strdup 函数在某处执行的 malloc(),然后才能将 strcpy 用于字符指针变量。 word 必须指向有效的内存。当第一次实例化它时,它可能指向任何地方。
-
你认为这是在哪里复制到? “将字符串复制到结构的成员上”——不,这不是它正在做的事情......那个成员是一个指针,而不是一个数组。
-
@Scooter 本质上,我想知道通过 malloc() 显式分配背后的原因。我的印象是指针参数的声明也会为相关数据类型分配内存。
-
@Jim Balter - 嗯...这只是一种说法,请记住最终结果...成员最终指向的字符串。
-
@captainsomewhere 不,指针的声明不会为其指向的内存进行任何隐式分配。程序员必须明确地做到这一点。