为什么他们在K& R 6.5节中使用了功能限制?

时间:2014-11-01 09:03:52

标签: c kernighan-and-ritchie

C编程语言中,通过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);

2 个答案:

答案 0 :(得分:3)

首先,您需要为p->word分配内存,然后您可以使用strcpy(p->word, w);,因为wordchar指针,之前没有为其分配内存。

因此,如果您在不分配内存的情况下致电strcpy(p->word, w);,则会导致Undefined behavior.

答案 1 :(得分:3)

如果使用"类似"

strcpy(p->word, w);

然后程序将具有未定义的行为,因为1)p-> word未初始化并且具有任何未指定的值; 2)此语句试图写入未分配的内存。

如果您要分配内存并使用内存的有效地址初始化p->字,然后使用"类似"

strcpy(p->word, w);

然后事实上你会自己编写strdup的相同实现。