В Язык программирования C по KNR - 2-е издание, раздел 6.5 они определили функцию strdup
таким образом:Почему они использовали функцию strdup в разделе 6.5 и?
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);
Вы должны сделать malloc(), что функция strdup делает где-то прежде, чем вы сможете использовать strcpy в переменной указателя символа. слово должно указывать на действительную память. При первом экземпляре это может указывать куда угодно. – Scooter
Как вы думаете, что копирует * в *? «скопируйте строку в член структуры» - нет, это не то, что она делает ... этот член - это указатель, а не массив. –
@Scooter По сути, я хотел знать причину явного распределения через malloc(). Я был (я) под впечатлением, что объявление параметра указателя также выделяет память для соответствующего типа данных. – Sohail