typedef struct node{
char *name;
//etc...
}N
如果我从stdin获得char * string并将其传递给N,我可以轻松地执行N-> name = string,或者使用strcpy会更好? 哪个更正确?哪个更有效?为什么?
答案 0 :(得分:2)
您要使用缓冲区从stdin读取输入。但是,如果不进行复制,则字符串将在下一次读取迭代时丢失。如果要分配内存,并且不知道收到的字符串的大小,则应使用strdup之类的函数,而不要使用strcpy。
node->name = strdup(string_to_copy);
if (node->name == NULL)
printf("My allocation has failed!\n");
之后必须释放分配的内存。如果分配失败,您将收到一条消息(您应始终检查内存分配是否成功)。
如果您不想分配内存,并且知道输入的大小永远不会超过100,那么您可以避免出现以下情况:
typedef struct node{
char name[100];
//etc...
}N
在这种情况下,您可以使用以下内容。请注意,strcpy是一个危险函数,应格外小心:
strncpy(node->name, buffer, 100);
strcpy(node->name, buffer);
编辑:
这是一种正确释放内存的方法:
if (node->name != NULL)
{
free(node->name);
node->name = NULL;
}
此构造将释放您的内存并有助于防止双重释放。
答案 1 :(得分:0)
回答“结果是一样的,但是有什么区别?” (来自评论)
开始于:
N *node = malloc(sizeof(N));
char input_from_stdin[80];
如果这样做
strcpy(node->name, input_from_stdin);
我们调用了未定义的行为,但它似乎可以工作。
如果我们这样做
node->name = input_from_stdin;
比node->name
仅包含其期望值,直到重用input_from_stdin
为止,这通常是在从输入中读取下一行时。
如果这样做
node->name = malloc(strlen(input_from_stdin) + 1);
strcpy(node->name, input_from_stdin);
我们复制存在的输入,直到我们释放它为止;但我们必须记得释放node->name
之前先释放node
。
我们也可以
typedef struct node{
char name[MAXSIZE];
//etc...
}N;
然后期望
strncpy(node->name, input_from_stdin, MAXSIZE-1)[MAXSIZE-1] = 0;
上班。
有些人做
strncpy(node->name, input_from_stdin, MAXSIZE);
这是有效的,但是再次将其重新发送会更敏感。现在在磁盘上的固定宽度记录中很少见到这种情况。我们不再喜欢MAXSIZE
,而是喜欢一切可拉伸的东西。