【问题标题】:Node creation C节点创建 C
【发布时间】:2014-05-21 12:09:31
【问题描述】:

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

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

我认为字符串部分让我感到震惊。我得到了一堆不兼容的指针类型。

--编辑-- 已回复,谢谢大家的帮助

【问题讨论】:

标签: c string struct


【解决方案1】:

分配行应为:

np = malloc(sizeof *np);

注意:

  1. 左侧np 之前没有星号,您不想取消对指针的引用,而是要分配给它。
  2. No cast of malloc()'s return value

那么你必须有:

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

【讨论】:

    【解决方案2】:
    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; 
    

    【讨论】:

      【解决方案3】:
      strcpy(copy, *value);
      

      应该是

      strcpy(copy, value);
      

      strcpy 函数将 char 指针作为第二个参数,即源地址。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-19
        • 2016-03-13
        • 2012-02-10
        • 1970-01-01
        相关资源
        最近更新 更多