gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:51:18 25 4
gpt4 key购买 nike

每次我尝试将字符串插入程序中的二叉树时,我都必须使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com