我应该使用什么: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;
}

此构造将释放您的内存并有助于防止重复释放。