C - strcpy 是否有任何特殊属性?

C - Does strcpy have any special properties to it?

每次我试图在程序中将字符串插入二叉树时,我都必须使用 strcpy 并使用 strcpy 的目标才能成功插入。如果我不使用 strcpy 而只使用源代码,它会使程序崩溃。

示例:

char *originalstring;
originalstring = (char *)calloc(alloc + 1, sizeof(char));
originalstring = "Hello.";
insert(&root, originalstring); //into binary tree

导致崩溃。

char *newstring, *originalstring;

originalstring = (char *)calloc(alloc + 1, sizeof(char));
originalstring = "Hello.";

newstring = (char *)calloc(alloc + 1, sizeof(char));
strcpy(newstring, originalstring);

insert(&root, newstring);

将其插入到树中。我的完整程序当然比这大得多,但我真的不认为这与我被迫使用 strcpy 插入字符串有任何关系。这让我问 strcpy 是否有特殊的东西。

编辑:我也曾尝试在 originalstring 的末尾手动设置 nullbyte,但失败了。

当你这样做时:

originalstring = (char *)calloc(alloc + 1, sizeof(char));
originalstring = "Hello.";

您首先为字符串分配了一些存储空间,这很好,但是在第二行中您将指向该存储空间的指针替换为指向字符串文字的指针。原来的分配是 "lost" (导致内存泄漏),如果你试图修改 originalString 的内容,你会得到未定义的行为,因为你现在指向的是最有可能的只读存储器。如果您随后尝试 free 这个字符串(因为它不是通过 malloc 分配的),您也会得到未定义的行为。

所以,底线:始终使用 strcpy 来复制字符串 - 仅在操作指向字符串的指针时使用直接赋值 (=)。


关于编码风格的一些附加说明:

  • never cast the result of malloc in C - 这是不必要的并且有潜在危险
  • sizeof(char) 总是等于 1,根据定义

所以上面的分配实际上应该写成:

originalstring = calloc(alloc + 1, 1);

将字符串文字 "Hello." 分配给指针 originalstring 导致指针指向该字符串文字,放弃分配的 memory.this 会导致崩溃,以防您尝试释放此指针或修改字符串文字。