取消引用char *时,获取“赋值使得整数没有强制转换的指针”警告

时间:2017-06-30 21:32:20

标签: c

我有这个节点:

struct Node {
    char *name;
};

这是我的添加功能:

void add(char **names) {
        struct Node *ch = create(names[0]);
}

这是我的创建功能:

struct Node *create(const char *name) {
        char *c_pt = malloc(sizeof(char) * strlen(name));
        *c_pt = name;
        struct Node ch;
        ch.name = *c_pt;
        struct Node *ch_ptr = &ch;
        return ch_ptr;
}

但是当我这样做时,我会收到警告assignment makes pointer from integer without a cast(指向*c_pt = name;行和ch.name = *c_pt;)。我最初只使用char *name而不是const char *name,但在创建多个节点时,所有节点的名称最终都是最后创建的节点的名称。

2 个答案:

答案 0 :(得分:3)

  1. 字符串分配的内存不足。

    malloc(sizeof(char) * strlen(name));  // bad
    
  2. 指针已复制,而不是字符串。这也导致“赋值使得指针来自没有强制转换的整数”。 name是指针,*c_ptchar。无论如何,不​​是复制字符串的正确方法。

    *c_pt = name; // bad
    
  3. 函数返回指向局部变量的指针

    struct Node ch;
    ...
    struct Node *ch_ptr = &ch;
    return ch_ptr; // bad
    
  4. struct Node字符串

    分配内存
    struct Node *n = malloc(sizeof *n);
    size_t sz = strlen(name) + 1;
    char *s = malloc(sz);
    if (n==0 || s==0) {
      free(n);
      free(s);
      return NULL; // failure indication
    }
    

    复制数据

    memcpy(s, name, sz);  // or strcpy(s, name).  I find memcpy faster for long strings
    n->name = s;
    

    返回节点pinter

    return n;    
    

答案 1 :(得分:1)

我认为失败的行就是这个

*c_pt = name;

名称的类型为const char *,* c_pt的类型为char。你不能分配给另一个。我想你正试图将传入的字符串复制到某个东西。但是然后你让一个本地节点对象为它分配东西,然后返回它;你不能这样做(节点ch将在函数结束时消失)。我认为你需要这样的东西

struct Node *create(const char *name) {
        struct Node *n = malloc(sizeof(struct Node));
        n->name = strdup(name);
          return n;
}

那些非posix系统。

n->name = malloc(strlen(name) + 1);
strcpy(n->name, name);

关于检查mallocs返回值的常见警告