2014-05-21 96 views
1

试图建立一个节点用这个结构,所以我有奇怪的问题:节点创建Ç

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

弦形部分是扔我,我想。我收到了一堆不兼容的指针类型。

- 编辑 - 回答,谢谢大家对我助人为乐

+3

语言语法违反该权证单独提到你[* *任何像样的**书上的C语言程序设计**](http://stackoverflow.com/questions/562303/the-definitive- C-书指南和列表)。 – WhozCraig

回答

4

分配行应为:

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; 
} 
1
strcpy(copy, *value); 

应该

strcpy(copy, value); 

因为strcpy需要一个字符指针作为第二个参数,源地址。

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

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


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;