C - strcpy 有什么特殊属性吗?

标签 c binary-tree strcpy

每次我尝试将字符串插入程序中的二叉树时,我都必须使用 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 的末尾设置为空字节,但失败了。

最佳答案

当你这样做时:

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

您首先为字符串分配一些存储空间,这很好,但是在第二行中,您将指向该存储空间的指针替换为指向字符串文字的指针。然后,原始分配已“丢失”(导致内存泄漏),如果您尝试修改 originalString 的内容,您将得到未定义的行为,因为您现在指向的是最重要的内容。可能是只读存储器。如果您随后尝试释放此字符串(因为它不是通过malloc分配的),您也会得到未定义的行为。

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

<小时/> 关于编码风格的一些附加说明:

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

originalstring = calloc(alloc + 1, 1);

关于C - strcpy 有什么特殊属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33185643/

相关文章:

c - K&R Exercise Squeeze 函数

algorithm - 平衡二叉树访问

algorithm - 二叉搜索树 (BST) 的最大子树

c - malloc 和 strcpy 交互

c - 信号处理程序的问题

c - 可以使用什么代替#pragma comment(lib, "Ws2_32.lib")?

c++ - PSTR如何接收多个不以逗号分隔的字符串?

algorithm - 了解 Small Parsimony,Sankoff 算法

c - strcpy 函数无法正常工作

c - 根据命令行参数将字符串合并在一起。