节点创建C.

时间:2014-05-21 12:09:32

标签: c string struct

所以我在尝试用这个结构创建节点时遇到了奇怪的问题:

struct node {
    char *value ;
    unsigned int count ;
    struct node *next ;
} ;

这就是我所拥有的

struct node *make_node(char *value) {
    struct node *np = NULL;
    *np = (*np)malloc(sizeof(*np));
    char* copy = (char*)malloc(sizeof(strlen(value)+1));
    strcpy(copy, *value);
    *np -> *value = copy;
    *np -> count = 1;
    *np -> next = null; 
    return np ;
}

字符串部分是我想的。我得到了一堆无法比较的指针类型。

- EDIT-- 回答,谢谢大家的帮助

3 个答案:

答案 0 :(得分:4)

分配行应为:

np = malloc(sizeof *np);

注意:

  1. 左侧np之前没有星号,您不想取消引用指针,您想要指定它。
  2. No cast of malloc()'s return value
  3. 然后你必须:

    np->value = copy;
    

    请注意a->b(对于struct指针a)表示(*a).b

    最后,拼写为NULL

    假设您有strdup(),您的功能可以这样写:

    struct node * make_node(const char *value) {
        struct node *np = malloc(sizeof *np);
        if(np != NULL)
        {
            np->value = strdup(value);
            if(np->value != NULL)
            {
                np->count = 1;
                np->next = NULL;
                return np;
            }
            free(np);
        }
        return NULL;
    }
    

答案 1 :(得分:3)

struct node *make_node(char *value) {

您的功能不会修改value,因此宣布const是一个好习惯。

struct node *make_node(char const *value) {

*np = (*np)malloc(sizeof(*np));

不要在指派时取消引用指针。另外,在C中投射malloc是没用的,可以隐藏错误。

np = malloc(sizeof(*np));

请注意,强烈建议您检查malloc NULL的结果。内存分配可能会失败。


char* copy = (char*)malloc(sizeof(strlen(value)+1));

您正在strlen(value)+1正确计算字符串的大小,但之后sizeof不正确。它只返回int的大小。

char* copy = malloc(strlen(value)+1);

strcpy(copy, *value);

strcpy需要(char *, char const *)而不是(char *, char)

strcpy(copy, value);

*np -> *value = copy;
*np -> count = 1;

同样,解除引用不是你想要的。仅指定指针值(地址)。

np->value = copy;
np->count = 1;

*np -> next = null; 

这可能意味着NULL

np->next = NULL; 

答案 2 :(得分:1)

strcpy(copy, *value);

应该是

strcpy(copy, value);

strcpy函数将char指针作为第二个参数source source。