我应该使用什么:strcpy 或指针?
What i should use: strcpy or pointers?
typedef struct node{
char *name;
//etc...
}N
如果我有 char *string 从 stdin 得到并且我想把它传递给 N,我可以很容易地做 N->name=string,或者使用 strcpy 会更好? 哪个更正确?哪个更有效率?为什么?
正在回答 "the result is the same, but what's the difference?"(来自评论)
开始于:
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
.
node->name
我们也可以
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
,更喜欢有弹性的东西。
您想使用缓冲区从标准输入读取您的输入。但是,如果您不进行复制,您的字符串将在下一次读取迭代中丢失。如果要分配内存,并且不知道接收到的字符串的大小,则应使用 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;
}
此构造将释放您的内存并有助于防止重复释放。