我有这个节点:
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
,但在创建多个节点时,所有节点的名称最终都是最后创建的节点的名称。
答案 0 :(得分:3)
为字符串分配的内存不足。
malloc(sizeof(char) * strlen(name)); // bad
指针已复制,而不是字符串。这也导致“赋值使得指针来自没有强制转换的整数”。 name
是指针,*c_pt
是char
。无论如何,不是复制字符串的正确方法。
*c_pt = name; // bad
函数返回指向局部变量的指针
struct Node ch;
...
struct Node *ch_ptr = &ch;
return ch_ptr; // bad
为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返回值的常见警告