错误:'strdup'的冲突类型!

时间:2014-02-18 10:08:21

标签: c strdup

这是“C编程语言”一书中的程序 有一个错误:'strdup'的冲突类型!当遇到函数'strdup'时。但是如果你将'strdup'改为其他名称,例如'strdu',错误就会消失。
我不知道为什么?顺便说一下,我使用code :: blocks作为我的IDE。

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

#define MAXWORD 100

struct tnode {
    char *word;           
    int count;           
    struct tnode *left;   
    struct tnode *right; 
};

struct tnode *addtree(struct tnode *, char *);
struct tnode *talloc(void);

void treeprint(struct tnode *);
int getword(char *, int);
char *strdup(char *);

/*  word frequency count */
int main()
{
    struct tnode *root;
    char word[MAXWORD];

    root = NULL;
    while (getword(word, MAXWORD) != EOF)
        if (isalpha(word[0]))
            root = addtree(root, word);
    treeprint(root);
    return 0;
}
/* addtree: add a node with w, at or below p */
struct tnode *addtree(struct tnode *p, char *w)
{
    int cond;
    if (p == NULL) {       /* a new word has arrived */
        p = talloc();      /* make a new node */
        p->word = strdup(w);
        p->count = 1;
        p->left = p->right = NULL;
    } else if ((cond = strcmp(w, p->word)) == 0)
        p->count++;        /* repeated word */
    else if (cond < 0)     /* less than into left subtree */
        p->left = addtree(p->left, w);
    else                   /* greater than into right subtree */
        p->right = addtree(p->right, w);
    return p;
};

/* treeprint: in-order print of tree p */
void treeprint(struct tnode *p)
{
    if (p != NULL) {
        treeprint(p->left);
        printf("%4d %s\n", p->count, p->word);
        treeprint(p->right);
    }
}

/* talloc: make a tnode */
struct tnode *talloc(void)
{
    return (struct tnode *) malloc(sizeof(struct tnode));
};

char *strdup(char *s)  /* make a duplicate of s */
{
    char *p;

    p = (char *) malloc(sizeof(strlen(s)) + 1);
    if (p != NULL)
        strcmp(p, s);
    return p;
}
.... some other function ....

2 个答案:

答案 0 :(得分:7)

您不能拥有自己的功能,其名称以str开头。整个“命名空间”保留在C。

在这种情况下,strdup()是来自<string.h>的标准函数,您的函数声明会与之碰撞。

请注意,仅停止使用<string.h>是不够的,名称仍然保留,因此您无法有效使用它。

进一步说明:

  1. 未写入输入,因此它应为const指针。
  2. Please don't cast the return value of malloc() in C
  3. 您的strdup()工作遭到严重破坏,当strcmp()意味着strcpy()时会调用sizeof(strlen(s))
  4. 您使用strcmp()是完全错误的,即使您修复了strcpy() / strdup()问题也会造成大量问题。
  5. 合理的char * my_strdup(const char *s) { char *r = NULL; if(s != NULL) { const size_t size = strlen(s) + 1; if((r = malloc(size)) != NULL) memcpy(r, s, size); } return r; } 实施是:

    memcpy()

    我使用{{1}},因为我知道它的长度,它可以更快。

答案 1 :(得分:2)

strdup已在string.h中定义。只需重命名你的功能。