节点创建C

节点创建C,c,string,struct,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*)mall

因此,我在尝试使用此结构创建节点时遇到了奇怪的问题:

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 ;
}
我想弦的部分把我甩了。我得到了一堆无与伦比的指针类型

--编辑--
回答:谢谢大家对我的帮助

分配行应为:

np = malloc(sizeof *np);
注:

  • 在左手边的
    np
    前面没有星号,您不想取消引用指针,而是想分配给它
  • 那么你必须有:

    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;
    }
    

    分配行应为:

    np = malloc(sizeof *np);
    
    注:

  • 在左手边的
    np
    前面没有星号,您不想取消引用指针,而是想分配给它
  • 那么你必须有:

    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;
    }
    
    应该是

    strcpy(copy, value);
    
    strcpy
    函数将char指针作为第二个参数,即源地址

    struct node *make_node(char *value) {
    
    np->value = copy;
    np->count = 1;
    
    应该是

    strcpy(copy, value);
    
    strcpy
    函数将char指针作为第二个参数,即源地址

    struct node *make_node(char *value) {
    
    np->value = copy;
    np->count = 1;
    
    您的函数不修改
    ,因此声明它
    常量
    是一个好习惯

    struct node *make_node(char const *value) {
    

    不要在赋值时取消引用指针。同样,在C语言中使用malloc也是无用的,并且可以隐藏bug

    np = malloc(sizeof(*np));
    
    请注意,强烈建议您检查
    malloc
    NULL
    结果。内存分配可能会失败


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

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

    strcpy
    采用
    (char*,char const*)
    而不是
    (char*,char)


    同样,取消引用不是您想要的。仅分配指针值(地址)


    您可能是指这里的
    NULL

    np->next = NULL; 
    
    您的函数不修改
    ,因此声明它
    常量
    是一个好习惯

    struct node *make_node(char const *value) {
    

    不要在赋值时取消引用指针。同样,在C语言中使用malloc也是无用的,并且可以隐藏bug

    np = malloc(sizeof(*np));
    
    请注意,强烈建议您检查
    malloc
    NULL
    结果。内存分配可能会失败


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

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

    strcpy
    采用
    (char*,char const*)
    而不是
    (char*,char)


    同样,取消引用不是您想要的。仅分配指针值(地址)


    你在这里的意思可能是
    NULL

    np->next = NULL; 
    

    仅此中的语言语法冲突就保证引用您。仅此中的语言语法冲突就保证引用您。